基于STEP Pico的嵌入式系统学习平台制作一个交通灯控制器
制作一个交通灯控制器来仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
标签
嵌入式系统
2023寒假在家练
STEP Pico
Dula
更新2023-03-29
北京理工大学
531

项目介绍:

制作一个交通灯控制器

具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能

实现方式:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换

硬件介绍:

STEP Pico是一款低成本、高性能的微控制器开发板,具有灵活数字接口。(完全兼容Raspberry Pi Pico)硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。

板卡介绍:

【基于树莓派Pico的嵌入式系统学习平台】专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。其包括2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)。

环境配置:

1、thonny:
作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者,安装的教程网上比较多,只需要一个简单的下载安装过程就可以学习编程。

2、硬禾学堂树莓派pico平台:
 硬禾学堂为“寒期一起练”制作了一个平台,这平台正是我视频中演示用到的板子,它的原理图如下,具体可以参考https://www.eetree.cn/project/detail/584

核心板引脚图:

FtVqQwUcNDULc8QC_SVoaMLZPp5N

电路图:

FmI0jomHq31KiQsRxhdsNTHovXCn

设计思路:

使用ws2812b模拟交通灯,其一圈十二个灯,效果要优于led灯,然后分别定义红、黄、绿三种颜色的灯。主程序为红、黄、绿三种颜色的灯依次循环,当没有按键按下时,首先绿灯亮起15秒,然后黄灯闪烁,接下来红灯亮起20秒,然后黄灯再次闪烁,以此为一个周期,并依次不断循环。当有按键按下时,oled屏幕上会出现‘’remind‘’信息提示,使用按键中断的方式来实现路口有行人经过时,下一次循环时绿灯时间增加10s,同时使用按键返回函数在oled屏幕上显示’Pedestrian pass‘’信息,起到提示车辆此时有行人通过的效果。

程序实现:

程序均使用micropython编写

下载bsp库中的board.py、board.py、button.py、led.py、oled.py、ssd1306.py、ws2812b.py函数。

初始化配置:

from button import button
from board import pin_cfg
from led import r,g,b,y
from machine import PWM,Pin
from oled import oled
import time
import ws2812b

i = 0

使用ws2812b来模拟交通灯,并定义红、黄、绿三种不同颜色的交通灯:

def red_light():
    ws2812b.on_all("#FF0000")
def yellow_light():
    ws2812b.on_all("#FFFF00")
def green_light():
    ws2812b.on_all("#00FF00")

使用按键中断的方式来实现当路口有行人经过时,按下按钮,通过按键返回函数在oled屏幕上显示‘’remind‘’字样,提醒接下来会有行人通过,并且下一次循环时绿灯时间增加10秒,以便行人顺利通过,此时oled屏幕上有‘’Pedestrian pass‘’字样显示。

FjsRvBZGFa3c7GrO1RYVU6FR8n9R

Fu9AMarJS0biu8Y0jHEZPOhj36OV

def k1_callback(pin):
    global i
    i = 1
    oled.text("Remind",0,10)
    oled.show()
    

k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)


while True:
    if i == 1:
        green_light()
        oled.text("Pedestrian pass",0,10)
        oled.show()
        time.sleep(10)
        i = 0

当无按键按下时,通过for循环,实现红、黄、绿三灯依次循环,首先绿灯亮起15秒,然后黄灯闪烁,接下来红灯亮起20秒,然后黄灯闪烁,以此为一个周期并依次不断循环,直到有按键按下时跳出循环。

else:
        green_light()
        time.sleep(15)
        for j in range(3):
            ws2812b.on_all("#FFFF00")
            time.sleep(0.5)
            ws2812b.off_all()
            time.sleep(0.5)
        red_light()
        time.sleep(20)
        for j in range(3):
            ws2812b.on_all("#FFFF00")
            time.sleep(0.5)
            ws2812b.off_all()
            time.sleep(0.5)
        oled.fill(0)
        oled.show()

流程图:

FvFzaCvkUYaoRCz0TFdRFx76PuEY

首先对程序进行初始化,当没有读取到按键信号时,红、黄、绿三灯依次循环,当读取到按键信号时,通过按键返回函数在oled屏幕上作出‘’remind‘’提示,并且下一次绿灯的时间增加并在oled屏幕上有‘’Pedestrian pass‘’显示,以便行人通过,之后仍保持红、黄、绿三灯循环亮起。

未来的计划或建议:

该项目已经完成了交通信号灯的模拟,并且在按键按下时可以增加下一次循环时绿灯的时间,且同时在oled屏幕上有所显示,但仍有改进空间,例如可以在oled屏幕上显示当前亮着的灯的剩余时间、在红灯亮起时在oled屏幕上显示汽车图样、在绿灯亮起时在oled屏幕上显示行人图样、在按下按钮后,当行人通过时伴随蜂鸣器响起,起到提醒效果等。

附件下载
代码文件.rar
代码文件
团队介绍
肖彭予-北京理工大学电子信息专业
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号