基于STEP Pico的嵌入式系统制作交通信号灯
【基于树莓派Pico的嵌入式系统学习平台】专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。
标签
树莓派
嵌入式系统
2022寒假在家练
树莓派RP2040
luxferre
更新2023-03-29
北京理工大学
367

1设备介绍

STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。

硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了

ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。

软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。

以下为该产品的一些特性

· 双核 M0+处理器内核,最高时钟133MHz

· 264KB SRAM(6 Bank)、2MB的板载Flash内存,最大可以支持16MB,并且具有16KB的Cache

· 支持USB 1.1 主机/设备模式(直接通过板载USB UF2模式下载)

· 支持SWD调试和下载

· 26个多功能GPIO(即可复用为外设IO,并且其中有4个IO可用作ADC输入引脚)

· 2个SPI、2个I2C、2个UART、3个12bit的ADC、16个可控的PWM通道

· 内置温度传感器

· 加速的ROM内的浮点库

· 8个可编程IO(PIO)

· 4个ADC通道,最大采样率0.5MSa/s,12bit精度,可从外部引入参考电压

· 6个专用IO用于SPI Flash以支持XIP

以下是本项目采用的扩展版介绍

  • 2个按键输入
  • 4个单色LED
  • 12个WS2812B RGB三色灯
  • 1个姿态传感器
  • 1个128*64 OLED显示屏
  • 1个蜂鸣器
  • 1个可调电位计(用于电压表)
  • 1路音频信号输入( 用于示波器)

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

2 项目需求

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

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

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

使用树莓派PICO扩展板和硬禾版本树莓派PICO核心模块 - STEP PICO实现马路上的交通灯工作状态切换,通过编程使得扩展版上的红黄绿LED变换工作状态,开始时红灯常亮,当行人按下按键时,开始倒数,并在一段时间后转为黄灯,黄灯状态短暂停留后转变为绿灯,经过一段时间等待行人动过,然后进入倒计时,最后恢复红灯状态。在倒计时过程中,由蜂鸣器发出倒计时提示音,在交通信号灯转换工作状态时,蜂鸣器再次响起提示音。

具体图示

如图,开始时,给电路板通电,运行程序,对芯片进行初始化,红色LED灯常量

ac711e08347937156c6ccc6c6110b54

按下按键后,通过查询机制,经过倒计时后红灯熄灭,黄灯亮起,持续0.5秒

77d0044cb69018c546527cacc59f668

接下来,绿灯开始常亮5秒,再经过5秒倒计时,再次初始化电路板,接而LED灯恢复红灯常亮状态

7b0b0f108c7e2df6955d751aabe60e9dbaf5d82cb804baef24a899cf4855b2

4 实现思路

· 引入多线程工作模块,使得蜂鸣器和LED灯能同时工作

· 使用按键查询机制,在查询到按键被按下后,进入倒计时状态

5 设计思路

首先该程序应该使用一个循环来保证可以重复使用,然后思考,如何实现LED灯亮,在这里使用了预先编写的LED库(若没有,也可以对照引脚自己设置),因为需要在按下按键后实现工作状态的改变,所以采用了查询机制,即一个if判断语句结合引脚电压变化(也可以用中断),在查询到按键被按下后,进行工作状态的变化。此外,我们还需要一个蜂鸣器来使得交通灯有提醒功能,并且要和信号灯一起工作,在这里使用了线程库,在信号灯改变状态的同时开启一个新线程。这样就大致设计出本项目的程序运行过程了,具体请看后文解释。

6 实现过程

wps

while True:# 开始时设置红灯常亮,对电路板进行初始化,同时通过循环实现按键的查询机制
    r.on()
    if k1.value():#当按下按键后,芯片接收到信号请求,进行工作状态的变换,并在结束后重新初始化
        _thread.start_new_thread(buzzer_on, ())
        ASK()
        g.on()
        time.sleep(4)
        _thread.start_new_thread(buzzer_on, ())
        HURRY()
#以下是程序中定义的函数:

def ASK():#接收到按键请求后开始运行的,可以看出是红灯和黄灯闪烁
    for i in range(4):
        r.on()
        time.sleep(0.5)
        r.off()
        time.sleep(0.5)
    y.on()
    time.sleep(0.5)
    y.off()
    time.sleep(0.5)

def buzzer_on():#蜂鸣器控制函数,前4秒以500HZ鸣叫,每次持续0.5s,两次之间间隔0.5s,最后一次以700HZ鸣叫,持续一秒1s,最后一次鸣叫表示已经切换到红灯或者绿灯工作状态。
    for i in range(4):
        pitch(500,500)
        pwm.deinit()
        time.sleep(0.5)
    pitch(1000,700)
    pwm.deinit()

def HURRY():#绿灯倒计时催促函数
    for i in range(4):
        g.on()
        time.sleep(0.5)
        g.off()
        time.sleep(0.5)

 

该程序调用了附件中的LED、BUZZER和BUTTON

7 遇到的主要困难及其解决方法

本项目中遇到的主要困难就是如何让蜂鸣器和LED灯同时工作,解决方法为引入thread库,并执行 _thread.start_new_thread(function,(para1,para2,...)),该函数将创建一个新的线程,并且会立即返回一个无用的随机整数。它创建的线程将在其运行的函数返回后安静的退出。这样使得蜂鸣器和LED灯同时工作。

8 未来的计划建议

该项目已经成功实现了简易示波器和信号发生器的功能,并达到了预期指标。但是仍有可以改进的空间,比如使用扩展版上的ws2812b模组灯,但使用该模块有一个较明显的缺陷,即目前该模块在启动时,只能依次开启,对资源、时间占用较多,可以尝试寻找一种方法,将所有WS2812B灯同时开启。

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