基于STEP Pico制作一个交通灯控制器
制作一个交通灯控制器,利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换。
标签
嵌入式系统
MicroPython
树莓派PICO
2023寒假在家练
tantantan
更新2023-03-29
北京理工大学
438

一、项目介绍

具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能

实现方式:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换

二、环境配置

1、Thonny:

作为官方推荐的开发软件,页面简洁,功能齐全,便于操作,适合嵌入式系统开发的初学者。

2、树莓派Pico平台:

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

三、设计思路

交通灯控制器是一种生活中很常见的系统,它可以定时改变信号灯,观察行人是否要过马路,以及根据交通流量调整信号灯的时间,与附近的交通灯系统通话,以确保整个交通网络保持顺畅运行。完整实现交通灯控制器的所有功能过于复杂,但我们可以利用STEP Pico开发板制作一个简易的交通灯控制器,实现其一部分功能。

在树莓派Pico的学习板上,有4个LED灯,分别为R(红色)、G(绿色)、B(蓝色)、Y(黄色),我们可以使用其中的三个来仿真现实中的交通灯的工作状态:

红色LED亮表示禁止车辆通行,行人可以过马路;

黄色LED亮表示交通状态就要改变;

绿色LED亮表示可以车辆再次通行;

所以我们设计交通灯的流程:首先是红灯亮5秒表示禁止车辆通行,行人可以过马路,然后黄灯亮2秒表示交通状态要变为绿灯,之后绿灯亮5秒表示车辆可以再次通行,最后黄灯亮2秒表示交通状态要变成红灯,进入新的一个循环。

同时加入行人对灯的控制,当行人按下K1键时,下次循环开始后,红灯亮的时间将会延长5秒,同时蜂鸣器会发出声音,提醒行人可以安全过马路。如果行人未按下KI键,则一切正常循环。

四、设计流程图

Fur4hHcHIkB4wW8eZjxRlhwkRQ24

五、功能实现

红灯效果:

Fto_ZXM5iws756pZ1-h3m3skKdbA

黄灯效果:

FqWys8AD8ZkUYPyTNPDKSCULkmLz

绿灯效果:

FlTPNGSnbhsCci9QcJPtkNwKVfiZ

六、代码介绍

初始化配置,导入machine库,这样我们就可以控制Pico的GPIO引脚;为了添加灯之间的延迟,并能够控制灯的关闭时间,导入time库。

from board import pin_cfg
from button import k1
from machine import Pin, PWM
import time

配置蜂鸣器

pwm = PWM(Pin(pin_cfg.buzzer))#蜂鸣器
def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep_ms(duration)

配置管脚属性,可以使我们很清晰地知道哪个管脚控制哪个颜色的led灯,便于接下来的编程。

#配置好管脚属性
r=Pin(pin_cfg.red_led,Pin.OUT)#红
y=Pin(pin_cfg.yellow_led,Pin.OUT)#黄
g=Pin(pin_cfg.green_led,Pin.OUT)#绿

由于实际的交通灯不会只循环一次,即便没有交通堵塞,没有人通行,它们也会一直运行着。所以我们需要建立一个无限循环,使程序一直运行下去。

while True:#构建无限循环

接下来是一个循环里控制各个LED的亮灭,这里value(1)控制灯亮,value(0)控制灯灭,同时调用time.sleep延时,来控制各个LED灯亮的时间。

    r.value(1)#灯亮
    time.sleep(5)#延时
    r.value(0)#灯灭
    y.value(1)#灯亮
    time.sleep(2)#延时
    y.value(0)#灯灭
    g.value(1)#灯亮
    time.sleep(5)#延时
    g.value(0)#灯灭
    y.value(1)#灯亮
    time.sleep(2)#延时
    y.value(0)#灯灭

最终交通灯的状态就是:

1、首先是红色LED亮5秒表示禁止车辆通行,行人可以过马路;

2、然后是红灯熄灭,黄色LED亮起2秒表示交通状态就要变成绿灯,车辆可以通行;

3、然后是黄灯熄灭,绿色LED亮起5秒表示可以车辆再次通行;

4、然后是绿灯熄灭,黄灯亮起2秒,表示马上要变成红灯,车辆马上要禁止通行。

5、之后黄灯熄灭,红灯亮起,进入新的循环。

最后我们加上行人对交通灯的控制,由于现实生活中真正的红绿灯并不仅仅是用于道路车辆的,也要考虑到行人的通行。在繁忙的马路上,我们需要让行人也有机会安全地通过。所以我们加入了行人的控制,使得交通灯控制系统可以根据行人的按键来决定交通灯的状态变化。所以我增加了一个行人可以控制的按键开关K1,这样当行人按下K1键后,下一次行人的通行时间将会延长,同时再增加一个蜂鸣器,用于提醒行人可以安全地过马路了。

  if k1.value()==True:#行人按下按键,延长红灯时间
        r.value(1)
        for i in range(5):#循环声音5次,提醒行人可安全过马路
             for freq in range(880, 1760, 16):
                  pitch(freq, 6)
             for freq in range(1760, 880, -16):
                  pitch(freq, 6)
    pwm.deinit()

七、问题与计划

本次寒假一起练项目制作交通灯控制器使我受益匪浅,但由于是第一次接触micropython,还不是很熟练,所以最后实现的功能比较简陋,只满足了最基本的要求。看完直播课,我发现也可以用C/C++来进行编程,但由于本人能力不足,尝试了之后最后还是由于种种原因并没能实现。在接下来的时间里,我计划完善一下这次的项目,并且丰富一下功能,比如本次实现的只是一个路口的红绿灯,但现实中的一个十字路口有4个红绿灯进行控制,通过切换按键,可以分别对四个路口的红绿灯单独编程,使其可以互相配合,达成真正的红绿灯的功能。此时行人按下按键,不仅要改变本路口的交通灯能,也要相应的改变其他三个路口的状态,这是非常复杂的工程,非常具有挑战性,接下来我会去尝试逐步实现这个功能。

附件下载
交通灯控制器代码.rar
团队介绍
檀健龙,来自北京理工大学电子信息工程专业
团队成员
檀健龙
来自北京理工大学电子信息工程专业的一名学生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号