电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[树莓派] 玩转全彩WS2812 RGB灯(Python)
分 享
扫描二维码分享
[树莓派] 玩转全彩WS2812 RGB灯(Python)
ws2812
RGB灯
wybliw
关注
发布时间: 2021-01-28
丨
阅读: 3512
[TOC] --- ## RGB灯介绍 WS2812 是集控制电路和发光电路于一体的智能外控LED光源,其外型与一个5050的LED灯珠相同,每个灯珠即为一个像素点。每个像素点的RGB三基色可实现256级亮度显示,可产生16777216种色彩,扫描频率不低于400Hz/s,串行级联接口,只需一根信号线完成数据接收和解码。当刷新率30帧/秒时,级联数不小于1024个,数据发送速率可达800Kbps,产生的光颜色高度一致,性价比较高。 ### WS2812引脚示意图 ![](https://cf03.ickimg.com/bbsimages/202101/214280a3f14d21ac9f45617972e5fb57.png) | 引脚编号 | 引脚名称 | 说明 | | -------- | -------- | ------------------ | | 1 | DO | 控制数据信号输出端 | | 2 | DI | 控制数据信号输入端 | | 3 | VCC | 控制电路电源正极 | | 4 | NC | 空脚 | | 5 | VDD | LED电源正极 | | 6 | VSS | 电源负极 | ### 数据时序图 0,1码的高低电平时间: | T0H | 0 码, 高电平时间 | 0.35us | ±150ns | | ---- | ---------------- | ------- | ------ | | T0L | 0 码, 低电平时间 | 0.8us | ±150ns | | T1H | 1 码, 高电平时间 | 0.7us | ±150ns | | T1L | 1 码, 低电平时间 | 0.6us | ±150ns | | RES | 低电平时间 | 约 50us | - | * TH+TL=1.25μs±600ns **时序图:** ![](https://cf03.ickimg.com/bbsimages/202101/5a2674c3a3e684e257dfdf9b70554ea7.png) **数据传输方式:** ![](https://cf03.ickimg.com/bbsimages/202101/5570fbfe869600c798a0f7534d8cd4df.png) * 其中 D1 为 MCU 端发送的数据, D2 、 D3 、 D4 为级联电路自动整形转发的数据。 24bit数据的构成: ![](https://cf03.ickimg.com/bbsimages/202101/bc048b781c1843e3f62a11730ceecaa9.png) 这是按照GRB顺序发送数据。 --- ## 安装RGB LED相关库 先安装相关库。 ```bash sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel sudo python3 -m pip install --force-reinstall adafruit-blinka ``` * CircuitPython不支持python2.x版本。 **RGB LED和树莓派连接方式:** | RGB LED | 树莓派 | | ------- | ----------- | | VCC | +5V | | GND | GND | | DI | D18 (GPIO1) | * 只有树莓派的 D10, D12, D18 或 D21引脚才能驱动WS2812 RGB灯。 ### 示例1:点亮RGB 实现点亮一个RGB灯。 ```python #!/usr/bin/env python # coding=utf-8 import time import board import neopixel # 定义RGB控制引脚,必须选择 D10, D12, D18 或者 D21 pixel_pin = board.D18 # 串联RGB灯珠的数量,这里只点亮第一个 num_pixels = 1 # 定义RGB数据顺序:RGB 或者 GRB COLOR_ORDER = neopixel.GRB pixels = neopixel.NeoPixel( pixel_pin, num_pixels, brightness=0.3, auto_write=False, pixel_order=COLOR_ORDER ) # 点亮第一个RGB灯,显示红色 pixels.fill((255, 0, 0)) pixels.show() ``` * 程序必须用python3以root身份执行。 **效果图:** ![](https://cf03.ickimg.com/bbsimages/202101/0bf9cbb67b285d9d1cfc07cebf25ed65.png) ### 示例2:RGB动态显示 实现一个红、绿、蓝、彩虹循环的示例程序。 ```python #!/usr/bin/env python # coding=utf-8 import time import board import neopixel # 定义RGB控制引脚,必须选择 D10, D12, D18 或者 D21 pixel_pin = board.D18 # 串联RGB灯珠的数量 num_pixels = 3 # 定义RGB数据顺序:RGB 或者 GRB COLOR_ORDER = neopixel.GRB pixels = neopixel.NeoPixel( pixel_pin, num_pixels, brightness=0.3, auto_write=False, pixel_order=COLOR_ORDER ) def wheel(pos): if pos < 0 or pos > 255: r = g = b = 0 elif pos < 85: r = int(pos * 3) g = int(255 - pos * 3) b = 0 elif pos < 170: pos -= 85 r = int(255 - pos * 3) g = 0 b = int(pos * 3) else: pos -= 170 r = 0 g = int(pos * 3) b = int(255 - pos * 3) return (r, g, b) if COLOR_ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0) def rainbow(wait): for j in range(255): for i in range(num_pixels): pixel_index = (i * 256 // num_pixels) + j pixels[i] = wheel(pixel_index & 255) pixels.show() time.sleep(wait) while True: pixels.fill((255, 0, 0)) # 红 pixels.show() time.sl
eep(1) pixels.fill((0, 255, 0)) # 绿 pixels.show() time.sl
eep(1) pixels.fill((0, 0, 255)) # 蓝 pixels.show() time.sl
eep(1) rainbow(0.01) # 彩虹 ``` * 程序必须用python3以root身份执行。 **效果图:** ![](https://cf03.ickimg.com/bbsimages/202101/1592fff7e2079b58a279614381c8f94e.gif) --- **附:**neopixel库的官方文档:[Adafruit CircuitPython NeoPixel Library](https://circuitpython.readthedocs.io/projects/neopixel/en/latest/)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
wybliw
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交