使用STEP Pico的嵌入式系统制作一个交通灯控制器
利用STEP Pico的嵌入式系统制作一个交通信号灯,需要仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,并且行人按键时,具有优先功能。
标签
嵌入式系统
测试
2023寒假在家练
bit1120190290
更新2023-03-29
北京理工大学
432

使用STEP Pico的嵌入式系统制作一个交通灯控制器

一、项目需求

利用STEP Pico的嵌入式系统制作一个交通信号灯,需要仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,并且行人按键时,具有优先功能。利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入调整交通灯的切换。

二、环境配置

   1、编程环境thonny:

作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者。可直接到其官网下载安装Thonny, Python IDE for beginners

   2、硬件介绍:基于树莓派Pico的嵌入式系统学习平台

平台包含:

板卡硬件:

  • 2个按键输入
  • 4个单色LED
  • 12个WS2812B RGB三色灯
  • 1个姿态传感器
  • 1个128*64 OLED显示屏
  • 1个蜂鸣器
  • 1个可调电位计(用于电压表)
  • 1路音频信号输入(用于示波器)
  • 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

功能及管脚映射:

bRsrKwgr2tHWqUqYwOzduhsI8QQupTgTpEL12yBFHR0folIhlBn8fshgcTEckIKkPUMiby4aB7QNFJbGyF0KwZkSNi2ECyMhkJNCKXSsU7TYmIiIjkJqjDiFwmg4W5BRSWVvyviIiIiMinTY6KYREREREREREREZHchNj+IyIiIiIiIiIi8tkiimEREREREREREZHPFlEMi4iIiIiIiIiIfLaIYlhEREREREREROSzRRTDIiIiIiIiIiIiny2iGBYREREREREREflsEcWwiIiIiIiIiIjIZ4sohkVERERERERERD5bRDEsIiIiIiIiIiLymQL8Hw2VUMvgT17BAAAAAElFTkSuQmCC

STEPPico核心模块原理图

RrRAAAAAElFTkSuQmCCpT01rn0xyAwAAAAASUVORK5CYII=

三、设计思路

要设计一个交通信号灯,首先要确定要使用板卡的哪些硬件来实现交通信号灯的基本功能,首先是板卡上的LED灯,此处选用扩展板上的WS2812B的所有灯来同时作为交通信号灯,首先需要编写库函数来调用WS2818B的LED灯引脚,对相关亮度与显示时间等进行初始设置,然后才能对其进行调用。

之后我们通过编写特定代码使其能够进行“红-黄-绿-黄-红”的循环变化,还要对变化时间进行一定程度的规划。此外我们还需要实现行人按键时令交通信号灯进行一定程度上的优先变化,考虑到交通安全,不能在车辆行驶时突然切换信号灯,所以我们计划在按下按键后将对下一个红灯进行延长,并鸣笛示意司机耐心等待。此处将编写并调用函数实现模块的中断功能以及对板卡的蜂鸣器进行调用。

四、软件流程图

FnpiH-GvqKG6KEO3oj6-8ZgcC1bF

五、实现的功能及图片展示

运行程序,板卡即刻开始进行运作,板卡上的LED灯进行“红-黄-绿-黄-红”的交替变化,为了便于检测,设定红灯和绿灯持续时间为5秒,黄灯持续时间为2秒。

ZZZ

当按下板卡上的K1,会使下一次红灯的持续时间延长5秒,且期间蜂鸣器会进行鸣笛。(详见视频)

六、主要代码片段及说明

设置LED灯参数,使其能够输出各种颜色

def ws2812():

def on(n, color = "#ffffff"):

if not ((n >= 1 and n <= 12) and isinstance(n, int)):

print("arg error")

return

set_24bit((n - 1) % 12, color)

update_pix()

使LED灯输出红黄绿三种颜色的光

def red_light():

for i in range(1, 13):

ws2812b.on(i, "#ff0000")

def yellow_light():

for i in range(1, 13):

ws2812b.on(i, "#ffff00")

def green_light():

for i in range(1, 13):

ws2812b.on(i, "#00ff00")

使LED灯进行“红-黄-绿-黄-红”的循环

while True:

red_light()

time.sleep(5)

yellow_light()

time.sleep(2)

green_light()

time.sleep(5)

yellow_light()

time.sleep(2)

设置按键响应,检测到按键按下时进行延长红灯,并使用蜂鸣器进行鸣笛:

if k1.value() == True:

red_light()

for i in range(10):

for freq in range(880, 1760, 16):

pitch(freq, 6)

for freq in range(1760, 880, -16):

pitch(freq, 6)

pwm.deinit()

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

这次我们做的项目比较简单,难点主要在于学习MicroPython编程语言,因为此前并没有学习过相关知识,所以开始学习时遇到了许多语法和库函数调用上的问题,随着课程的进行,对这门编程语言的运用逐渐熟练,这类错误也逐渐减少。

除此之外还有板卡的引脚对应关系问题,以及如何使用板卡的各个功能,虽然有相关课程,但也反复试错了许多次。课程中有很多相关的库函数代码,也有一些板卡引脚设置的代码,这些起到了很大的帮助。

八、未来的计划或建议

本次项目做的交通信号灯还有很多不足,例如可以再加一些代码使其能够调节各个颜色的灯的持续时间,比如在绿灯时更早的变为红灯等;还可以在蜂鸣器上做文章,使其在某些特定的时刻进行鸣笛,以警示过往车辆及行人;也可以使蜂鸣器在红黄绿三种不同的灯亮起时进行不同频率的鸣笛,使盲人也能知道此时能否通过。

作为交通信号灯而言,可能不仅需要定时循环红黄绿灯,也需要能够在发生交通事故时或其他特殊事件时亮起特定的颜色,后续可以编写程序使按下某个按键使板卡亮起某一特定的灯光或者响起特定铃声。

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