基于STEP pico 的嵌入式系统学习平台板卡制作简易交通信号灯
基于STEP pico 的嵌入式系统学习平台板卡,通过thonny进行软件编程,完成了一个简易交通信号灯的制作
标签
嵌入式系统
数字逻辑
2023寒假在家练
yzz01
更新2023-03-29
北京理工大学
1260

项目总结报告

本项目是基于STEP pico 的嵌入式学习开发平台,通过thonny软件编程,实现一个简易的交通信号灯。

设计的思路为:参考现实中的交通信号灯,信号灯在“红、黄、绿、黄、红、黄、绿…”循环往复,最基本的循环单元为“红、黄、绿、黄”,其中,红灯、黄灯、绿灯亮起的持续时间不同,基于此原理,可以通过thonny软件编写一个基本的循环,实现红、黄、绿灯依次亮起并在持续一段时间后熄灭。

至此,可以实现一个基本的简易交通信号灯功能,在此基础上添加功能,例如:通过按键控制交通信号灯,在key1键按下后,结束循环,使红灯亮起。

在此基础上再次优化,可以通过key2键控制黄灯,使其亮起时间延长。完整流程图如下:

wccB4gF7zfFngAAAABJRU5ErkJggg==

至此,简易交通信号灯的设计和优化结束。接下来看具体代码实现和实际效果。

本项目使用的硬件系统如下:

树莓派Pico开发板硬件接口扩展引脚排列见图1所示

4+ro+A1RAAAAABJRU5ErkJggg==

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灯,两个按键以及一个蜂鸣器实现简易交通信号灯的功能,

9k=

实现的功能包括:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的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)
            #一次循环结束,执行下次循环

通过两个按键状态的判断实现信号灯状态的切换。具体代码的功能请看代码段的注释。

实现效果展示(此处仅展示各颜色灯亮起状态,具体动态功能请观看上传的展示视频):

Z2Q==2Q==

具体切换功能还需要通过上传的视频进行展示。

在这次项目的完成过程中,我遇到的最大问题是对Python语言语法的不熟悉,在编写过程中查阅了很多资料,也通过这一过程了解到Python语言相比于其他语言有属于自己的一大优势,我也对这一语言有很大的兴趣。

通过这次项目活动,我对于嵌入式开发学习产生了浓厚的兴趣,同时也对VHDL等一系列硬件语言产生了兴趣,以后我可能会踏足这一行业,学习更多的硬件开发知识。

附件下载
traffic_lights.py
主要代码
button.py
用到的库
board.py
用到的库
团队介绍
岳中 北京理工大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号