基于STEP Pico制作一个交通灯控制器
基于STEP Pico嵌入式平台,利用MircoPython开发语言来设计制作一个交通灯控制器
标签
嵌入式系统
数字逻辑
显示
控制
2023寒假在家练
宋泽宇
更新2023-03-28
北京理工大学
406

项目总结报告

本次我参与的寒假一起练平台是基于STEP Pico的嵌入式系统学习平台,由于我是Pico的初学者,因此我选择的个人完成项目是制作一个交通灯控制器,该项目主要是仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能;因此可以利用Pico板上的3个不同颜色的LED灯带模拟交通灯,并且对按键状态进行中断和查询,即可实现按键控制交通灯。

本次使用的是STEP Pico嵌入式学习平台,它是一款低成本,高性能的微控制器开发板,具有灵活数字接口。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM CortexMO+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚;软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。

本次项目的设计框图如下

FsKRoGN07Tk2nhsqW9dVS4hypoli

软件流程图如下

FqZUYW5-LdgSIi3AL2IU22nGasAL

主要实现的功能为轮流点亮led灯带,顺序切换红、黄、绿三种交通灯的颜色,绿灯结束后回到黄灯状态,再回到红灯状态,至此结束一个基本循环,当有行人按按键时,即开发板上的按钮按下时,内部状态置1,程序在每轮循环的绿灯结束时查询按钮状态,当按钮状态为1时,延长当次绿灯时间并播放警报声提醒行人尽快通过;这就是程序实现的基本功能。

首先是红灯亮起

Fhy75CXSmLk-Ftykq5VyJemT4dBN

红灯结束后黄灯亮起

Fqzr1PIuBCMdiOGyG5N85u5_Bp2n

黄灯结束后绿灯亮起

FmVqf-UGgD0czUn8ln5iecJKYGm3

下面介绍本次使用的代码部分

import time
import ws2812b
from button import k1
from machine import PWM, Pin
from board import pin_cfg
pwm = PWM(Pin(pin_cfg.buzzer))
def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep_ms(duration)
def red():
    for i in range(1, 13):
        ws2812b.on(i,"#ff0000")
def yellow():
    for i in range(1, 13):
        ws2812b.on(i,"#ffff00")
def green():
    for i in range(1, 13):
        ws2812b.on(i,"#00ff00")

该代码段是基本的定义段,定义了各时间变量、led灯变量、按钮变量以及蜂鸣器所需的脉冲信号变量,pitch函数定义的是蜂鸣器脉冲信号控制变量,red、yellow、green函数是led灯颜色的定义函数。

while True:
    red()
    time.sleep(8)
    yellow()
    time.sleep(3)
    green()
    time.sleep(8)
    if k1.value() == True:
        green()
        print("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("end")
        pwm.deinit()
    yellow()
    time.sleep(3)

该代码段是主循环段,优先使led点亮红色,使用time.sleep()来控制该颜色所持续的时间,8秒后,led更改为黄色,持续3秒,之后变为绿色,持续8秒,此时程序查询k1按钮的内部状态,若k1按钮按下,则内部状态置位1,进入绿灯延长状态,led为绿色,在shell栏中打印‘start’来帮助我们验证程序是否进入绿灯延长状态,接下来使用循环嵌套结构来播放蜂鸣器警报,脉冲信号循环10次,结束后在shell栏中打印‘end’,验证绿灯延长状态是否结束,并结束脉冲信号,此时绿灯状态结束,进入黄灯状态,持续3秒,时间结束后结束本轮循环,再没有外界中断指令时程序回到红灯状态,进入第二轮循环。如果在单轮循环中绿灯持续时间结束后,k1按钮被按下,那么状态将持续至下一轮循环,下一轮绿灯时间结束后进入绿灯延长状态。

由于我是初学者,因此在本次活动中,我对开发板所需要的环境进行搭建时出现了很多问题,在看老师直播课时就有很多地方不是很理解,但是为了能够顺利进行嵌入式学习,我边看边查资料,一点一点进行环境搭建,其中尤其是GitHub的SSH keys添加,我没有提前下载Git Bash,因此在看老师演示时根本手足无措,后来下载安装过之后问题也才得以解决。

正式编程时,我在进行变量定义时,虽然知道相对应的定义类型,例如将led灯变量定义为import,但是在运行时总是报错,我查阅资料也发现LED灯应该定义为import,最后发现报错是因为LED灯需要添加库,在开发板上添加相应的库文件就解决了问题,后续的蜂鸣器也是类似的解决办法;另外,在LED灯代码部分编写时,我所编写的代码只能点亮12颗led灯中的前11颗,后来查阅资料才得知,range后面括号里所描述的是左闭右开区间,因此若想控制全部12颗led灯,那么需要写明1到13。

至此利用STEP Pico嵌入式开发板制作一个交通灯控制器的基本功能均已实现,经过测试程序运行流畅,灯带和按键状态良好,不过老师在直播课里提到过可以瞬间刷新12颗led灯的异步控制方法,即总线法,但是我目前所掌握的知识不足以立刻理解这种相对复杂的方法,因此我会跟着老师的课程去进一步学习新的方法,并且尝试进行其他项目的编程,争取对STEP Pico开发板有一个更深入、更全面的了解和掌握。

附件下载
traffic.py
交通灯控制器程序
项目使用的库.zip
团队介绍
宋泽宇,北京理工大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号