前言
树莓派在控制某些硬件外设上坑还真不少,今天就又踩了一个(其实有两天了)。其实越复杂的问题往往是有越简单的解决办法。 树莓派驱动ws2812 网上一搜几乎都是 用的 rpi-ws281x 这个库
安装
安装还是比较简单
sudo pip3 install rpi-ws281x
官方示例
看看官方的示例程序 ,这是一个名为 strandtest.py 的示例程序 当然还有其他的示例程序 Github链接
import time
from rpi_ws281x import PixelStrip, Color
import argparse
LED_COUNT = 16
LED_PIN = 18
LED_FREQ_HZ = 800000
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
LED_CHANNEL = 0
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, color)
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
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)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel(
(int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, wheel((i + j) % 255))
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
print('Press Ctrl-C to quit.')
if not args.clear:
print('Use "-c" argument to clear LEDs on exit')
try:
while True:
print('Color wipe animations.')
colorWipe(strip, Color(255, 0, 0))
colorWipe(strip, Color(0, 255, 0))
colorWipe(strip, Color(0, 0, 255))
print('Theater chase animations.')
theaterChase(strip, Color(127, 127, 127))
theaterChase(strip, Color(127, 0, 0))
theaterChase(strip, Color(0, 0, 127))
print('Rainbow animations.')
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
except KeyboardInterrupt:
if args.clear:
colorWipe(strip, Color(0, 0, 0), 10)
测试
新建一个py文件,copy上面那个示例程序,使用命令行运行 (直接在IDE运行会报错,目前不知道解决办法) 比如 我建的名字为 test.py, 放在了桌面
cd Desktop
sudo python3 test.py
虽然没报错,但是灯是没有任何反应的,经过一番查找,在这里找到了原因,原来需要关闭音频输出。。。。。。
打开终端运行
sudo nano /etc/modprobe.d/snd-blacklist.conf
添加下列语句
blacklist snd_bcm2835
ctrl+o保存 ctrl+x退出
修改conf.txt文件
sudo nano /boot/config.txt
找到下列语句(一般是在最下面)
dtparam=audio=on
注释掉第二行
ctrl+o保存 ctrl+x退出
重启
sudo reboot
再次运行程序,可以成功点亮
|