基于STEP Pico实现交通灯控制器
本项目基于STEP Pico实现交通灯控制器,实现常态下红、绿、黄三色转换,并通过查询机制实现红灯状态下行人可主动延长红灯时间。
标签
嵌入式系统
显示
2023寒假在家练
STEP Pico
交通灯控制器
郭子宸
更新2023-03-29
北京理工大学
818

一、项目简介

本项目基于STEP Pico实现交通灯控制器,实现常态下红、绿、黄三色转换,并通过查询机制实现红灯状态下行人可主动延长红灯时间。

在未按下控制器时,交通灯按照“红—绿—黄”的顺序自动切换运行,每种交通灯的持续时间将会在屏幕上进行显示,考虑到实际情况下当交通灯处于绿灯或者黄灯时,道路状态并不允许行人通行,因此仅设置了红灯时的控制器:当交通灯处于红灯时,行人按下控制器,通过蜂鸣器发出警报,同时重置红灯倒计时。

二、程序流程图

本项目采用MicroPython语言进行编写,所使用的编辑器是Thonny 4.0.1,程序执行流程如图所示。

8DxTM86zr+UwgAAAAASUVORK5CYII=

三、硬件介绍

本项目所使用的硬件包括树莓派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个蜂鸣器。

下图是所用硬件功能与芯片管脚映射表。

Fine2TE6eh2jfN4GfBcV4LT0C1vS

四、功能介绍及图片展示

1、红绿灯三色循环

启动程序后,在未按下任何按键时,会以“红 – 绿 – 黄”的顺序进行循环亮灯,持续时间分别为6秒,4秒,2秒,OLED屏幕上会显示倒计时。

Z2Q==9k=

2、红灯时按下k1重置倒计时

当前处于红灯状态时,按下k1,将会发出警报,并重置红灯倒计时。

2Q==2Q==

3、按下k2时结束程序运行

在程序运行时,按下k2,将会在本轮执行结束后终止执行,关闭所有灯光,清空显示屏,结束程序运行。

2Q==

五、代码说明

本项目所使用的库函数包括:管脚映射库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基础,在程序的编写上我进行的比较顺利,但在与硬件结合时出现了非常多的问题,其中大部分都集中在如何使树莓派正常工作,在网络上查找相关教程与解决办法花费了大量时间。但最终克服了一系列困难之后,我还是成功的完成了项目,这一段发现问题、解决问题的过程让我受益匪浅。

附件下载
郭子宸-基于STEP Pico的交通灯控制器.zip
代码压缩包
团队介绍
郭子宸,北京理工大学
团队成员
郭子宸
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号