维基少年:树莓派/树莓派 Python 单独可控 LED(ws2811)
Andrew Oakley 和 Jonathan Teague 的教程 - 公共领域
2020-03-14 www.cotswoldjam.org
本教程将介绍如何使用基于 ws2811 控制器(也称为“NeoPixels”)的单独可控 LED 字符串。
您的包中将包含以下组件
- ×3 M-F 跳线(针脚到插座)
- ×1 3 路 3A 连接器条
- ×1 3 个 5V ws2811 LED 的字符串
来自连接器块的跳线颜色并不重要 - 重要的是从连接器块到字符串的电线的颜色。 |
步骤 1:将连接到 LED 的白色电线的跳线,将其插座(母端)插入 Pi 上的6 号引脚(GND)。
步骤 2:将连接到 LED 的红色电线的跳线,将其插座(母端)插入 Pi 上的2 号引脚(5V)。
步骤 3:将连接到 LED 的绿色电线的跳线,将其插座(母端)插入 Pi 上的12 号引脚(GPIO 18)。
启动您的树莓派。从桌面菜单中,选择编程 - Python 3 (IDLE)。然后使用文件,新建文件来创建一个新程序。
输入以下程序,然后使用文件,保存将程序保存为您的选择名称(不要忘记在结尾添加 .py)。
import board, neopixel, time
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
pixels[0] = (255, 0, 0)
pixels[1] = (0, 255, 0)
pixels[2] = (0, 0, 255)
pixels.show()
time.sleep(2)
pixels.fill((0, 0, 0))
pixels.show()
您也可以在 Pi 主文件夹中找到此程序:python/addrleds/neopixels-start.py
运行您的程序。
您不能在 IDLE 中运行您的程序😟。这是因为库需要特殊权限才能访问 Pi 上的硬件。 |
要运行程序,请启动一个终端 - 点击顶部的图标,然后在终端窗口打开后键入
sudo python3 thenameyouchose.py
如果操作成功,您应该会看到 3 个 LED 亮起红色、绿色和蓝色,持续两秒钟,然后熄灭。
导入加载 NeoPixels 库(以及 time,以便我们可以插入延迟)。
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
这告诉库,我们已经将 LED 字符串连接到 GPIO 18,有 3 个 LED,auto_write=False
意味着只有在我们调用 pixels.show()
时才更新 LED。最后,我们注意到颜色顺序是红色、绿色、蓝色(RGB)。
pixels[0] = (255, 0, 0)
这将第一个 LED 设置为红色,3 个值是 (R, G, B) - 因此每个 3 个 LED 都亮起不同的颜色。
pixels.fill((0, 0, 0))
这将所有像素设置为 0,这意味着关闭,如果我们不这样做,LED 将保持开启状态。
现在开始做自己的事情!制作一个迪斯科序列!
交通信号灯序列怎么样?请注意,黄灯是红灯和绿灯的混合,例如:(255,255,0)
提示:将其放在 while True:
块中,这样它就会一直运行。不要忘记像这一行一样缩进 while 块中的代码!
按住CTRL键并按下C来停止 while True:
序列。
您可以在 Pi 主文件夹中找到示例程序:python/addrleds/neopixels-traffic.py
。
如何设计一个持续 20 秒的灯光序列,这正是您认真洗手所需的时间?
您可以在 Pi 主文件夹中找到示例程序:python/addrleds/neopixels-countdown.py
。
如果停止程序,并且灯仍然亮着,您可以使用 neopixels-off.py
程序将其关闭。
每个 LED 都连接到一个 ws2811 集成电路 (IC) - 称为 ws2811 的是 IC,LED 只是一个三色 LED。Pi 生成一个长长的 0 和 1 序列。每个 LED 24 位(每个颜色红|绿|蓝 3 组 8 位),因此对于我们的 3 个 LED 字符串,Pi 将生成 3 × 24 位 = 72 位。
字符串中的第一个设备接收前 24 位,并使用它们设置其 LED 的红|绿|蓝。然后,它将剩余的 48 位传递给第二个 LED。然后,第二个 LED 将从接收到的数据中获取现在的前 24 位作为其 RGB,并将剩余的 24 位传递给最后一个 LED。
有关完整详细信息,请查看以下数据表:http://www.world-semi.com/DownLoadFile/129
如果您没有使用我们预制的 SD 卡,则需要从 Raspbian Buster 中进行一些设置。
- 树莓派菜单 - 首选项 - 树莓派配置 - 接口 - SPI 启用 - I2C 启用 - 确定
- 树莓派菜单 - 关机 - 重启
然后安装库
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
您可以从以下网址下载我们的示例代码:www.cotswoldjam.org/downloads/2020-03
我们只给了你一小串 LED,因为那是 Pi 可以可靠供电的全部。如果你使用的是长条的 ws2811 或 ws2812,你需要考虑两件事。
- ws2811 灯条可以是 5V 或 12V,ws2812 是 5V。Pi 只能提供 5V 低电流,足以驱动几个 LED。要驱动 5V 的长条或任何 12V 的灯条,你需要提供额外的电源,可能在灯条上的多个位置。如果你打算在你的卧室天花板周围安装灯条 😊,那么 Pi 只能提供 LED 的控制逻辑,而不是电源。
- ws2811 和 ws2812 的控制逻辑在 5V 时被指定,Pi GPIO 引脚为 3.3V。在本教程中,我们可以使用 GPIO,但为了确保它可以正常工作,你可能需要使用逻辑电平转换器将 Pi 的 3.3V 转换为 5V。
#!/usr/bin/python3
import board, neopixel, time
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
# Count 20 seconds for washing our hands!
# Start with pixels off
pixels.fill((0, 0, 0))
pixels.show()
# First 5 seconds are red - count three forward
# Notice how we start counting from zero
# and stop before we reach 3
for x in range(0,3):
pixels.fill((0, 0, 0))
pixels[x] = (255, 0, 0)
pixels.show()
time.sleep(1)
# Now count two back
# We start at 1
# and stop before we reach -1
# and count -1 each time
for x in range(1,-1,-1):
pixels.fill((0, 0, 0))
pixels[x] = (255, 0, 0)
pixels.show()
time.sleep(1)
# Next 5 seconds are yellow
for x in range(0,3):
pixels.fill((0, 0, 0))
pixels[x] = (255, 255, 0)
pixels.show()
time.sleep(1)
for x in range(1,-1,-1):
pixels.fill((0, 0, 0))
pixels[x] = (255, 255, 0)
pixels.show()
time.sleep(1)
# Next 5 seconds are green
for x in range(0,3):
pixels.fill((0, 0, 0))
pixels[x] = (0, 255, 0)
pixels.show()
time.sleep(1)
for x in range(1,-1,-1):
pixels.fill((0, 0, 0))
pixels[x] = (0, 255, 0)
pixels.show()
time.sleep(1)
# Final 5 seconds are blue
for x in range(0,3):
pixels.fill((0, 0, 0))
pixels[x] = (0, 0, 255)
pixels.show()
time.sleep(1)
for x in range(1,-1,-1):
pixels.fill((0, 0, 0))
pixels[x] = (0, 0, 255)
pixels.show()
time.sleep(1)
# Finish with pixels off
pixels.fill((0, 0, 0))
pixels.show()
#!/usr/bin/python3
import board
import neopixel
from random import randrange
import time
# NeoPixels must be connected to D10, D12, D18 or D21 to work.
pixel_pin = board.D18
# The number of NeoPixels
num_pixels = 3
# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
ORDER = neopixel.GRB
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, auto_write=False,
pixel_order=ORDER)
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r -> g -> b -> back to r.
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)
def rainbow_cycle(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)
def fade_in_out(wait):
for j in range(255):
pixels[0] = (j,0,0)
pixels[1] = (0,j,0)
pixels[2] = (0,0,j)
pixels.show()
time.sleep(wait)
for j in range(254,0,-1):
pixels[0] = (j,0,0)
pixels[1] = (0,j,0)
pixels[2] = (0,0,j)
pixels.show()
time.sleep(wait)
def random_leds(times, wait):
for i in range(times):
for j in range(num_pixels):
pixels[j] = (randrange(256),randrange(256),randrange(256))
pixels.show()
time.sleep(wait)
while True:
pixels.fill((255, 0, 0)) # Red = 255, Green = 0, Blue = 0
pixels.show()
time.sleep(1)
pixels.fill((0, 255, 0))
pixels.show()
time.sleep(1)
pixels.fill((0, 0, 255))
pixels.show()
time.sleep(1)
pixels.fill((255, 255, 255))
pixels.show()
time.sleep(1)
rainbow_cycle(0.02)
fade_in_out(0.02)
for i in range(num_pixels):
pixels.fill((0,0,0))
pixels[i] = (255, 0, 0)
pixels.show()
time.sleep(1)
random_leds(100, 0.1)
#!/usr/bin/python3
# To set everything up in Raspbian Buster:
# Raspberry menu - Preferences - Raspberry pi configuration - SPI enable - I2C enable
# Raspberry menu - Shutdown - Reboot
# Then install the libraries:
# sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
# Note that you may need to use sudo to run programs using the neopixel library
# You can manage without sudo by just using rpi_ws281x, but it's not as easy as neopixel
import board, neopixel, time
# Our strip is on pin 18
# There are 3 LED in our strip
# Don't automatically update the pixels without the show() command
# Colours are in Red Green Blue order (some strips use GRB)
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
pixels[0] = (255, 0, 0)
pixels[1] = (0, 255, 0)
pixels[2] = (0, 0, 255)
pixels.show()
time.sleep(2)
pixels.fill((0, 0, 0))
pixels.show()
#!/usr/bin/python3
import board, neopixel, time
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
pixels.fill((0, 0, 0))
pixels.show()
import board, neopixel, time
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
pixels[0] = (255, 0, 0)
pixels[1] = (0, 255, 0)
pixels[2] = (0, 0, 255)
pixels.show()
time.sleep(2)
pixels.fill((0, 0, 0))
pixels.show()
import board, neopixel, time
pixels = neopixel.NeoPixel(board.D18, 3, auto_write=False, pixel_order=neopixel.RGB)
while True:
pixels[0] = (255, 0, 0)
pixels[1] = (0, 0, 0)
pixels[2] = (0, 0, 0)
pixels.show()
time.sleep(10)
pixels[0] = (255, 0, 0)
pixels[1] = (255, 255, 0)
pixels[2] = (0, 0, 0)
pixels.show()
time.sleep(2)
pixels[0] = (0, 0, 0)
pixels[1] = (0, 0, 0)
pixels[2] = (0, 255, 0)
pixels.show()
time.sleep(14)
pixels[0] = (0, 0, 0)
pixels[1] = (255, 255, 0)
pixels[2] = (0, 0, 0)
pixels.show()
time.sleep(3)