一 硬件介绍
1.硬件主要部分
- 树莓派Pico扩展板 x1
- 硬禾版本树莓派Pico核心模块 - STEP Pico x1
2.板卡硬件:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
3.STEP Pico
STEPPico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容RaspberryPi Pico)。硬件上,采用RaspberryPi官方自主研发的RP2040微控制器芯片,搭载ARMCotexM0+双核处理器,高达133MHz的运行频率,内置了264KBSRAM 和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C+SDK,或者使用MicroPython进行开发, 且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
STEP Pico的板载资源:.
尺寸:21mmx51mm | 264KB片上SRAM |
芯片:RP2040微控制器芯片 | 2MB 板上QSPI Flash |
处理器:双核ArmCortex-M0+ 最高可运行到133MHz | 26GPIO管脚(含3个模拟输入) |
供电电压:1.8-5.5V直流 | 2x UART |
工作温度:-20°C到+85℃ | 2xSPI控制器 |
片上有加速的整型和浮点库 | 2xI2C控制器 |
邮票孔模块可直接焊接到载板 | 16xPWM通道 |
使用USB存储模式进行拖拽编程 | 1xUSB1.1控制器以及PHY 支持host和device模式 |
低功耗sleep和dormant模式 | 8x可编程I/O(PIO)状态机 用于定制化外设支持 |
准确的片上时钟 | 温度传感器 |
二 项目介绍
1.项目要求
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
2.实现方式
利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换。
3.项目分析
①交通灯基本功能:红黄绿三种颜色的切换
红灯亮起,禁止通行 → 红灯熄灭,黄色LED亮起,交通状态即将改变
→ 黄灯熄灭,绿色LED亮起,可以通行 → 绿灯熄灭,黄灯亮起,交通状态即将改变
→ 黄灯熄灭,红灯亮起,进入新一轮循环
②行人按键,具有优先功能
在红灯期间按键,延长红灯时间;绿灯期间按键,提前结束绿灯状态。
三 设计思路
首先先编写程序完成基本的红绿灯功能,完成红灯→黄灯→绿灯→黄灯→红灯的循环。然后在红灯状态中加入判断,如果按下k1键则在原本红灯时间结束后进行短暂报警,并延续一段时间红灯后再进入黄灯状态。同时,在绿灯状态中也加入一个判断,如果按下k1键,则直接结束绿灯,转入黄灯。
四 流程图
五 主要代码片段说明
def red_light(t):
r.on()
g.off()
y.off()
for h in range(t):
for i in range(1, 13):
ws2812b.on(i, "#ff0000")
for j in range(1, 13):
ws2812b.off(j)
time.sleep(1)
红灯控制 ,红色led灯亮起,黄绿灯熄灭,灯带每秒闪烁红灯一次
def yellow_light(t):
r.off()
g.off()
y.on()
for h in range(t):
for i in range(1, 13):
ws2812b.on(i, "ffff00")
for j in range(1, 13):
ws2812b.off(j)
time.sleep(1)
黄灯控制 ,黄色led灯亮起,红绿灯熄灭,灯带每秒闪烁黄灯一次
def green_light(t):
r.off()
g.on()
y.off()
for h in range(t):
for i in range(1, 13):
ws2812b.on(i, "#00ff00")
for j in range(1, 13):
ws2812b.off(j)
time.sleep(1)
if k1.value() == True:
break
绿灯控制,绿色led灯亮起,红黄灯熄灭,灯带每秒闪烁绿灯一次。如果期间按下k1键,则直接中断循环
pwm = PWM(Pin(pin_cfg.buzzer))
def pitch(frequency, duration=0):
pwm.freq(frequency)
pwm.duty_u16(3000)
def charge():
if k1.value() == True:
for i in range(1, 13):
ws2812b.on(i, "#ff0000")
for i in range(2):
for freq in range(880, 1760, 16):
pitch(freq, 6)
for freq in range(1760, 880, -16):
pitch(freq, 6)
pwm.deinit()
red_light(5)
报警子函数,(红灯期间)如果按下k1键,则短暂报警,然后延续一段时间红灯状态
import time
import ws2812b
from led import r, g, y, b
from button import k1
from machine import PWM, Pin
from board import pin_cfg
while True:
red_light(5)
charge()
yellow_light(2)
green_light(5)
yellow_light(2)
主函数,调用资源文件和子函数,实现功能
六 功能展示
红绿灯的基本功能(此处为方便展示,红黄绿三个状态都只持续1s)
红灯延长(此处有加速)
绿灯中断(此处有加速,原本绿灯需闪烁三次,按下按键后只闪烁一次便结束绿灯)
七 遇到的主要难题和解决办法
1.如何完成灯带的闪烁
设置循环,持续时间为多少秒就循环几次灯带的亮和熄灭,每次循环使用1s时间
2.如何完成行人按键优先功能
在红灯和绿灯状态时分别加入判断
八 未来的计划和建议
1.尝试均匀灯带的亮起和熄灭时间
2.按下k1后同时报警和红灯闪烁