基于STEP Pico制作模拟红绿灯
使用STEP Pico嵌入式开发板套件完成模拟红绿灯的制作及调试。
标签
嵌入式系统
MicroPython
PICO
RP2040
2023寒假在家练
好大一只荣哥哥
更新2023-03-28
291

一、项目选择

本次选择项目2 - 制作一个交通灯控制器

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

二、软硬件简介

软件部分:

本次项目根据教程使用的是官方推荐的开发软件thonny,目前使用感受:简洁,无需复杂配置,安装好即可开始使用,上手难度极低。

Fine2TE6eh2jfN4GfBcV4LT0C1vS

硬件简介:

1-扩展板硬件资料:

2个按键输入

4个单色LED

12个WS2812B RGB三色灯

1个姿态传感器

1个128*64 OLED显示屏

1个蜂鸣器

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

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

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

2-核心模块:

硬禾版本树莓派Pico (RP2040主控)

3-配套数据线(看到好多小伙伴数据线有问题,我还是直接使用硬禾平台官方认证版)

 

三、程序流程图:

               FuumYko8dX3cmcyKLGPWqUZdexZz

四、实现部分:

首先将开发板和电脑连接,在thonny中选择对应串口。

根据笛子老师的入门课程,将编写好的库和类文件(bsp文件夹内容)复制到Pico中。

然后我们将需要用到的按键button, 时间 time,彩灯ws2812b,oled库文件导入。

from button import k1, k2
import time, ws2812b
from oled import spi,oled

参考例程中初始化先清除屏幕显示。

oled.fill(0)

接下来使用了三个自定义函数将主循环的代码进行了缩减,分别是stay_on_led_1和stay_on_led_2实现红绿灯长亮和红黄灯长亮、屏幕倒计时。使用flashing_led实现单向的绿灯闪烁、屏幕倒计时。

 

def flashing_led(rgb_1,rgb_2,color,flash_num):#
   for i in range(flash_num+1,1,-1):
        oled.fill(0) 
        ws2812b.off(rgb_1)
        ws2812b.off(rgb_2)
        oled.text(str(i),55,25)
        oled.show()
        time.sleep(0.5)
        ws2812b.on(rgb_1,color)
        ws2812b.on(rgb_2,color)
        time.sleep(0.5)
def stay_on_led_2(rgb_1_1,rgb_1_2,color_1,stay_time,rgb_2_1,rgb_2_2,color_2):
    x1 = 4
    x2 = 4
    if stay_time ==1:
        x1 = 0
        x2 = 0
    else:
        if k2.value() == True:
            x1= x1 + 3
            print("--k2 is pressed--")#k2检测到按下之后下一次竖向绿灯将延长3秒
            print(x1)
    for i in range(stay_time+x1, x2, -1):从大到小显示倒计时,显示闪烁前绿灯长亮和闪烁后黄灯亮的计时,staytime+x1默认为9,按下k2则变化,x2为相对固定值,绿灯长亮时为4,黄灯亮起时为0
        oled.fill(0)
        ws2812b.on(rgb_2_1,color_2)
        ws2812b.on(rgb_2_2,color_2)
        oled.text(str(i),55,25)     
        oled.show()
        time.sleep(0.6)#纵向红灯亮起延迟0.6秒横向变绿
        ws2812b.on(rgb_1_1,color_1)
        ws2812b.on(rgb_1_2,color_1)
        time.sleep(0.4)       
def stay_on_led_1(rgb_1_1,rgb_1_2,color_1,stay_time,rgb_2_1,rgb_2_2,color_2):
    x1 = 4
    x2  =4
    if stay_time ==1:
        x1 = 0
        x2 = 0
    else:
        if k1.value() == True:
            x1= x1 - 2 #x的计算值不可小于0,否则会出现双向绿灯
            print("==k1 is pressed==")#k1检测到按下之后下一次竖向绿灯将延长3秒
            print(x1)
    for i in range(stay_time+x1,x2,-1):
        oled.fill(0)
        ws2812b.on(rgb_1_1,color_1)
        ws2812b.on(rgb_1_2,color_1)
        oled.text(str(i),55,25)
        oled.show()
        time.sleep(0.6)#横向红灯亮起 延迟0.6秒纵向变绿
        ws2812b.on(rgb_2_1,color_2)
        ws2812b.on(rgb_2_2,color_2)
        time.sleep(0.4)

长亮自定义函数中定义了x1和x2两个临时变量,x1主要为默认状态(按键无操作)下,倒计时开始的循环次数,x2主要用于确定倒计时结束时的循环次数。

主循环中采用自定义函数进行。

while True:  
    #ws2812b.on(12,"ffffff")#白色
    #ws2812b.on(1,"00ff00")#绿色
    #ws2812b.on(2,"0000ff")#深蓝
    #ws2812b.on(3,"00ffff")#青色
    #ws2812b.on(4,"ffff00")#黄色
    #ws2812b.on(5,"ff00ff")#紫色
    #ws2812b.on(5,"00ff00")#红色

    stay_on_led_1(12,6,"ff0000",5,3,9,"00ff00")#纵红 横绿,参数依次为指定12、6号led,12、6的颜色,共同持续时间,指定3、9号led,3、9的颜色
    flashing_led(3,9,"00ff00",3)#横绿 闪烁,参数依次为指定3、9号led,颜色,闪烁次数
    stay_on_led_2(12,6,"ff0000",1,3,9,"ffff00")#纵红 横黄
    stay_on_led_2(12,6,"00ff00",5,3,9,"ff0000")#纵绿 横红
    flashing_led(12,6,"00ff00",3)#纵绿 闪烁
    stay_on_led_1(12,6,"ffff00",1,3,9,"ff0000")#纵黄 横红
    time.sleep(0.1)

演示过程示例:

FsEVH4N3TQ_YhzaIaOm-FQF9JATIFmfK2cRZK5ZkTkX8MCRfrmXKb-Gs

五、遇到的主要难题(懒)

第一次学习使用MicroPython,感受最大的是pyhton对缩进的要求非常严格,刚开始遇到提示错误,找了一会才发现是空格导致缩进不齐。

之前主要是将各种功能全部写入到大循环中,这次尝试了自定义函数,发现自定义函数真的让代码会看起来整洁很多,但是涉及修改的话对于注释比较少的情况下还是比较麻烦的。

对于此次项目,目前存在时间延迟不是很准确,笛子老师演示过程中就存在使用for循环点亮12个led时候,代码执行产生的延迟很明显。虽然本次项目观察实际运行效果,延迟不是很明显,但自我感觉优化和提升空间还是比较大的。

此次Pico的双核双线程并没有体现出来,还需要再根据课程实践学习。

 

六、未来计划:

通过学习MicroPython编程,发现入门还是比较简单的,尤其对于新手来说,从各种应用和示例中修改可以很快实现自己的项目,但是要写出效率较高的代码还是需要经验的积累。未来还是多多抓住机会,督促自己主动学习,再实践一下更有趣的项目。

 七、项目学习资料

开源代码:https://gitee.com/picospuch/eetree-mpy-lecture-code

附件下载
好大一只荣哥哥.zip
团队介绍
好大一只荣哥哥,又菜又爱玩
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号