一、项目简介
本项目基于STEP Pico实现交通灯控制器,实现常态下红、绿、黄三色转换,并通过查询机制实现红灯状态下行人可主动延长红灯时间。
在未按下控制器时,交通灯按照“红—绿—黄”的顺序自动切换运行,每种交通灯的持续时间将会在屏幕上进行显示,考虑到实际情况下当交通灯处于绿灯或者黄灯时,道路状态并不允许行人通行,因此仅设置了红灯时的控制器:当交通灯处于红灯时,行人按下控制器,通过蜂鸣器发出警报,同时重置红灯倒计时。
二、程序流程图
本项目采用MicroPython语言进行编写,所使用的编辑器是Thonny 4.0.1,程序执行流程如图所示。
三、硬件介绍
本项目所使用的硬件包括树莓派Pico扩展板,硬禾版本树莓派Pico核心模块 – STEP Pico,Type – C数据线,一台搭载Windows 10 x64系统的电脑。
其中,树莓派Pico扩展板中所用到的部件有2个按键输入k1、k2,3个单色LED – R、G、Y,12个WS2812B RGB三色灯,1个128*64 OLED显示屏,1个蜂鸣器。
下图是所用硬件功能与芯片管脚映射表。
四、功能介绍及图片展示
1、红绿灯三色循环
启动程序后,在未按下任何按键时,会以“红 – 绿 – 黄”的顺序进行循环亮灯,持续时间分别为6秒,4秒,2秒,OLED屏幕上会显示倒计时。
2、红灯时按下k1重置倒计时
当前处于红灯状态时,按下k1,将会发出警报,并重置红灯倒计时。
3、按下k2时结束程序运行
在程序运行时,按下k2,将会在本轮执行结束后终止执行,关闭所有灯光,清空显示屏,结束程序运行。
五、代码说明
本项目所使用的库函数包括:管脚映射库board,按钮定义库button,RGB设置库ws2812b, OLED显示屏设置库oled、ssd1306,用于显示屏输出库writer以及相关字体库freesans20。
主要代码片段及说明:
pwm = PWM(Pin(pin_cfg.buzzer)) #蜂鸣器实例化
#蜂鸣器设置
def pitch(frequency, duration=0):
pwm.freq(frequency)
pwm.duty_u16(3000)
time.sleep_ms(duration)
wri = Writer ( oled , freesans20 ) #写入操作实例化
#LED实例化
g = Pin ( pin_cfg.green_led , Pin.OUT )
y = Pin ( pin_cfg.yellow_led , Pin.OUT )
r = Pin ( pin_cfg.red_led , Pin.OUT )
#实例初始化
oled.fill ( 0 )
oled.show ( )
r.off ( )
g.off ( )
y.off ( )
#RGB初始化
for i in range(1, 13):
ws2812b.off(i,"#000000")
#倒计时及OLED显示
def oled_wait ( t ) :
i = 0
while i < t :
#清除当前显示内容
oled.fill ( 0 )
oled.show ( )
#显示当前倒计时
wri.set_textpos ( oled , 0 , 0 )
j = t - i
wri.printstring ( str ( j ) )
oled.show ( )
time.sleep ( 1 )
i = i + 1
#红灯时执行
def red ( r ) :
r.on ( )
for i in range(1, 13):
ws2812b.on(i, "#ff0000")
rt = 0
while rt < 6 :
if k1.value ( ) == True : #检测是否按下k1
rt = 0 #重置倒计时
for freq in range(880, 1760, 16):
pitch(freq, 6)
for freq in range(1760, 880, -16):
pitch(freq, 6)
pwm.deinit()
oled.fill ( 0 )
oled.show ( )
wri.set_textpos ( oled , 0 , 0 )
j = 6 - rt
wri.printstring ( str ( j ) )
oled.show ( )
time.sleep ( 1 )
rt = rt + 1
r.off ( )
#绿灯或黄灯时执行
def green ( g ) :
g.on ( )
for i in range(1, 13):
ws2812b.on(i, "#00ff00")
oled_wait ( 4 )
g.off ( )
def yellow ( y ) :
y.on ( )
for i in range(1, 13):
ws2812b.on(i, "#ffff00")
oled_wait ( 2 )
y.off ( )
#结束执行,清空OLED显示屏,关闭灯光
r.off ( )
g.off ( )
y.off ( )
for i in range(1, 13):
ws2812b.off(i,"#000000")
oled.fill ( 0 )
oled.show ( )
wri.set_textpos ( oled , 0 , 0 )
wri.printstring ( "Bye Bye!" )
oled.show ( )
time.sleep ( 1 )
oled.fill ( 0 )
oled.show ( )
六、主要难题与解决方法
在本项目的推进过程中,我遇到了以下难题:
1、在下载好项目所需环境后,在进行烧录之后,电脑依然无法检测到树莓派,无法使用Thonny进行开发。
解决方法:
在大量查找相关问题与教程后,发现是官网提供的“rp2-pico-20230209-unstable-v1.19.1-859-g41ed01f13.uf2”文件无法正常工作,改用来自网络的“rp2-pico-20220618-v1.19.1”文件烧录成功后正常连接树莓派。
2、在进行项目开发时,由于编写的程序不够合理,导致程序陷入死循环,即使按下“ctrl + c”以中断程序或者树莓派上的“run”键给树莓派重新供电都不能正常工作。
解决方法:
查找相关教程后,发现此种情况难以避免,使用在官网下载的“flash_nuke.uf2”文件重置树莓派闪存后,再次使用“rp2-pico-20220618-v1.19.1”文件烧录,重新开始项目的开发。
3、在进行OLED显示屏的倒计时显示时,只使用OLED库显示的字符过小,很难看清。
解决方法:
在电子森林网站所提供的MicroPython编程教程的第二十五节课程中,提供了成熟的writer库以及配套的字体库freesans20,能显示大小合适且清晰的字符,不过要注意在显示新的字符时需要自行清空之前的字符,否则会向后顺延,且不会自动换行,可能超出OLED显示屏边界。
4、在开放过程中,经常出现树莓派pico在写入文件时无响应,多次尝试寻找原因后发现是Thonny自带的写入文件经常出错导致写入超时。
解决方法:
卸载Thonny 4.0.2,在GitHub上下载Thonny 4.0.1版本,之后未再出现类似问题。
七、项目心得
本项目是我第一次接触树莓派,受益于有一定的Python基础,在程序的编写上我进行的比较顺利,但在与硬件结合时出现了非常多的问题,其中大部分都集中在如何使树莓派正常工作,在网络上查找相关教程与解决办法花费了大量时间。但最终克服了一系列困难之后,我还是成功的完成了项目,这一段发现问题、解决问题的过程让我受益匪浅。