- 项目介绍
基于树莓派Pico的嵌入式系统,仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,利用板子上的k1按键,模拟行人按键,当行人按按键时具有优先功能,根据查询机制,会变成红灯让行人通过,并且从红灯开始继续循环。
- 设计思路
构建一个状态机,通过按键改变中间变量x,当x=1时红灯亮并且持续5秒,切换至下一个状态x=2,当x=2时绿灯亮,持续5秒,并且切换到x=3,当x=3时黄灯亮持续3秒,并且切换回x=1,期间每个状态在执行时间延迟前后都要检验是否按下按键,如果按键被按下那么切换到x=1的状态。利用回调函数当按键按下时,在命令行中打印“已按下按键”,以检测按键功能是否完善。
- 框图和软件流程图
四、硬件介绍
基于树莓派Pico的嵌入式系统,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。
板卡硬件:
2个按键输入
4个单色LED
12个WS2812B RGB三色灯
1个姿态传感器
1个128*64 OLED显示屏
1个蜂鸣器
1个可调电位计(用于电压表)
1路音频信号输入(用于示波器)
8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex MO+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
- 实现的功能及图片展示
红灯亮
绿灯亮
黄灯亮
- 主要代码片段以及说明
def red_light():
for i in range(1,13):
ws2812b.on(i,"#ff0000")
分别设置红黄绿色,13个灯轮流亮起的函数,因为时钟很快所以视觉上是同时亮起。
颜色选择:采用16进制,从左到右每两位为ff表示加入一种颜色,从左到右一次为红绿黄三种颜色。比如黄色为ffff00。
while True:
if k1.value() == True:
x = 1
if x== 1:
red_light()
x=2
if k1.value() == True:
x = 1
time.sleep(2)
if k1.value() == True:
x = 1
if k1.value() == True:
x = 1
if x==2:
green_light()
x=3
if k1.value() == True:
x = 1
time.sleep(2)
if k1.value() == True:
x = 1
if k1.value() == True:
x = 1
if x == 3:
yellow_light()
x=1
if k1.value() == True:
x = 1
time.sleep(1)
if k1.value() == True:
x = 1
if k1.value() == True:
x = 1
通过中间变量x的值控制信号灯的切换
当x=1时红灯亮
检测按键状态,当检测到按键下降沿时,x赋值为1
点亮5秒
检测按键状态,当检测到按键下降沿时,x赋值为1
x=2
当x=2时绿灯亮
检测按键状态,当检测到按键下降沿时,x赋值为1
点亮5秒
检测按键状态,当检测到按键下降沿时,x赋值为1
x=3
当x=3时黄灯亮
检测按键状态,当检测到按键下降沿时,x赋值为1
点亮3秒
检测按键状态,当检测到按键下降沿时,x赋值为1
x=1
- 遇到的主要难题及解决方法
1、一开始没有把调用的包拷到板子上,只是存在同一个目录里,后来报错后下载到板子上。
2、中断回调函数里边的变量传递不到主循环里,但是我发现k1的检测值是否为1,在主循环里可以被检测到,所以就通过在主循环里时刻检测k1的方式来模拟查询操作。最开始的思路是通过中断函数设置一个flag,如果按下去,我中断函数会让一个变量值为1,然后值为1的话,在主循环中检测这个变量,如果等于1,就让红灯亮,然后这个循环,但是发现这个回调函数的参数不能传递到主循环中,所以就用了实时检测k1的方式来进行查询,它是否按下去。
- 未来的计划或建议
通过假期对树莓派的学习,让我对micropython这个简单的语言产生了浓厚的兴趣,会继续利用好树莓派,实现新的功能。同时还会学习像FPGA等一系列其他硬件。