项目总结报告
本项目是基于STEP pico 的嵌入式学习开发平台,通过thonny软件编程,实现一个简易的交通信号灯。
设计的思路为:参考现实中的交通信号灯,信号灯在“红、黄、绿、黄、红、黄、绿…”循环往复,最基本的循环单元为“红、黄、绿、黄”,其中,红灯、黄灯、绿灯亮起的持续时间不同,基于此原理,可以通过thonny软件编写一个基本的循环,实现红、黄、绿灯依次亮起并在持续一段时间后熄灭。
至此,可以实现一个基本的简易交通信号灯功能,在此基础上添加功能,例如:通过按键控制交通信号灯,在key1键按下后,结束循环,使红灯亮起。
在此基础上再次优化,可以通过key2键控制黄灯,使其亮起时间延长。完整流程图如下:
至此,简易交通信号灯的设计和优化结束。接下来看具体代码实现和实际效果。
本项目使用的硬件系统如下:
树莓派Pico开发板硬件接口扩展引脚排列见图1所示
ESP01S无线WiFi模块基于ESP8266芯片,其主要特性如下:
•工作电压:+3.3 V(官方手册给出的外接电源参数:2.7V~3.6V,Imax>500mA)
•接口:可使用AT命令与UART串口进行串行通信
•集成TCP/IP协议栈
•802.11 b/g /n通信协议
•使用时无须接外部元件
ESP01S模块通过其TX和RX串口引脚与树莓派Pico进行通信,ESP01S模块接口信号引脚说明如下:
(1) VCC:3.3V电源
(2) GND:接地
(3) GPIO0-Flash:GPIO引脚,将该引脚连接到+3.3V为运行模式,连接到GND为下载模式
(4) GPIO2:GPIO引脚
(5) RST/GPIO16:复位引脚(若使用ESP01模块,运行模式须将该引脚上拉接;若使用ESP01S模块,运行模式可将该引脚悬空)
(6) EN/CH_PD:芯片使能引脚(若使用ESP01模块,运行模式须将该引脚上拉接;若使用ESP01S模块,运行模式可将该引脚悬空)
(7) TX/GPIO0:串行数据发送信号
(8) RX/GPIO3:串行数据接收信号
从ESP01S无线WiFi模块知,ESP-01S无线WiFi模块供电电压范围为2.7V-3.6V,最大电流Imax>500mA。树莓派Pico硬件接口扩展引脚3V3(OUT)为3.3V直流电源,我们可用该直流电源对ESP-01S无线WiFi模块进行供电,但该电源最大输出电流仅有300mA。为确保系统工作更加稳定可靠,这里采用带开关电池盒的两节5号电池串联对ESP01S无线WiFi模块进行供电(见图2)。当然,我们也可直接用3.0V-3.6V直流稳压电源对ESP01S供电,或者将4.75V-12V 直流稳压电源(如5V直流电压)连接到ASM1117三端稳压器模块的输入端在输出端产生3.3V电源对ESP-01S进行供电等(ASM1117:输入电压范围4.75V~12V, 输出电压3.3V)。
在图2中,树莓派Pico扩展口与ESP01S无线WiFi连接信号如下:Pico UART1 RX与ESP01S TX连接,Pico UART1 TX与ESP01S RX连接,Pico GND、ESP01S GND都和电池盒电源的负极(黑线)共地连接,ESP01S VCC与电池盒电源的正极(红线)连接。
设Pico UART1串口通信速率为115200 bps,采用MicroPython对Pico UART1串口进行初始化设置的程序片段如下:
from machine import UART
uart1 = UART(1,baudrate=115200,rx=Pin(9),tx=Pin(4)) #ESP01S出厂时的波特率为115200
在本项目中,主要使用了外设硬件中的12个三色LED灯,两个按键以及一个蜂鸣器实现简易交通信号灯的功能,
实现的功能包括:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
实现方式为:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换。
主要代码如下:
from button import k1, k2
from board import pin_cfg
import time
import ws2812b
from machine import PWM, Pin
#以上为调用的库,并设置基本变量
#将蜂鸣器和红灯、黄灯、绿灯设置为函数的形式,方便之后调用
pwm = PWM(Pin(pin_cfg.buzzer))
def pitch(frequency, duration = 0):
pwm.freq(frequency)
pwm.duty_u16(3000)
time.sleep_ms(duration)
#通过调用库,设置红灯、黄灯、绿灯的基本状态
def red_light():
for i in range(1,13):
ws2812b.on(i,"#ff0000")
def yellow_light():
for i in range(1,13):
ws2812b.on(i,"#ffff00")
def green_light():
for i in range(1,13):
ws2812b.on(i,"#00ff00")
while True:
if k1.value() == True: #判断key1键状态,按下,则红灯亮起
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() #蜂鸣器发声
else:
if k2.value() == True:#转为key2键状态判断,若按下,则黄灯亮起并持续5秒
yellow_light()
time.sleep(5)
else: #基本大循环,分别实现红灯、黄灯、绿灯、黄灯循环亮起
red_light() #红灯亮起,持续5秒
time.sleep(5)
yellow_light()#黄灯亮起,持续2秒
time.sleep(2)
green_light()#绿灯亮起,持续5秒
time.sleep(5)
yellow_light()#黄灯亮起,持续2秒
time.sleep(2)
#一次循环结束,执行下次循环
通过两个按键状态的判断实现信号灯状态的切换。具体代码的功能请看代码段的注释。
实现效果展示(此处仅展示各颜色灯亮起状态,具体动态功能请观看上传的展示视频):
具体切换功能还需要通过上传的视频进行展示。
在这次项目的完成过程中,我遇到的最大问题是对Python语言语法的不熟悉,在编写过程中查阅了很多资料,也通过这一过程了解到Python语言相比于其他语言有属于自己的一大优势,我也对这一语言有很大的兴趣。
通过这次项目活动,我对于嵌入式开发学习产生了浓厚的兴趣,同时也对VHDL等一系列硬件语言产生了兴趣,以后我可能会踏足这一行业,学习更多的硬件开发知识。