基于STEP Pico完成项目—制作一个交通灯控制器
利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据k1按键的输入调整交通灯的切换
标签
嵌入式系统
2023寒假在家练
STEP Pico
木白坤
更新2023-03-29
北京理工大学
350

一 硬件介绍

1.硬件主要部分

  • 树莓派Pico扩展板 x1
  • 硬禾版本树莓派Pico核心模块 - STEP Pico x1

FmkbOLBB6Wj8HfXt5h4MCXnyWRMq2.板卡硬件:

  • 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键,则直接结束绿灯,转入黄灯。

四 流程图

Fu7fqEi3bdzO5xGGlSg21WwcSQUw

五 主要代码片段说明

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)
FglL_v7_6hd8OT5v4H77GCYoolAC

红灯延长(此处有加速)
Fh2t7Ex9k9IIXszwl-hEejN98sii

绿灯中断(此处有加速,原本绿灯需闪烁三次,按下按键后只闪烁一次便结束绿灯)
lkTRpPZlKEoNB3iAF-wh2Qs4lbmb

七 遇到的主要难题和解决办法

1.如何完成灯带的闪烁

设置循环,持续时间为多少秒就循环几次灯带的亮和熄灭,每次循环使用1s时间

2.如何完成行人按键优先功能

在红灯和绿灯状态时分别加入判断

八 未来的计划和建议

1.尝试均匀灯带的亮起和熄灭时间
2.按下k1后同时报警和红灯闪烁

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