[其它] FireBeetle 2 ESP32 P4 开发板的WS2812彩色灯带驱动控制

[复制链接]
431|0
Lily李 发表于 2025-9-29 21:03 | 显示全部楼层 |阅读模式
本帖最后由 Lily李 于 2025-9-29 21:08 编辑

申请原创
@21小跑堂


WS2812是一种将控制电路和RGB发光器件集成在一起的组件,其主要特点是采用单总线控制结构,仅需一根信号线就可将多个器件串联起来加以控制,其电路形式如图1所示。
6196468da812a37945.png
1 电路形式


WS2812的工作电压为3.5-5.3V ,其功耗约为0.3W
在每个WS2812中,内置了信号整形电路,因而其信号质量不会因传输距离的增加而出现衰减。

每个WS2812是独立编程的,可实现全彩显示。

由于其采用单总线工作方式,其采用的数据协议为单线归零码通讯,数据传输速率为800Kbps
其数据输入电压为:高电平0.7VDD,低电平≤0.3VDD刷新频率400Hz


WS2812B采用特殊的时序协议控制:

每个WS2812具有24位数据,即8位绿色,8位红色,8位蓝色数据采用NRZ编码(非归零编码)其各位数据的排列顺序见图2所示
8409468da813f67685.png
2 数据排列顺序


0码:高电平0.4µs + 低电平0.85µs
1码:高电平0.8µs + 低电平0.45µs

7432968da81578399b.png
3 编码与信号时长占比


复位信号为低电平持续50µs以上 见图4所示。

2041268da816b20de4.png
4 信号波形关系

5128568da817ded282.png
5 器件间信号传递关系


每个WS2812在全亮时,约消耗60mA电流,当使用多个WS2812,需要足够功率的电源,
建议每30LED增加一个1000µF电容滤波。数据线较长时,建议增加100Ω电阻
在大电流工作时,会产生热量,由此在高密度、长时间工作时,需要考虑散热措施。

在使用python进行编程的情况下,通过调用相应的库函数即可便捷地实现控制目标。
实现7个彩色灯位WS2812B控制的程序为:
1060968da818fc460f.png
4972868da8199ef2ba.png
2379668da81a3ab6c3.png
经程序的上传,其彩色效果如图6至图11所示。
8283568da81b4587e2.png
6 红色效果

2674568da81c58eef0.png
7 绿色效果

5347368da81d9bebc0.png
8 蓝色效果

1055468da81ed6111a.png
9 黄色效果

1822568da82026cae9.png
10 粉色效果

5831468da8213acb31.png
11青色效果


除实现静态的灯光效果外,还可实现动态的效果设计。这里提供3种动态效果的实现方法,即单个彩灯向前跳跃效果、彩灯渐进效果及组合产生各色灯光的效果。
单个彩灯向前跳跃的函数为:
  1. def light_1():
  2.      j=0
  3.      while j<7:
  4.          for i in range(0,_n):
  5.              n[i]=(0,0,0)
  6.              if i==j:
  7.                 n[i]=(100,0,0)
  8.          n.write()     
  9.          time.sleep(0.1)
  10.          j=j+1

彩灯渐进效果的函数为:
  1. def light_2():
  2.      j=0
  3.      while j<7:
  4.          for i in range(0,_n):
  5.              n[i]=(0,0,0)
  6.              if i<=j:
  7.                 n[i]=(0,100,0)
  8.          n.write()     
  9.          time.sleep(0.1)
  10.          j=j+1

色彩组合效果的函数为:
  1. def light_3():
  2.      j=0
  3.      k=0
  4.      p=0
  5.      while j<7:
  6.          for i in range(0,_n):
  7.              n[i]=(0,0,0)
  8.              k=random.randint(1, 50)
  9.              p=random.randint(1, 50)
  10.              if i<=j:
  11.                 n[i]=(k,p,0)
  12.          n.write()     
  13.          time.sleep(0.1)
  14.          j=j+1

效果测试的主程序为:
  1. def main():
  2.     #红色
  3.     Light_clear()
  4.     Light_it(100,0,0)
  5.     #延时(秒)
  6.     time.sleep(2)
  7.     #绿色
  8.     Light_clear()
  9.     Light_it(0,100,0)
  10.     #延时
  11.     time.sleep(2)
  12.     #蓝色
  13.     Light_clear()
  14.     Light_it(0,0,100)
  15.     #延时
  16.     time.sleep(2)
  17.     #黄色
  18.     Light_clear()
  19.     Light_it(100,100,0)
  20.     #延时
  21.     time.sleep(2)
  22.     #紫色
  23.     Light_clear()
  24.     Light_it(100,0,100)
  25.     #延时
  26.     time.sleep(2)
  27.     #青色
  28.     Light_clear()
  29.     Light_it(0,100,100)
  30.     #延时
  31.     time.sleep(2)
  32.     Light_clear()
  33.     light_1()
  34.     time.sleep(2)
  35.     Light_clear()
  36.     light_2()
  37.     time.sleep(2)
  38.     Light_clear()
  39.     light_3()
  40.     time.sleep(2)

  41. if(__name__=='__main__'):
  42.     while 1:
  43.         main()

经程序上传,所实现的效果如图12至图14所示。
a.jpg
12跳跃效果

b.jpg
13 渐进效果

3.jpg
14 变色效果


此外,如果继续增加WS2812的数量,则会更加增强显示的效果。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部