项目描述:
制作一个交通灯控制器。
具体要求:
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
实现方式:
利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个LED灯的所在状态,并根据按键的输入(中断或查询机制)调整交通灯的切换,以实现不同的特殊情况的模拟仿真。
设计思路:
正常情况下主程序执行红、黄、绿三色交通信号灯之间的转换工作,当有行人需要通行,或者需要停机检修时,利用树莓派Pico扩展板上的k1、k2按键进行模拟,根据按键的输入(中断或查询机制)调整交通灯的切换。
简单的硬件介绍:
STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex MO+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板。它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Cortex M0 +处理器,嵌入式264KB SRAM和2MB板载闪存以及26个多功能GPIO引脚。树莓派Pico/RP2040的基本特性板上通过MicroUSB供电,能过够给扩展板提供3.3V的直流电压26根IO用于扩展,支持SPI、I2C、PWM、PIO板上一颗单色LED可用于基本的测试40Pin 邮票孔、双列直插孔的方式连接扩展板、面包板
对于软件开发上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。在 RASPBERRY PI PICO 开发板 基础测试[1] 给出了对PI Pico开发板的基本设置,通过 安装Thonny开发环境[2] 可以方便对Pi Pico进行初步的开发。
树莓派Pico扩展板板卡包含的硬件有:2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)。双核 Arm Cortex-M0 + @ 133MHz、2 个 UART、2 个 SPI 控制器和 2 个 I2C 控制器、芯片内置 264KB SRAM 和 2MB 的板载闪存、16 个 PWM 通道、通过专用、QSPI 总线支持最高 16MB 的片外闪存、USB 1.1 主机和设备支持、DMA 控制器、8 个树莓派可编程 I/O(PIO)状态机,用于自定义外围设备支持、30 个 GPIO 引脚,其中 4 个可用作模拟输入、支持 UF2 的 USB 大容量存储启动模式,用于拖放式编程
实现的功能:
正常情况下主程序执行红、黄、绿三色交通信号灯之间的转换工作,当有行人需要通行,或者需要停机检修时,可以延长红灯时间或关灯显示正在检修。
设计思路框图以及流程图:
程序开始—判断是否有按键输入—否—红灯亮起—绿灯亮起—黄灯闪烁—红灯亮起
—是—显示行人通过—红灯亮起—回到判断1
—是—显示等待检修—所有灯全灭
效果图片展示:
亮红灯
亮绿灯
亮黄灯
行人通过
等待检修
主要代码片段及说明:
from board import pin_cfg
from button import button
from led import r, g, b, y
from machine import PWM, Pin
from oled import oled
import time
import ws2812b
//导入所需函数和文件
i=0
//定义一个全局变量,之后用来判断工作状态
def red_light( ):
ws2812b.on_all("#FF0000")
//亮红灯
def yellow_light():
ws2812b.on_all("#FFFF00")
//亮黄灯
def green_light():
ws2812b.on_all("#00FF00")
//亮绿灯
pwm = PWM(Pin(pin_cfg.buzzer))
def pitch(frequency, duration=0):
pwm.freq(frequency)
pwm.duty_u16(3000)
time.sleep_ms(duration)
//脉冲调制
def k1_on(pin):
global i
i = 1
oled.text ("passers-by", 0, 10)
oled.show( )
//按键1,行人通过
def k2_on(pin):
global i
i = 2
oled.text ("stop for check", 0, 10)
oled.show( )
//按键2等待检修
k2 = button(pin_cfg.k2, k2_on, trigger=Pin.IRQ_FALLING)
k1 = button(pin_cfg.k1, k1_on, trigger=Pin.IRQ_FALLING)
while True:
//主程序,按照现实中交通信号灯的工作规律,设计的无限循环函数
if i==0:
red_light( )
time.sleep(5)
green_light()
time.sleep(5)
for j in range(2.5) :
ws2812b.on_all("#FFFF00")
time.sleep(0.5)
ws2812b.off_all()
time.sleep(0.5)
//红绿灯正常工作
else:
if i==1:
red_light()
oled.text("passing time", 0, 20)
oled.show( )
for i in range(10):
for freq in range(880, 1760, 16):
pitch(freq, 6)
for freq in range(1760, 880, -16):
pitch(freq, 6)
oled.text("time up", 0, 30)
time.sleep(1)
oled.fill(0)
oled.show( )
pwm.deinit( )
i=0
//有行人通过,延长红灯时间并发出蜂鸣提醒
else:
ws2812b.off_all()
//关闭所有信号灯,等待检修
遇到的主要难题:
1.在本次实验之前从来没有使用过树莓派pico等相关的芯片板子,也没有接触使用过micro python等相关语言,不知道如何上手。
2.部分可借鉴的开源程序代码语句不理解,不会熟练使用或使用有错误。
解决的方法:
1.认真观看学习课程视频的内容讲解,跟着老师细致的教学一步步地做,有不懂的地方主动请教老师同学。
2.上csdn等可学习平台寻找相关讲解教学,自己编写小型的测试性程序命令,多次尝试修改测试自己的理解猜测。
心得体会:
本次电子森林的嵌入式平台编程实验,我选择的实验内容是制作一个交通灯控制器,是基于树莓派Pico的嵌入式系统学习平台实现的,使用的是Micro Python语言来编程。通过这次实验,我对于嵌入式系统的内容有了更加深刻的理解与掌握,并成功地使用micro python语言编译thonny,操作树莓派Pico平台产生相应的效果,从而对嵌入式系统的相关知识有了更加直观的了解,对于micro python语言也有了更加深刻的体会。本次实验的要求是制作一个交通灯控制器,虽然经历了不少的困难与挫折,但在经过老师视频课程深刻细致的讲解,同学们热心主动的帮助和自己的思考与尝试后,终于成功地完成了实验,实现了对马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先级别等功能的仿真,成功制作了一个交通灯控制器。
未来的计划或建议:
在设计上稍微调整一下,红灯亮后是先黄灯闪1秒,再绿灯亮,再黄灯闪1秒,这个循环逻辑,从而与现实生活中的实际情况一致,其他都还可以,加一次黄灯,且把黄灯的时长减少,突出红灯、绿灯。优化执行逻辑,使得对特殊情况的模拟反应更为迅速。连接接入扩展板,增添额外的功能。