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灯常量
按下按键后,通过查询机制,经过倒计时后红灯熄灭,黄灯亮起,持续0.5秒
接下来,绿灯开始常亮5秒,再经过5秒倒计时,再次初始化电路板,接而LED灯恢复红灯常亮状态
4 实现思路
· 引入多线程工作模块,使得蜂鸣器和LED灯能同时工作
· 使用按键查询机制,在查询到按键被按下后,进入倒计时状态
5 设计思路
首先该程序应该使用一个循环来保证可以重复使用,然后思考,如何实现LED灯亮,在这里使用了预先编写的LED库(若没有,也可以对照引脚自己设置),因为需要在按下按键后实现工作状态的改变,所以采用了查询机制,即一个if判断语句结合引脚电压变化(也可以用中断),在查询到按键被按下后,进行工作状态的变化。此外,我们还需要一个蜂鸣器来使得交通灯有提醒功能,并且要和信号灯一起工作,在这里使用了线程库,在信号灯改变状态的同时开启一个新线程。这样就大致设计出本项目的程序运行过程了,具体请看后文解释。
6 实现过程
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灯同时开启。