基于树莓派的交通灯控制系统
基于树莓派Pico的嵌入式系统,仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,用k1按键,模拟行人按键,当行人按按键时具有优先功能,根据查询机制,会变成红灯让行人通过,并且从红灯开始继续循环。
标签
树莓派
嵌入式系统
2023寒假在家练
yxy
更新2023-03-28
北京理工大学
462
  • 项目介绍

基于树莓派Pico的嵌入式系统,仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,利用板子上的k1按键,模拟行人按键,当行人按按键时具有优先功能,根据查询机制,会变成红灯让行人通过,并且从红灯开始继续循环。

  • 设计思路

构建一个状态机,通过按键改变中间变量x,当x=1时红灯亮并且持续5秒,切换至下一个状态x=2,当x=2时绿灯亮,持续5秒,并且切换到x=3,当x=3时黄灯亮持续3秒,并且切换回x=1,期间每个状态在执行时间延迟前后都要检验是否按下按键,如果按键被按下那么切换到x=1的状态。利用回调函数当按键按下时,在命令行中打印“已按下按键”,以检测按键功能是否完善。

  • 框图和软件流程图
  • FrgzU6zDQGjt5IVznFsUdAZj9SRa

四、硬件介绍

基于树莓派Pico的嵌入式系统,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。

板卡硬件:

2个按键输入

4个单色LED

12个WS2812B RGB三色灯

1个姿态传感器

1个128*64 OLED显示屏

1个蜂鸣器

1个可调电位计(用于电压表)

1路音频信号输入(用于示波器)

8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex MO+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。

  • 实现的功能及图片展示

红灯亮

Fi-FzFBL_1xy5qUF4lZK79iAUYdX

绿灯亮

Frqn5Mt9UPI-fJI9AxQEptMlEu_-

黄灯亮

Fo_cAVtbmukz5Zr2hENRwxwaSxzP

  • 主要代码片段以及说明
def red_light():

    for i in range(1,13):

        ws2812b.on(i,"#ff0000")

分别设置红黄绿色,13个灯轮流亮起的函数,因为时钟很快所以视觉上是同时亮起。

颜色选择:采用16进制,从左到右每两位为ff表示加入一种颜色,从左到右一次为红绿黄三种颜色。比如黄色为ffff00。

while True:

    if k1.value() == True:

        x = 1




    if x== 1:

        red_light()

        x=2

        if k1.value() == True:

            x = 1

        time.sleep(2)

        if k1.value() == True:

            x = 1




    if k1.value() == True:

        x = 1

     




    if  x==2:

        green_light()

        x=3

        if k1.value() == True:

            x = 1

        time.sleep(2)

        if k1.value() == True:

            x = 1




    if k1.value() == True:

        x = 1







    if x == 3:

        yellow_light()

        x=1

        if k1.value() == True:

            x = 1

        time.sleep(1)

        if k1.value() == True:

            x = 1




    if k1.value() == True:

        x = 1

通过中间变量x的值控制信号灯的切换

当x=1时红灯亮

检测按键状态,当检测到按键下降沿时,x赋值为1

点亮5秒

检测按键状态,当检测到按键下降沿时,x赋值为1

x=2

 

当x=2时绿灯亮

检测按键状态,当检测到按键下降沿时,x赋值为1

点亮5秒

检测按键状态,当检测到按键下降沿时,x赋值为1

x=3

 

当x=3时黄灯亮

检测按键状态,当检测到按键下降沿时,x赋值为1

点亮3秒

检测按键状态,当检测到按键下降沿时,x赋值为1

x=1

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

1、一开始没有把调用的包拷到板子上,只是存在同一个目录里,后来报错后下载到板子上。

2、中断回调函数里边的变量传递不到主循环里,但是我发现k1的检测值是否为1,在主循环里可以被检测到,所以就通过在主循环里时刻检测k1的方式来模拟查询操作。最开始的思路是通过中断函数设置一个flag,如果按下去,我中断函数会让一个变量值为1,然后值为1的话,在主循环中检测这个变量,如果等于1,就让红灯亮,然后这个循环,但是发现这个回调函数的参数不能传递到主循环中,所以就用了实时检测k1的方式来进行查询,它是否按下去。

 

  • 未来的计划或建议

通过假期对树莓派的学习,让我对micropython这个简单的语言产生了浓厚的兴趣,会继续利用好树莓派,实现新的功能。同时还会学习像FPGA等一系列其他硬件。

 

附件下载
trafficlight.py
源代码
调用的包.zip
团队介绍
杨馨泱北京理工大学
团队成员
杨馨泱
希望通过的白菜
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号