基于树莓派Pico的嵌入式系统学习平台制作一个交通灯控制器
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
标签
嵌入式系统
树莓派PICO
2023寒假在家练
cc_134
更新2023-03-29
北京理工大学
543

内容介绍

一、项目描述

1.1 项目介绍

项目名称:制作一个交通灯控制器。

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

1.2设计思路

配置Thonny开发环境,使用microPython语言进行程序开发。

首先,需要利用板上的LED模拟交通灯,我选用WS2812B灯带的红、绿、黄三种颜色模拟交通灯,使程序依次轮流切换三个灯的状态,来实现对道路状态的控制。之后,在此基础上,引入板上的k1按键,按下此按键后,红灯将会延长一段时间,以便行人能及时通过人行横道,k1按键的引入是用来模拟现实生活中行人在人行横道两侧发出过马路请求的状态。

在实现了交通灯控制器的基本功能后,通过在生活中的观察和经验积累,我注意到在有些地方的红绿灯路口,当行人按下按钮发送过马路请求后,当行人可以通过人行横道时,会有类似“请行人尽快通过人行横道”的提示音响起,基于此,我引入buzzer蜂鸣器模块,在按下按钮的下一个红灯的延时时间内,蜂鸣器会响起,以提醒行人尽快通过人行横道,同时提醒车辆不要闯红灯。同时我利用起板上的OLED显示屏,在每个红灯亮起阶段显示该红灯亮起所持续的时间,当行人按下k1按钮发送过马路请求后,OLED显示屏上会显示红灯持续时间+5s。OLED显示屏会在红灯转换为绿灯时与红灯同步熄灭。

1.3程序流程框图

  FoJMdMwHuQNl_h9D8f2Gc4zXKEp7 

二、环境配置及硬件介绍

2.1 环境配置

thonny:

作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,能够实时反馈程序运行过程,在调试时显示变量值和函数调用过程,非常适合初学者学习嵌入式系统。

2.2 硬件介绍

本项目使用的是基于树莓派Pico的嵌入式系统学习平台,其专为嵌入式系统学习而设计,可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。

基于树莓派Pico的嵌入式系统学习平台包含以下内容:

 

板卡硬件包含以下内容:

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

 

其功能和管脚映射表如下图所示:

FniWrKp07dMwvs20LEeJjGJIPT0_

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

现的功能:

利用板上的12个WS2812B RGB三色灯的红、绿、黄三种颜色模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)状态调整交通灯的切换。按键的输入情况可分为三种
1.未按下k1按键,则灯带正常循环,循环顺序为10秒的红灯、10秒的绿灯、2秒的黄灯,在红灯点亮持续时间OLED显示屏上显示“Duration of the red light:10s”字样,OLED显示屏随红灯同步亮灭。

2.在交通灯为红灯时按下k1按键,则红灯会延长5秒,OLED显示屏上先显示“Duration of the red light:10s”字样,在延长的时间内则会显示“Duration of the red light:10s+5s”字样,蜂鸣器会触发,以提示行人尽快通过人行横道。

3.在交通灯为绿灯或黄灯时按下k1按键,则下一个红灯持续时间会延长5秒,同样在延长的时间内则会显示“Duration of the red light:10s+5s”字样,蜂鸣器会触发,以提示行人尽快通过人行横道。

图片展示:

FiPscDHsysLgcc9qnN4B3kLnnIRD

四、主要代码片段及说明

from button import button,k1
import time                          
import ws2812b                         
from machine import PWM, Pin
from board import pin_cfg
from oled import oled

该段代码功能:引入k1按键、时间模块、ws2812b灯带等完成项目所需要的模块及函数库。

pwm = PWM(Pin(pin_cfg.buzzer))

def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep_ms(duration)

该段代码功能是控制蜂鸣器发声频率及持续时间的函数,“buzzer”即为蜂鸣器。

green = "#00ff00"
red = "#ff0000"
yellow = "#ffff00"

def red_light():                     
    for i in range(1,13):
        ws2812b.on(i,red)      

def yellow_light():                  
    for i in range(1,13):
        ws2812b.on(i,yellow)

def green_light():                   
    for i in range(1,13):
        ws2812b.on(i,green)

该段代码中#xxxxxx指亮起的灯的颜色,用十六进制颜色代码值来表示。后面三个函数的功能是循环点亮12个彩灯,ws2812b.on(i,xxxxxx)语句作用:其中i指亮起的彩灯序号,后面指亮起的彩灯颜色。

def option_1():
    oled.text("Duration of the",0,0)
    oled.text("red light:",0,10)
    oled.text("10s",50,40)
    oled.show()

def option_2():
    oled.text("Duration of the",0,0)
    oled.text("red light:",0,10)
    oled.text("10s+5s",50,40)
oled.show()

编写了两种情况的函数,针对不同的k1按键情况,OLED显示屏上会显示不同的内容,分别为:显示“Duration of the red light:10s”(红灯持续时间:10s)或“Duration of the red light:10s+5s”(红灯持续时间:10s+5s)。

while True:
red_light()
option_1()
time.sleep(10)
oled.fill(0)
oled.show()
    if k1.value() == True:
        red_light()
        option_2()
        time.sleep(5)
        print("red light +5s start")
        for i in range(0,10):
            for freq in range(880, 1760, 16):
                pitch(freq, 6)
            for freq in range(1760, 880, -16):
                pitch(freq, 6)
        print("red light +5s end")
        pwm.deinit()                  #关闭蜂鸣器
        oled.fill(0)
        oled.show()

    green_light()
    time.sleep(10)
    yellow_light()
    time.sleep(2)

该程序是主程序,在每个红灯循环时,OLED显示屏上会显示“Duration of the red light:10s”,并且判断k1对应的按键是否被按下,如果按下,在原有的10秒红灯后,Thonny终端显示会“red light +5s start”,同时OLED显示屏上会显示“Duration of the red light:10s+5s”,提示红灯将延长5秒钟,蜂鸣器报警,以提醒车辆注意红灯,提醒行人尽快通行,结束后,Thonny终端显示“red light +5s end”,蜂鸣器关闭,OLED显示屏同步关闭;若k1对应按键不是在红灯所持续的时间内被按下,则它下一个红灯持续时间会延长5秒钟,OLED显示状态同上,蜂鸣器也会报警。

最下方四句代码实现的功能是:绿灯亮起10秒,再经过2秒的黄灯警示后,红灯再次亮起,如此循环往复。

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

虽然自己有一定的C语言编程基础,但在此前并未接触过microPython和嵌入式系统,也仅粗略了解过一点python语言,对于嵌入式系统编程语言的不熟悉使我的编写程序进程受到了一些阻碍。如书写程序时延时函数是time.sleep,但程序报错,在老师的讲解下我知道了使用该语句之前需要先引入time库。我意识到需要灵活使用库函数,才能使代码简洁明了。

同时在老师的指导下,我学会了查阅开源网站gitee的代码,并且分析每段代码的功能和意义,自己根据老师的讲解和查阅csdn网站等资料,掌握了OLED显示屏、ws2812b灯带和蜂鸣器模块的基本调用语句。

六、感想、未来的计划或建议等

通过本次在基于树莓派Pico的嵌入式系统学习平台上的学习,首先,我掌握了嵌入式系统的定义、发展过程、种类、特点,其次,通过自己动手编程操作实践,我掌握了MicroPython编程的特定语句来实现嵌入式系统的开发与应用,例如定义函数语句def,循环语句while true,随机数语句random,输出语句print,实现延时功能的语句time.sleep。同时我了解了使用一个模块前需要将其导入的概念,也学习到了树莓派Pico板上各个模块所对应的功能及其作用。本次活动既提高了我的动手实践能力,也提升了我的MicroPython编程技能水平,我感到受益匪浅。

未来我打算继续深入学习,使用树莓派Pico板上的其他模块实现不同的功能,如制作一个音乐播放器、制作一个时钟等,还将会更多地学习MicroPython编程语句,使用树莓派Pico板实现一些自己的新创意和点子,真正实现自由开发树莓派Pico板。

树莓派Pico板这一个板子看起来不大,但只要能灵活熟练使用MicroPython编程,就能在该嵌入式系统上实现不少的有趣又具有现实意义的应用,这大大激发了我的学习兴趣,如果有机会,我会再次关注电子森林的活动,继续提升自己的能力水平。

附件下载

button.py
所引用的模块
board.py
所引用的模块
control the traffic-lights.py
实现交通灯控制器功能的程序

团队介绍

来自北京理工大学通信工程专业,个人姓名:蔡思远
团队成员
蔡思远
北京理工大学,通信工程专业

评论

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