基于STEP Pico实现交通灯控制器
仿真交通灯的工作状态切换,用WS2812B RGB三色灯的不同状态显示道路状态的切换,行人按键时,具有优先功能。
标签
嵌入式系统
交通灯模拟
自适应调节
Chen_Yizhi
更新2023-04-06
北京理工大学
422

任务要求:

         利用板上的WS2812B RGB三色灯模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换。

 

环境配置:

   1、基于STEP Pico的嵌入式系统学习平台

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

   2、Thonny:

         Thonny的调试器是专为学习和教学编程而设计的,针对初学者学习Python语言优化了很多工具上的方式和方法。Thonny有很多适合初学者的优点,如:调试的时候显示变量的值。例如在循环运行的过程中,可以在代码中直接高亮显示当前变量的值,在编程的过程中更容易了解变量的变化和计算过程,有利于更加直观地理解循环及变量。调试时,直观显示函数的调用过程;Thonny的包管理器可以图形化的搜索第三方包,然后进行加载并管理;在Python的解释器中选择不同的解释器,Thonny就会自动切换不同的开发模式,以方便当前硬件的开发。

         Thonny针对学习Python而设计的诸多优化点,能够让使用者更好地理解代码的运行、深入计算机交互和使用语言完成任务。

 

设计思路:

         除了对交通灯基础功能——模拟交通灯运行,以及通过按键控制灯的切换时间——的实现之外,本次设计的重点放在了侧重于实用性的方面,即在实际生活中可能使交通灯变得更加实用的设计。

         实际中的十字路口由于时间段的不同(如早晚高峰),各个方向的车流量会发生很大的变化。如采用固定的红绿灯时长,就很可能由于交通状况的变化而产生通行时间的浪费,导致路口整体的效率降低。因此考虑用路口的摄像头获取该方向的车辆通行情况,判断其交通状况,并用指数滑动平均值的方式给出实时评价。通过这种方式对红绿灯时长进行及时调整,使其更好地适应当前情况,提高路口的通行效率。

 

流程图:

Fk-LQyRJ6jRH1n9X4OdRywn-3f5H

 

程序实现:

1、基本功能

         利用板上WS2812B RGB三色灯的不同状态模拟交通灯。WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源,内置RGB三色灯珠,每个灯珠控制需要24位数据,8Bit绿色亮度+8Bit红色亮度+8Bit蓝色亮度。多个灯珠组合在一起可形成灯带,灯带上的灯珠供电并联,灯珠根据自己锁存的数据完成对RGB三色灯的控制。本次实验中用WS2812B实现红、黄、绿三种颜色的交通灯,绿灯临近结束时会通过闪烁提示行人,并在结束后切换至黄灯作为过渡;红灯转变为绿灯则不设置黄灯。在多方向交通灯协作运行的系统中,对于互斥的方向,每个方向的红灯时间覆盖另一方向的绿灯和黄灯时间,保证各方向安全运行。

         根据按键的输入调整交通灯的切换。当行人在红灯状态下按下按钮时,如果此时剩余时间较长且车流量指标较低,则可以缩短红灯的剩余时间,以提高通行效率。

def apply(time_remain, ema_traffic_flow):
    if time_remain>5 and ema_traffic_flow<0.5:
        print('Time reduces, remains =', time_remain-3,'s.')
        return 1
    else:
        return 0

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")
def green_blink(n):
    for i in range(0, n):
        for i in range(1, 13):
            ws2812b.on(i, "#00ff00")
        time.sleep(0.3)
        for i in range(1, 13):
            ws2812b.off(i)
        time.sleep(0.1)

while True:
    green()
    time.sleep(3)
    green_blink(5)
    yellow()
    time.sleep(2)
    red()
    j = 0
    while j<15:
        time.sleep(1)
        j += 1
        if k1.value()==True:
            if apply(15-j, ema_traffic_flow):
                j += 3

 

2、实际应用设计

         EMA是指数移动平均值,它是一种趋向类指标,指数移动平均值是以指数式递减加权的移动平均。EMA的公式为:EMAn+1=α * an+1 + ( 1 - α ) * EMAn ,各项数值的权重随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权,只是相对不如近期数据重要。EMA指标的原理与MACD指标、DMA指标相比,EMA指标由于其计算公式中着重考虑了当次数据的权重,因此指标自身的计算公式决定了作为一类趋势分析指标,它在使用中克服了MACD指标信号对于数据走势的滞后性,同时也在一定程度上消除了DMA指标在某些时候对于数据走势所产生的信号提前性,是一个非常有效的分析指标。 
         由 EMA 的定义式可以推导出递推计算式,在计算机做递推计算时,可以直接从 EMANx1)=x1开始递推,计算效率比较高,而不必按照定义去计算一个无穷和。
         在计算车流量的指标时,指数移动平均值会“记录”一段时间内的指标,即由于其“递推”的计算方式,当前时刻之前一段时间的指标都会对当前时刻产生作用,直到它们反复减小至可以忽略不计。这就使得我们在计算交通拥堵程度的时候,综合考虑了此前一段时间的情况,给出的评估更加稳定,不会因为某一次特殊情况而导致下一次产生误判。
         在EMA指标的设计中,对用于计算的每一项指标选择了sigmoid函数。Sigmoid函数取值范围为(0,1),它可以将整个实数集映射到(0,1)的区间内,因此可以自然将表示交通拥堵程度的数据归一化,进而使EMA指标也是归一化指标,可以很方便地作为系数用于其他计算。
def ema(ema_traffic_flow, n_pass, n_wait):
    q = sigmoid(0.5*(n_wait - n_pass))
    ema_traffic_flow = 0.4*q + 0.6*ema_traffic_flow
    return ema_traffic_flow

 

         在设计红绿灯的时长时,选择了使用双曲正切函数,即tanh()。双曲正切函数是奇函数,且在整个实数域是单调递增函数,这也就意味着它的函数值可以直接反应其自变量的变化趋势。因此可以被用于调整时间的增减,如将红灯和绿灯的基准时间都设定为40秒,然后跟据先前计算出的EMA车流量指标计算增(减)量,以达到实时调节的效果。由于现实情况中某一时间段内的车流量不会出现太大变化,每轮红绿灯周期更新一次数据,可以很大程度地适应当前的交通状况,以求提高通行效率。

         双曲正切函数的图像夹在水平直线y=1及y=-1之间,当x的绝对值很大时,它的图形在第一象限内接近于直线y=1,而在第三象限内接近于直线y=-1。有界性使其变化幅度被限制在一定限度内,如变化幅度上限为10秒。虽然由于计算方式的适应性,即使不过多限制时间改变量也能在后续调整中平衡,但需要留出基本通行时间。双曲正切函数在自变量靠近0时斜率较大,因此将概率分布最集中的情况缩放至这一范围,如x∈(-2.5, 2.5),使其对自变量变化更敏感。

def duration_green(ema_traffic_flow):
    t_green = 35 + 10*tanh(6*(0.5 - ema_traffic_flow))
    return t_green

def duration_red(ema_traffic_flow):
    t_red = 40 + 10*tanh(6*(ema_traffic_flow - 0.5))
    return t_red

 

功能展示:

FhwkfzyZ7vUJl_UFmae4L_CpXTNh

FtYbGcVRhWF2cNuhxI71GQ4PjMBo

 

附件下载
traffic_light.py
代码
团队介绍
北京理工大学学生,嵌入式系统初学者。
团队成员
Chen_Yizhi
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号