基于STEP Pico的嵌入式系统设计一个交通灯程序
本实验是基于STEP Pico的嵌入式系统的学习,经过选择我决定使用树莓派Pico的开发板和micropython语言设计一个交通灯程序
标签
嵌入式系统
显示
2023寒假在家练
风里希
更新2023-03-28
北京理工大学
737

1.项目描述

本实验是基于STEP Pico的嵌入式系统的学习,经过选择我决定使用树莓派Pico的开发板和micropython语言设计一个交通灯控制器

2.设计思路

实验计划使用开发板上的12个ws2812b彩色灯作为交通灯模型,以红绿黄三种灯色分别代表交通灯的颜色,在某一种交通灯亮时全部led灯均显示该颜色持续一段时间,随后根据现实交通规则进行变换,并根据按键的输入(中断或查询机制)调整交通灯的切换

3.流程原理图

FoPT6UC6q6i6vSuidYChfgRmwXuW

4.硬件介绍

FkgYNYazG-yPNidS2cE69LLjR127

基于树莓派Pico的嵌入式系统学习平台专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。板卡硬件由2个按键输入,4个单色LED,12个WS2812B RGB三色灯,1个姿态传感器,1个128*64 OLED显示屏,1个蜂鸣器,1个可调电位计(用于电压表),1路音频信号输入(用于示波器),8位R-2R电阻网络构成的DAC(用于DDS信号发生器)构成,下图为板卡的核心板引脚图

Fr0LZqlYRJyjUegx4BlQEhOszbRS

 

 

5.实现功能

12个ws2812bLED灯按照红绿黄灯依次变换,红灯和绿灯亮起时间均为5s,黄灯为2s,若按下k1按键,在红灯时将红灯时长增加5s和蜂鸣器发声,若为绿灯或者黄灯,则再下次红灯亮时增加5s和蜂鸣器发声

Fhubmln0kdM8MWIdxHxWxkkCR7S-FsuqLL0ZL4n5XSYS5TUT5Gj3yAIXFnVD_2xdP09eKPfc5svXKQ6xyukU

6.主要代码片段及说明

def red():
    for i in range(1,13):
        ws2812b.on(i,"#ff0000")
def yellow():
    for i in range(1,13):
        ws2812b.on(i,"#ffff00")
def green():
    for i in range(1,13):
        ws2812b.on(i,"#00ff00")

定义了三个函数方便控制三种颜色灯的变换

while True:
    red()
    time.sleep(5)
    if k1.value() == True:
        red()
        time.sleep(5)
        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()
    green()
    time.sleep(5)
    yellow()
    time.sleep(2)

主函数部分,包含灯色变换逻辑,k1为发送请求的按键,判断条件放置在红灯亮完之后,避免出现在红灯时按下k1后要到下一个循环才延长五秒的情况,if语句之中的循环为控制蜂鸣器开关的代码

pwm = PWM(Pin(pin_cfg.buzzer))

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

控制蜂鸣器的模块,能改变发声频率和发声时间

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

引用模块,包含了time库还有控制彩灯的ws2812b和按钮k1等开发板部件的模块

总体代码如下:

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

pwm = PWM(Pin(pin_cfg.buzzer))

def pitch(frequency,duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep_ms(duration)
    
def red():
    for i in range(1,13):
        ws2812b.on(i,"#ff0000")
def yellow():
    for i in range(1,13):
        ws2812b.on(i,"#ffff00")
def green():
    for i in range(1,13):
        ws2812b.on(i,"#00ff00")
while True:
    red()
    time.sleep(5)
    if k1.value() == True:
        red()
        time.sleep(5)
        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()
    green()
    time.sleep(5)
    yellow()
    time.sleep(2)

7.遇到的困难及解决方案

刚开始时不清楚k1按钮发送请求的判断时间,将if语句放置在红灯亮之前,然后会发现在本次循环红灯亮时按下k1,只有到下一次循环开始时红灯才会延长5s的时间,与现实不符,然后重新整理了一遍逻辑,明白了无论什么时候按下按键,程序都会将请求存储起来,当语句执行到if语句时就会进入条件语句,所以将if放置在红灯之后就能很好的解决这个问题。

8.未来的计划与建议

学习完成了该嵌入式系统的设计,我感觉对其产生了浓厚的兴趣,自己以后也希望学习更多的嵌入式开发经验,例如使用c/c++开发等等,未来找工作的方向也会向嵌入式靠拢。我对这次实验的建议是可以多多扩展学习的方向,不仅仅局限于micopython开发,而是让我们自主选择使用c/c++或者micopython进行开发。

附件下载
key_and_led.py
团队介绍
个人
团队成员
唐墨斌
北京理工大学2019级电子信息工程本科生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号