基于STEP Pico的嵌入式系统制作一个交通灯控制器
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能
标签
嵌入式系统
仿真
2023寒假在家练
小鱼.
更新2023-03-29
北京理工大学
356

2023寒假在家一起练

项目2 制作一个交通信号灯

1、硬件介绍

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

本次板卡硬件为:

2个按键输入

4个单色LED

12个WS2812B RGB三色灯

1个姿态传感器

1个128*64 OLED显示屏

1个蜂鸣器

1个可调电位计(用于电压表)

1路音频信号输入(用于示波器)

8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

本次实验所采用的基于树莓派Pico的嵌入式系统学习平台,专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。

2、项目需求

目标:制作一个交通控制灯

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

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

3、完成的功能及达到的性能

3.1 交通信号灯状态自动切换

点击运行,十二个LED灯根据指令循环显示红色,黄色,绿色,黄色状态,为车辆通道的交通指示灯;屏幕上显示的是对行人的提示。当为红灯时候,车辆等待,屏幕上出现“Please go”字样,提醒行人通行;当为黄灯时候,行人与车辆均等待,屏幕上出现“Please wait”字样;当为绿灯时候。车辆通行,屏幕上出现“Please stop”字样,提醒行人等待。

FiGAA7SCHa54FdIxKi2FyC9uOCDtFrCsAWpvb12Cv_mLgHKRNcZ9CNm6Fl1OKygCZjdwnyYDPTrf0NS8lo5q

此处完成了非人为控制下交通信号灯的切换。

3.2 行人按键时的优先功能

当按下左下角K1按钮时,模仿行人按键时优先功能,于下次循环时候,延长车辆红灯时间,即延长行人绿灯时间,并发出蜂鸣声起到提醒作用。

FqWIZ4sJVaov8-XnZ3BcLfisRYBLFgp9sMf44A9yaGAjz2jI5nQ3gKcSFgpqDkuLWsbt_kcjsRIZEOA9Temu

4、实现思路

通过MicroPython编程实现交通信号灯基本功能,并通过实际按钮实现人为控制

5、实现过程

5.1 程序流程图

FqZ1WitmE7hLR8hw1vpIS77VTGCK

5.2 主要代码段说明

5.2.1 完整代码展示

import ws2812b
import utime, time
import _thread
from button import k1
from machine import PWM, Pin
from machine import SPI, Pin
from ssd1306 import SSD1306_SPI
import framebuf
from board import pin_cfg
import gc
pwm = PWM(Pin(pin_cfg.buzzer))

def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep_ms(duration)
    
spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc),Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))

# Clear the oled display in case it has junk on it.
oled.fill(0)

state = 0

def the_second_loop():
    while True:
        if state == 0:
            oled.text("Please go",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)
        if state == 1:
            oled.text("Please stop",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)
        if state == 2:
            oled.text("Please wait",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)

_thread.start_new_thread(the_second_loop, ())

green = "#00ff00"
red = "#ff0000"
yellow = "#fff00"

while True:
    if k1.value() == True:
        state = 0
        ws2812b.on_all(red)
        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()
    state = 0
    time.sleep(1)
    ws2812b.on_all(red)
    time.sleep(5)
    state = 2
    time.sleep(1)
    ws2812b.on_all(yellow)
    time.sleep(2)
    state = 1
    time.sleep(1)
    ws2812b.on_all(green)
    time.sleep(5)
    state = 2
    time.sleep(1)
    ws2812b.on_all(yellow)
    time.sleep(5)
         

5.2.2 交通信号灯实现

    state = 0
    time.sleep(1)
    ws2812b.on_all(red)
    time.sleep(5)
    state = 2
    time.sleep(1)
    ws2812b.on_all(yellow)
    time.sleep(2)
    state = 1
    time.sleep(1)
    ws2812b.on_all(green)
    time.sleep(5)
    state = 2
    time.sleep(1)
    ws2812b.on_all(yellow)
    time.sleep(5)

通过代码实现点亮交通信号灯,首先是红灯,因为实验需求此处设置为5秒,并赋值变量以便于后续屏幕上显示文字的程序设计,接下来是黄灯,此处设置为2秒,接下里是绿灯也为5秒,然后是黄灯为2秒。

5.2.3 行人控制功能实现

  if k1.value() == True:
        state = 0
        ws2812b.on_all(red)
        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.value() == True:表明K1按钮被按压,此时点亮红灯,并在程序内显示+5 start,然后蜂鸣器工作时长为十秒后结束,程序内显示+5end,起到了时延的效果

5.2.4 屏幕显示功能实现

def the_second_loop():
    while True:
        if state == 0:
            oled.text("Please go",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)
        if state == 1:
            oled.text("Please stop",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)
        if state == 2:
            oled.text("Please wait",0,32)
            oled.show()
            time.sleep(1)
            oled.fill(0)

此处采用第二线程,由前面不同颜色的灯对变量进行不同的赋值,执行不同的程序,当为红灯的时候变量赋值为0,屏幕上显示“Please go”提示行人在车辆红灯时可以通行,显示范围从最左边开始;当为绿灯的时候屏幕上显示“Please stop”提醒行人在车辆绿灯时候需要停止等待,显示范围从左边开始;当为黄灯时候显示“Please wait”双方均等待。

6、遇到的主要难题

本次制作首先遇到的问题是屏幕上显示的字符不是从最左边开始的,后面我仔细查阅学习,如次代码所示:oled.text("Please go",0,32),在字符右边加入位置坐标信息,使字符从左边开始显示,增加了观赏性。其次是在进行红绿灯与字符顺序的匹配上存在一些不足,一开始会出现灯亮的时候,字符提前或延后出现时间较长,出现较大误差,后来我加入time.sleep(1),人为调控时间,但是还是有所较小的误差,尤其是按完K1延长时间后,误差仍然有点大,此处不知道有什么较为合适的方法调整。

7、未来的计划与建议

未来计划是深度学习嵌入式系统,完善解决遇到的问题,并通过此系统完成其他感兴趣的项目,如制作音乐播放器、制作一个反应测试器、制作一个电压表、制作一个节日彩灯等,通过不断地学习完成自己编程和实践动手能力,为以后的工作学习奠定良好的基础。

 

附件下载
traffic-light-oled.py
团队介绍
伊星谕,北京理工大学
团队成员
小鱼.
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号