2023寒假在家练——基于基于STEP Pico的嵌入式系统制作一个交通灯控制器报告
一,个人简介
北京理工大学2019级信息与电子学院本科生,学习过c语言,计算机原理与应用等课程
二,STEP-Pico嵌入式系统简介
嵌入式系统由硬件和软件组成.是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器、存储器、通信模块等在内的多方面的内容,相比于一般的计算机处理系统而言。嵌入式系统存在较大的差异性, 它不能实现大容量的存储功能,因为没有与之相匹配的大容量介质,大部分采用的存储介质有E-PROM、EEPROM DENG等, 软件部分以API编程接口作为开发平台的核心。STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
三,项目简介
基于STEP-Pico嵌入式系统制作一个交通信号控制灯,用Micopython进行编程,使板子上的12个LED灯模拟交通信号灯,进行红黄蓝的循环,并调用K1,K2按键,当在红灯时按下K1按键会使灯变黄并且发出警报,警示车辆停止通过,在绿灯时按下K2会使绿灯时间延长,帮助行人通过马路,其中使用了一个0.002秒的延迟来制作了一个实时监听系统,确保能随时检测按键信号。
四,设计思路
首先完成LED和蜂鸣器的调用,用循环使板子上12个依次亮起来模拟交通信号灯。再用一个大循环来控制LED灯红,黄,绿三种颜色的交替,同时编写函数cross_g和cross_r,来表示当在绿灯下K2被按下的情况和在红灯下K1被按下的情况。为了实现在红灯和绿灯亮起的所有时间能检测到按键的情况,设置时间间隔为T=0.002s,在红灯绿灯亮起的时候,每个T个时间间隔就对K1,K2进行判断以达到实时监听的目的,从测试效果来看,这个时间间隔不会出现遗漏的情况。同时,在cross_r函数中,对蜂鸣器进行了调用,在K1=Ture的时候,使红灯变为黄灯,同时蜂鸣器开始发出声音,在结束后,红灯变为绿灯并跳出红灯的监听循环。在绿灯时,对cross_g进行监听,当K2=Ture时,对绿灯延时五秒,再继续监听循环,直到绿灯结束。综上,通过对按键的实时监听,达到通过按键控制交通信号灯的目的。如图所示:
五,遇见困难
1,对嵌入式系统不了解,对如何将程序烧入板子不太清楚。2,对Micopython编程语言的不了解,在本科期间,因为专业需要大多数学的是verlog和Matlb,只在大一大二接触过C和C++,所以对这个编译语言不太了解。3,在设计交通信号灯时,如何在灯亮的期间对K1,K2按键进行实时的监听。
六,解决办法
1,通过学习和基于树莓派Pico的嵌入式系统学习平台配套的教学课程,对嵌入式系统有了大致的了解,也清楚了如何对板子进行程序的烧入,同时也了解到了Thonny这个编译软件,一个适用于初学者的python编译软件,对我后续的设计带来了极大的便利。2,通过向相关专业同学老师请教,自行查阅相关书籍,学习可能会使用的函数和基本的语句,并且对编译中可能出现的BUG有了一些了解,比如“缩进错误”。同时借助互联网的力量去查看相关视频的设计思路,并且加以学习改进。3,在我翻看相关视频的时候,发现很多设计者并没有对在灯亮时对按键进行实时监听做出合理的应对措施,我通过查询资料和与同学交流,想到了在原本用sleep.time()来控制灯亮起的基础上,改为用变量和循环来控制灯亮起的时间,在每个循环中都对按键进行监听,只要每个循环间隔时间很短,就能达到实时监听的目的并且将想法在代码中得到了实现。
七,总结和建议
通过这次寒假一起练平台活动,让我对嵌入式系统有了一个全面基础的了解,同时加强了我对编程能力的提升和复习,此外通过对具体项目的设计,让我能够学习到的知识转化为切实的项目,这激起了我的自豪和成就感,对我今后的学习有着鼓舞和激励的作用,以后我会继续使用STEP-Pico嵌入式系统去尝试更多相关项目的设计和制作,在提高自己能力的同时,去了解更多相关的知识,为之后的进一步学习或者就业打下夯实的基础。同时,对电子森林能够提出这样免费给我一个学习和进步的平台以及项目的机会表示感谢,也期待着电子森林可以继续推出相关项目,让我有机会更多的了解到树莓派和嵌入式系统。
代码:
import ws2812b
from board import pin_cfg
from button import k1,k2
from machine import Pin,PWM
import time
pwm=PWM(Pin(pin_cfg.buzzer))
def pitch(frequncy, duration=0):
pwm.freq(frequncy)
pwm.duty_u16(3000)
time.sleep_ms(duration)
def g_on():
for i in range(1, 13):
ws2812b.on(i, "#00ff00")
def y_on():
for i in range(1, 13):
ws2812b.on(i, "#ffff00")
def r_on():
for i in range(1, 13):
ws2812b.on(i,"#ff0000")
def cross_r():
if k1.value():
y_on()
time.sleep(3)
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)
pwm.deinit()
g_on()
time.sleep(8)
y_on()
time.sleep(2)
r_on()
time.sleep(8)
return True
return False
def cross_g():
if k2.value():
g_on()
time.sleep(5)
while True:
g_on()
delay = 0.002
cnt = 8 / delay
for i in range(cnt):
cross_g()
time.sleep(delay)
y_on()
time.sleep(2)
r_on()
for i in range(cnt):
if cross_r():
break
time.sleep(delay)
y_on()
time.sleep(2)