彩色RGB灯测试-rpi-ws281x库使用
1 rpi-ws281x库介绍
rpi-ws281x 是一个针对 Raspberry Pi 的库,用于控制WS281X 系列 LED 灯带(例如 WS2812B)的颜色和亮度。它提供了一个 Python 接口,让你可以轻松地通过 Raspberry Pi 控制这些 LED 灯带,实现各种有趣的灯光效果和项目。
这个库的主要特点包括:
- 简单的接口:rpi-ws281x 提供了一个简洁易用的 Python 接口,使得控制 WS281X LED 灯带变得非常简单。
- 高性能:由于底层是通过 C 语言编写的,因此这个库在 Raspberry Pi 上运行时性能较高,能够处理大量 LED灯带和复杂的灯光效果。 支持多种 LED 类型:WS281X 系列涵盖了多种型号的 LED,例如 WS2812B、WS2811、WS2813 等,rpi-ws281x 库支持这些型号,可以灵活地应用于不同类型的 LED 灯带。
- 灵活的控制:你可以通过这个库控制 LED 灯带的颜色、亮度和灯珠的排列方式,实现各种效果,例如彩虹流动、呼吸灯效果、跑马灯等。
这个需要提前安装对应的驱动库,如果你还没有安装好库。可以参考我的这篇论文:
树莓派驱动RGB灯-利用rpi-ws281x库来编写-——python版本
2 电路接法
2.1 树莓派引脚解释
连接 WS2812B LED 灯带到树莓派的 GPIO 引脚需要遵循一定的步骤和注意事项,主要包括以下几个方面:
- 确定引脚:首先,你需要确定将 LED 灯带连接到树莓派上的哪个 GPIO 引脚。在示例代码中,引脚被指定为 LED_PIN = 18,这意味着 LED 灯带将连接到树莓派的 GPIO 18 引脚上(图中的BCM编码的编号)。同时需要注意在代码编写时候,channel0也就是pwm0,指定的IO口。
PWM0, which can be set to use GPIOs 12, 18, 40, and 52. Only 12 (pin 32) and 18 (pin 12) are available on the B+/2B/3B PWM1 which can be set to use GPIOs 13, 19, 41, 45 and 53. Only 13 is available on the B+/2B/PiZero/3B, on pin 33
- 硬件连接:接下来,使用杜邦线或类似的电线将 LED 灯带的信号引脚连接到树莓派的 GPIO 引脚。确保将信号线连接到正确的 GPIO 引脚,并根据需要连接灯带的电源和接地线。
- 供电需求:WS2812B LED 灯带通常需要 5V 的电源供应。确保你为 LED灯带提供足够的电流和电压,以避免过载或不稳定的情况发生。
2.2 灯带介绍
灯带i接入:
红色:5V, 绿色:引脚GPIO7, 白色:地线。
3 测试代码
首先导入了需要的库,然后设置了 LED 灯带的配置参数。接着创建了 PixelStrip 对象,并定义了一个 wheel 函数来生成彩虹颜色序列。在主循环中,不断更新 LED 灯带的颜色,实现彩虹流动的效果。最后,通过捕获键盘中断来优雅地关闭 LED 灯带。
from rpi_ws281x import PixelStrip, Color
# LED灯带配置
LED_COUNT = 30 # LED 灯珠数量
LED_PIN = 18 # 连接到树莓派的GPIO引脚
LED_FREQ_HZ = 800000 # LED频率(通常是800kHz)
LED_DMA = 10 # DMA通道
LED_BRIGHTNESS = 255 # 亮度(0-255之间)
LED_INVERT = False # 反转信号(True时,信号反转)
# 创建PixelStrip对象
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
# 初始化LED灯带
strip.begin()
# 定义彩虹颜色序列
def wheel(pos):
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
try:
while True:
# 循环显示彩虹流动效果
for j in range(256):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i + j) & 255))
strip.show()
time.sleep(0.02)
except KeyboardInterrupt:
# Ctrl+C退出时关闭LED灯带
strip.clear()
strip.show()
4 问题总结
4.1 问题1
python3 test.py
树莓派系统回复以下问题
Can’t open /dev/mem: Permission denied
Can't open /dev/mem: Permission denied
Traceback (most recent call last):
File "/home/pi/Desktop/test.py", line 66, in <module>
strip_1.begin()
File "/usr/local/lib/python3.11/dist-packages/rpi_ws281x-5.0.0-py3.11-linux-aarch64.egg/rpi_ws281x/rpi_ws281x.py", line 143, in begin
raise RuntimeError('ws2811_init failed with code {0} ({1})'.format(resp, str_resp))
RuntimeError: ws2811_init failed with code -5 (mmap() failed)
代码没有权限,可以把指令改成
sudo python3 test.py
4.2 问题2
树莓派系统回复以下问题
MoTTY X11 proxy: Unsupported authorisation protocol
MoTTY X11 proxy: Unsupported authorisation protocol
MoTTY X11 proxy: Unsupported authorisation protocol
Traceback (most recent call last):
File "/home/pi/Desktop/test.py", line 8, in <module>
root= tk.Tk()
^^^^^^^
File "/usr/lib/python3.11/tkinter/__init__.py", line 2326, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_tkinter.TclError: couldn't connect to display "localhost:10.0"
说明系统不支持SSH调试,需要采用远程桌面的方法来调试。
可以下载这个软件VNC的软件,来远程调试。