项目2-制作一个交通灯控制器总结报告
1. 项目描述
1.1 项目介绍
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
1.2 设计思路
利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换。
首先,需要另板卡上的12个WS2812B RGB三色灯依次呈现红、黄、绿、黄的颜色,来模拟实际生活中的交通灯。这里有两个注意点:
- 由于这是实验制作,对于红灯、黄灯、绿灯的时间要求并不完全与实际情况匹配。在本项目中,红灯亮起时间为5s,黄灯亮起时间为2s,绿灯亮起时间为5s。
- 需要做到12个三色灯同时亮起同其某种颜色
然后,在完成基本的红黄绿灯的状态循环切换的基础上,加入查询机制。当按下按键K1时,会在下一次红黄绿灯的循环时,延长红灯的亮起时间,并且发出蜂鸣器的警报声。
1.3 交通灯流程框图
图1 交通灯流程框图
2. 硬件介绍
2.1 基本介绍
使用的板卡为为【基于树莓派Pico的嵌入式系统学习平台】,专门为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用,无需任何编程基础,也能成为点灯大师。通过树莓派Pico的嵌入式系统学习平台可以了解电子系统构成、学会一门与硬件直接相关的编程语言,自己动手完成有趣的项目,激发对电子的兴趣,培养自信心和开源资源的利用和分享意识,培养项目总结和展示的能力。
核心板为STEP PICO,它是具有灵活数字接口的低成本,高性能的微控制器开发板,完全兼容Raspberry Pi Pico,增设了4个WS2812彩色灯,增设了一个复位按键,将Micro USB接口修改成了Type-C接口。硬件上,采用树莓派官方自主研发的RP2040微控制器芯片,搭载了双核Arm Cortex M0+处理器,运行速度高达133MHz,内置了264KB SRAM和2MB板载闪存,还板载有多达26个多功能的GPIO引脚。对于软件开发,可以使用树莓派提供的C/C++SDk,或者使用MicroPython进行开发,并配套有完善的开发资料教程。可方便快速入门开发并嵌入产品中。
2.2 树莓派Pico扩展板
树莓派Pico扩展板具有以下模块:
2个按键输入;
4个单色LED;
12个WS2812B RGB三色灯;
1个姿态传感器;
1个128*64 OLED显示屏;
1个蜂鸣器;
1个可调电位计(用于电压表);
1路音频信号输入(用于示波器);
8位R-2R电阻网络构成的DAC(用于DDS信号发生器);
板卡图如下所示:
图2 板卡图
功能及管脚映射如下图所示:
图3 功能及管脚映射
3. 实现功能展示
下面展示交通灯控制器的功能,具体展示可见视频,这里仅展示图片效果
图4 功能展示
如上图所示,12个RGB_LED灯在红→黄→绿→黄→红→黄→绿→黄→…的循环中交替出现,其中红灯亮五秒,黄灯亮2s,绿灯亮5s。当按下按键时,将在下个循环开始时亮起红灯,并发出蜂鸣声(具体效果见展示的视频)。
图5 红灯亮起并发出蜂鸣
4. 主要代码片段说明
主要的代码有两部分功能。
4.1 红黄绿灯交替:
red_light()
time.sleep(5)
yellow_light()
time.sleep(2)
green_light()
time.sleep(5)
yellow_light()
time.sleep(2)
这部分代码的效果是实现红、黄、绿灯的交替出现,红灯亮5s,黄灯亮2s,绿灯亮5s,黄灯亮2s,然后下一个循环重复这个过程。
4.2 按键查询:
if k1.value()==True:
red_light()
print('+5 start')
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)
print('+5 end')
pwm.deinit()
这部分代码的功能是加入查询机制。当按下按键K1时,会在下一次红黄绿灯的循环时,延长红灯的亮起时间,并且发出蜂鸣器的警报声。
5. 遇到的主要难题及解决方法
问题:
在项目制作过程中发现12个RGB_LED灯依次亮起,没有做到同时点亮。
解决办法:
改进代码,实现异步处理。
原先的代码为:
#红灯亮
def red_light():
for i in range(1, 13):
ws2812b.on(i, "#ff0000")
在这个循环中,红灯是依次亮的。
为了实现12个LED灯同时亮红灯,将上述代码做如下改进:
def red_light():
ws2812b.on_all('#ff0000')
改进后实现了红灯的同时亮起,黄灯和绿灯的处理也相同:
def yellow_light():
ws2812b.on_all('#ffff00')
def green_light():
ws2812b.on_all('#00ff00')
6. 未来的计划
这是第一次参与硬禾学堂的【基于树莓派Pico的嵌入式系统学习平台】进行项目制作,难度合适,很适合我。而且学习的过程很有趣,一点也不枯燥乏味,激发了我对电子的兴趣,对嵌入式设计开发的兴趣。由于时间关系,这次只完成了 制作一个交通灯控制器的项目,别的更多的有趣的项目我还没有体验。以后有时间我将会继续学习基于树莓派Pico的嵌入式系统学习平台的相关内容,进行更加复杂而有趣的项目设计。