跳转到内容

维基少年:树莓派/树莓派 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

运行您的程序。

要运行程序,请启动一个终端 - 点击顶部的图标,然后在终端窗口打开后键入

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 中进行一些设置。

  1. 树莓派菜单 - 首选项 - 树莓派配置 - 接口 - SPI 启用 - I2C 启用 - 确定
  2. 树莓派菜单 - 关机 - 重启

然后安装库

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel

您可以从以下网址下载我们的示例代码:www.cotswoldjam.org/downloads/2020-03

在现实世界中使用 ws2811 的注意事项

[编辑 | 编辑源代码]

我们只给了你一小串 LED,因为那是 Pi 可以可靠供电的全部。如果你使用的是长条的 ws2811 或 ws2812,你需要考虑两件事。

  1. ws2811 灯条可以是 5V 或 12V,ws2812 是 5V。Pi 只能提供 5V 低电流,足以驱动几个 LED。要驱动 5V 的长条或任何 12V 的灯条,你需要提供额外的电源,可能在灯条上的多个位置。如果你打算在你的卧室天花板周围安装灯条 😊,那么 Pi 只能提供 LED 的控制逻辑,而不是电源。
  2. ws2811 和 ws2812 的控制逻辑在 5V 时被指定,Pi GPIO 引脚为 3.3V。在本教程中,我们可以使用 GPIO,但为了确保它可以正常工作,你可能需要使用逻辑电平转换器将 Pi 的 3.3V 转换为 5V。

neopixels-countdown.py

[编辑 | 编辑源代码]
#!/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()

neopixels-demo.py

[编辑 | 编辑源代码]
#!/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)

neopixels-explained.py

[编辑 | 编辑源代码]
#!/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()

neopixels-off.py

[编辑 | 编辑源代码]
#!/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()

neopixels-start.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()

neopixels-traffic.py

[编辑 | 编辑源代码]
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)
华夏公益教科书