基于STEP Pico的嵌入式系统学习平台设计一个交通灯控制器
基于STEP Pico的嵌入式系统学习平台设计一个交通灯控制器
标签
嵌入式系统
2023寒假一起练
交通灯控制器
Ricadro
更新2023-03-29
北京理工大学
408

一、项目设计思路

基于STEP Pico的嵌入式系统学习平台设计一个交通灯控制器,使用MicroPython进行编程。

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

设计思路:

(1)利用板上的12个三色灯模拟交通信号灯,程序会轮流切换三个灯的状态,模拟交通信号灯红、黄、绿三种颜色等的交替。

(2)利用板上的按键模拟行人按键,且行人按键时,具有优先功能,但不对本轮造成影响,即在下一轮时,延长一定红灯的时间,并在OLED显示屏提示,同时延长时间内点亮红色LED灯用以区分延时红灯和正常红灯。

(3)利用OLED显示屏,显示倒计时,红灯延长时间不进行倒计时。

设计流程图:

FvzZLvxQCf5_7otZgYikzZkpZYqz

二、硬件介绍:

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

树莓派Pico扩展板 x1

硬禾版本树莓派Pico核心模块 - STEP Pico x1

Type-C 数据线 x1

15节MicroPython配套课程 x1

FnVRe41HoSbmltZWwbjeMTnJAewf

板卡包括:

2个按键输入

4个单色LED

12个WS2812B RGB三色灯

1个姿态传感器

1个128*64 OLED显示屏

1个蜂鸣器

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

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

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

STEP Pico核心模块原理图:

Flc9hq0vDc3LjvRt99ijZClL2Fb0

环境配置:

1.编程软件:thonny平台

Thonny是专门针对python初学者量身打造的一款超级强大的编程学习类电脑软件,内置丰富的学习功能,该软件帮助用户通过简单的编程开发来学习到所有的Python编程语言,在短时间内完成入门学习。本次使用MicroPython进行编程。

FjnEwvZlVFjZo0asnvXt8iVl2gn8

2.项目发布平台:2023寒假一起练平台——基于STEP Pico的嵌入式系统学习平台

平台上详细介绍了项目基本信息,所使用板件的详细结构和功能,平台还包括免费提供学习的开源代码信息。平台的硬禾学堂还包括详细的15节MicroPython编程课程的学习,平台还有具体的项目开始和结束时间。

三.实现的功能及图片展示:

(1)利用板上的12个三色灯模拟交通信号灯,程序会轮流切换三个灯的状态,模拟交通信号灯红、黄、绿三种颜色等的交替。

FnTWJIIm7rRUAxeJ4AaiXddB2pAM

FlWiB1Scnx7oL9-1weX4-dVf1-Ua

Fq-ksAAF1C-NymnDtto2XuQe096n

如图板子上12颗灯可以显示出红、黄、绿三种颜色,并根据程序进行交替。

(2)利用板上的按键模拟行人按键,且行人按键时,具有优先功能,但不对本轮造成影响,即在下一轮时,延长一定红灯的时间,并在OLED显示屏提示,同时延长时间内点亮红色LED灯用以区分延时红灯和正常红灯。

FsATMjGd4YGnmfSke0pbCQbjnw_D

如图,按下按键后,下一轮红灯之前会先进行红灯延时部分,OLED显示屏上有相关提示,同时延时时间内红色LED灯被用以区分延时红灯和正常红灯。

(3)利用OLED显示屏,显示倒计时,红灯延长时间不进行倒计时。

如上图所示,OLED显示屏成功显示倒计时,且红灯延长时间内仅提示不进行倒计时。

四、主要代码片段及说明

1.点亮红,黄,绿灯

#点亮红,黄,绿灯
def red():
    ws2812b.on_all("#ff0000")
def yellow():
    ws2812b.on_all("#ffff00")
def green():
    ws2812b.on_all("#00ff00")

定义函数,具体分别实现点亮红,黄,绿灯的功能

2.屏幕显示

#屏幕显示
def print_a(a):
    oled.text(a,0,30)
    oled.show()
    oled.fill(0)

定义函数,实现屏幕显示的功能。

3.屏幕显示倒计时

#屏幕显示倒计时
def loop(t):
    for i in range(t):
        print_a("0"+str(t-i))
        time.sleep(1)

定义一个循环函数,每次运行持续时间为一秒并在屏幕显示循环剩余次数,从而达到倒计时的功能。

4.按键功能

if k1.value() == True: #判断行人是否按下按钮
        r.on()
        red()
        print_a("red +8s")
        time.sleep(8)
        r.off()

首先判断是否按键,确认按键后首先点亮红色LED灯,同时将十二枚三色灯也点亮为红色,OLED显示屏同时给出延时提示,延时结束后关闭红色LED灯继续进行后续程序。按键功能只干涉下一轮循环,不会对当前循环造成影响。

5.红绿灯正常运行

red()                 #红绿灯正常运行
    loop(8)
    yellow()
    loop(2)
    green()
    loop(8)
    yellow()
    loop(2)

此部分为红绿灯正常运行程序,依次点亮红黄绿黄灯。并进行倒计时。

6.整体代码:

import time
import ws2812b
from button import k1
from oled import oled
from board import pin_cfg
from led import r

#点亮红,黄,绿灯
def red():
    ws2812b.on_all("#ff0000")
def yellow():
    ws2812b.on_all("#ffff00")
def green():
    ws2812b.on_all("#00ff00")
#屏幕显示
def print_a(a):
    oled.text(a,0,30)
    oled.show()
    oled.fill(0)
#屏幕显示倒计时
def loop(t):
    for i in range(t):
        print_a("0"+str(t-i))
        time.sleep(1)

while True:
    if k1.value() == True: #判断行人是否按下按钮
        r.on()
        red()
        print_a("red +8s")
        time.sleep(8)
        r.off()
    red()                 #红绿灯正常运行
    loop(8)
    yellow()
    loop(2)
    green()
    loop(8)
    yellow()
    loop(2)

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

实验项目的具体内容相关课程已经做了详细的介绍,这次遇到的难题是怎样利用OLED显示屏进行倒计时,开始不知道该怎样编写函数,最后利用单个小循环函数的方式,成功在OLED屏幕上显示了倒计时。

五、未来的计划或建议

就这次的板卡而言实现所需的功能已经绰绰有余,而且有更多功能等着我去学习利用。未来可能会利用平台学习更多相关且有趣的知识,希望平台能继续丰富硬件板卡以及相关课程,给我们带来更多丰富有趣的学习体验。

附件下载
具体代码以及库函数.zip
团队介绍
单人
团队成员
Ricadro
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号