基于STEP Pico制作一个交通灯控制器
使用基于STEP Pico的嵌入式学习平台制作一个简单的交通灯控制器,实现仿真马路上的交通灯的工作状态切换
标签
嵌入式系统
MicroPython
寒假一起练
fanyuta
更新2023-03-29
北京理工大学
309

基于STEP Pico的嵌入式系统学习平台

制作一个交通灯控制器

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

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

一:环境配置

  • Thonny:

作为官方推荐的开发软件,Thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者。

  • 硬禾学堂树莓派pico平台:

硬禾学堂为“寒假一起练”活动提供一个嵌入式系统平台,该平台包括硬禾版本树莓派Pico核心模块STEP Pico以及树莓派Pico扩展板。

Fg6gesESvY0_ip3V2CN9ZDl4avY7

核心模块STEP Pico使用了树莓派公司自行设计研发的rp2040微控制器芯片,拥有133MHz运行频率、264KB SRAM以及2MB的闪存,支持C/C++和Python语言。而扩展板则基于核心模块的设计方向和预期功能装配了2个输入按键、4个单色LED、12个WS2812B RGB三色灯、姿态传感器、128*64 OLED显示屏、蜂鸣器、可调电位计(用于电压表)、音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)等众多配件,可以用于实现十分丰富的扩展功能项目。

:需求分析:

1、使用扩展板上的LED灯发出红黄绿三色光来模拟交通灯,需要使用三个不同颜色的LED灯,则需要先对该扩展配件进行配置。

2、项目要求实现行人按键优先功能,即需要通过按键的输入来调整交通灯的切换,则需要对输入按键进行配置。

3、编程控制LED灯的颜色变化、持续时间、颜色顺序来模拟交通灯的基础功能。然后加入输入按键对持续时间的控制,增加行人调整功能。

4、可以使用扩展板上装载的蜂鸣器,在按下按键后发出响声,实现延长时间提醒功能。

实现结果如下图:

FiDGItxw8RqLJ50cx0OYxLWekw3I

绿灯亮起

FuUw11J5iZEUaYvqsgZariBJwf0S

黄灯亮起

FpCQjlVIlA_HWxZISeg2Cscm70eq

红灯亮起

三:流程图:

 FhUgBSPssZoEROU1nEwsWUcI4S5F

:程序实现:

本项目程序均使用Micro python语言编写,该语言相对于Python语言更加易于上手,对初学者很友好。

本项目程序使用电子森林提供的picospush资源库,包括基础资源以及部分小项目示例。

  • 基础功能配置

使用picospush库中的board.py文件对扩展板元器件进行基础配置,实现pin与配件的对应。

使用库中的button.py文件对k1、k2按键进行配置以实现按键的基础功能。

### board.py --- eetree micropython training board configuration.
###配置扩展板各元器件引脚,方便引用

class pin_cfg:

    yellow_led = 20
    blue_led = 21
    green_led = 22
    red_led = 26

    buzzer = 19
    mic = 27

    i2c0_scl = 17
    i2c0_sda = 16
  
    i2c1_scl = 15
    i2c1_sda = 14

    spi1_mosi = 11
    spi1_sck = 10
    spi1_dc = 9
    spi1_rstn = 8
    spi1_cs = 29

    adc0 = 26
    adc1 = 27

    k1 = 12
    k2 = 13

    pot = 28
### botton.py --- eetree micropython training board configuration.

import time
from board import pin_cfg
from machine import Pin

###初始化,引用board.py文件引脚,实现k1、k2按键功能

class button:
    def __init__(self, pin, callback=None, trigger=Pin.IRQ_RISING, min_ago=200):
        #print("button init")
        self.callback = callback
          
        self.min_ago = min_ago
        self._next_call = time.ticks_add(time.ticks_ms(), self.min_ago)

        self.pin = Pin(pin, Pin.IN, Pin.PULL_UP)

        self.pin.irq(trigger=trigger, handler=self.debounce_handler)

        self._is_pressed = False

    def call_callback(self, pin):
        #print("call_callback")
        self._is_pressed = True
        if self.callback is not None:
            self.callback(pin)

    def debounce_handler(self, pin):
        #print("debounce")
        if time.ticks_diff(time.ticks_ms(), self._next_call) > 0:
            self._next_call = time.ticks_add(time.ticks_ms(), self.min_ago)
            self.call_callback(pin)

    def value(self):
        p = self._is_pressed
        self._is_pressed = False
        return p

k1 = button(pin_cfg.k1)
k2 = button(pin_cfg.k2)
  • 主程序初始化配置

引入board.py和button.py,引入时间函数,实现元器件的使用。

import time
from button import k1,k2
from machine import PWM,Pin
from board import pin_cfg
  • 交通灯的实现

配置r、y、g三个不同函数代表让三个不同颜色的LED灯发光。然后根据交通灯的工作方式编写“红—黄—绿—黄”的循环语句,并让不同颜色持续的时间不同。到底,交通灯的基本功能已经实现。

###配置三个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)

###编写主循环,红灯亮7秒、黄灯亮3秒、绿灯亮7秒、黄灯亮3秒
while True:    
    r.value(1)
    time.sleep(7)
    r.value(0)
    y.value(1)
    time.sleep(3)
    y.value(0)
    g.value(1)
    time.sleep(7)
    g.value(0)
    y.value(1)
    time.sleep(3)
y.value(0)
  • 添加按键调整功能和蜂鸣器提醒功能

本扩展板有两个输入按键,则选择分别添加延长红灯时间和延长绿灯时间两种功能,并在电脑屏幕上显示“red overtime start”、“red overtime end”、“green overtime start”、“green overtime end”字样。

我们可以在按键控制交通灯变换的功能中增添辅助功能。首先配置蜂鸣器,使其在需要时能够发出设定好的、一定频率的响声,再在按键被按下后实施,实现在延长时间中的蜂鸣效果。我们可以将按键延长红/绿灯的时间设定为蜂鸣器蜂鸣10次的时间。

###配置蜂鸣器
pwm = PWM(Pin(pin_cfg.buzzer))

def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)   ###发出3000Hz频率响声
time.sleep_ms(duration)

###k1按键控制延长红灯时间且蜂鸣器响10次
 if k1.value() == True:
        r.value(1)
        print("red overtime start")
        for i in range(10):
            for freq in range(880,1760,16):
                pitch(freq,6)
            for freq in range(880,1760,-16):
                pitch(freq,6)
        print("red overtime end")
        r.value(0)
        pwm.deinit()

###k2按键控制延长绿灯时间且蜂鸣器响10次
if k2.value() == True:
        g.value(1)
        print("green overtime start")
        for i in range(10):
            for freq in range(880,1760,16):
                pitch(freq,6)
            for freq in range(880,1760,-16):
                pitch(freq,6)
        print("green overtime end")
        g.value(0)
        pwm.deinit()

遇到的主要难题及解决方法:

  • LED灯的闪烁问题

如果在程序中只写入LED灯亮起的语句,则默认会使LED灯亮起芯片内部计数器的一个时钟单位的时间,但是改时间太短无法模拟交通信号灯,因此需要控制灯亮起的时间长度。可使用时间函数(time),使LED灯的亮起状态保持(睡眠)一段时间,从而达到持续发光模拟信号灯的效果。

未来的计划建议:

该项目已经成功实现了交通信号灯的功能,并达到了预期指标,能完成按键输入控制信号灯的切换的附加功能。

然而我们还通过利用扩展板上的其它元器件,在此基础上做一些拓展,使该项目能够实现许多其它的功能:

1、可以利用扩展板上的OLED显示屏,编写程序制作、显示行人的动画,实现视觉指引功能。在绿灯亮起时播放移动的动画,在红灯亮起时播放停止的动画,做到模仿功能更加丰富的交通信号灯系统。

2、可以改变LED灯在不同时间的状态,表示不同的路况。比如在绿灯持续时间结束前几秒让绿灯由持续亮起状态变为闪烁状态,提醒行人绿灯时间即将结束,请尽快通过。

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