在 Raspberry Pi 上构建可编程灯光显示

使用 Raspberry Pi、Python 和可编程 LED 灯,来庆祝节日或任何特殊场合,DIY 灯光显示。
81 位读者喜欢这个。
4 hot skills for Linux pros in 2017

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

在过去的节日里,我决定通过设置 DIY 灯光显示来为我们的房子增添一些乐趣。 我使用了 Raspberry Pi、可编程灯串和 Python。

由于 WS12911/2(或 NeoPixel)系统的灵活性,您可以按照这些说明为任何场合设置自己的灯光显示。

先决条件

您将需要

  • 1 – 带排针和以太网或 WiFi 连接的 Raspberry Pi。 我使用了带排针的 Raspberry Pi Zero W。
  • 1 – WS12811/2 灯串。 我使用了 Alitove WS2811 可寻址 LED 像素灯 50,但还有许多其他类型可用。 Adafruit 将这些品牌命名为 NeoPixel
  • 1 – 用于 WS12811 的 5v/10A AC-DC 电源(如果您使用 Alitove)。 其他灯可能带有电源。
  • 1 – 面包板
  • 2 – 面包板到 Pi 排针的跳线。 我使用蓝色作为 Pi GPIO 引脚 18,黑色作为 Pi 接地。
  • 1 – 74AHCT125 电平转换芯片,用于安全地将 Pi GPIO 电线信号传输到 5v/10A 电源,而不会反馈到 Pi。
  • 8 – 面包板到面包板的跳线或实芯 24 AWG 电线。 我使用红色/橙色作为 5v 电源,黑色作为接地,黄色作为数据。
  • 1 – 安装了 Raspberry Pi OS 的 SD 卡。 我使用了 Raspberry Pi OS Lite 并在启用 SSH 的无头模式下进行了设置。

什么是 WS2811/2 可编程 LED?

WS2811/2 类可编程灯将红色、绿色和蓝色 LED 灯与驱动芯片集成到一个微小的表面贴装封装中,并通过单根导线控制。

每个灯都可以使用 RGB 整数集或十六进制等效项单独编程。 这些灯可以组合成矩阵、灯串和其他外形尺寸,并且可以使用对该外形尺寸有意义的数据结构以编程方式访问它们。 我使用的灯串使用标准 Python 列表寻址。 Adafruit 有一个很棒的 关于接线和控制灯的教程

使用 Python 控制 NeoPixel LED

Adafruit 为其销售的大部分零件创建了一整套 Python 库。 这些库旨在与 CircuitPython 配合使用,CircuitPython 是 Adafruit 专为低成本微控制器板设计的 Python 端口。 您不需要在 Raspberry Pi OS 上安装 CircuitPython,因为预安装的 Python 2 和 Python 3 是兼容的。

您将需要 pip3 来安装 Python 3 的库。使用以下命令安装它

sudo apt-get install python3-pip

然后安装以下库

一旦安装了这些库及其依赖项,您就可以编写如下代码来编程一个或多个连接到您的 Raspberry Pi 的灯,使用 sudo python3(需要 sudo)

import board
import neopixel
num_lights = 50
# program 50 lights with the default brightness 1.0, and autoWrite true
pixels = neopixel.NeoPixel(board.D18, num_lights)
# light 20 bright green
pixels[19] = (0,255,0)
# light all pixels red
pixels.fill((255.0,0))
# turn off neopixels
pixels.fill((0,0,0))

设置您的照明系统

  1. 将 SD 卡安装到 Raspberry Pi 中并固定好,将面包板和灯 放置在需要的位置(魔术贴适用于 Pi 和面包板)。
  2. 根据此原理图安装 74AHCT125 电平转换芯片、灯、电源和 Pi

  3. 使用连接器将额外的灯串连接到第一个灯。 请注意灯的总数。
  4. 将电源插入墙壁插座。
  5. 将 Raspberry Pi 电源插入墙壁插座,并等待它启动。

 

安装灯光控制器和 Flask Web 应用程序

我编写了一个 Python 应用程序和库来与灯光交互,以及一个在 Pi 上运行的 Flask Web 应用程序。 有关代码的更多信息,请参见我的 Raspberry Pi Neopixel Controller GitHub 存储库。

lib.neopixc 库

lib.neopixc扩展了 neopixel.NeoPixC 类,以使用以串行方式连接的两个 50 灯 Alitove 灯串,使用可编程的 RGB 颜色列表。 它添加了以下函数: 

  • set_color:接受 RGB 颜色的列表的新列表
  • walk:遍历每个灯并按顺序将其设置为颜色
  • rotate:将列表的列表中的最后一种颜色推送到列表的列表的开头,以闪烁灯光

如果您的灯的数量不同,则需要编辑此库以更改 self._num_lights 值。 此外,某些灯需要在 order 构造函数属性中使用不同的参数。 Alitove 与默认 order 属性 neopixel.GRBW 兼容。

run_lights.py 脚本

run_lights.py 脚本使用 lib.neopixc 来支持颜色文件和状态文件,以动态设置灯在任何时候的行为。 颜色文件是 RGB(或 RGBW)整数数组的 JSON 数组,使用其 set_colors 方法将其作为颜色馈送到 lib.neopixc 对象。 状态文件可以包含以下三个词之一

  • static:不在 while 循环的每次迭代中旋转灯光
  • blink:在主 while 循环的每次迭代中旋转灯光
  • down:关闭所有灯

如果状态文件不存在,则默认状态为 static

该脚本还具有 HUP 和 INT 信号处理程序,当收到这些信号时,它们将关闭灯。

注意:由于 GPIO 18 引脚需要在 Raspberry Pi 上使用 sudo 才能工作,因此必须使用 sudo 运行 run_lights.py 脚本。

neopixel_controller 应用程序

neopixel_controller Flask 应用程序,位于 github 存储库的 neopix_controller 目录中(见下文),提供了一个前端浏览器图形用户界面 (GUI) 来控制灯光。 我的 raspberry pi 连接到我的 wifi,并且可以在 raspberrypi.local 访问。 要在浏览器中访问 GUI,请转到 http://raspberrypi.local:5000。 或者,您可以使用 ping 查找 raspberrypi.local 的 IP 地址,并将其用作主机名,如果您有多个连接到您的 wifi 的 raspberry pi 设备,这将非常有用。

当前状态和三个前端按钮使用 JavaScript 与 Flask 应用程序提供的一组 REST API 端点进行交互

  • /api/v1/state:返回共享状态文件的当前状态,如果状态文件不存在,则默认为 static
  • /api/v1/blink:将状态文件设置为 blink
  • /api/v1/static:将状态文件设置为 static
  • /api/v1/down:将状态文件设置为 down

我编写了两个脚本和相应的 JSON 定义文件,用于启动 run_lights.py 和 Flask 应用程序

  • launch_christmas.sh
  • launch_new_years.sh

这些可以在设置好 Pi 后,从 Pi 上的命令行会话(终端或 SSH)启动(它们不需要 sudo,但在内部使用 sudo)

./launch_christmas.sh

您可以使用 lights_down.sh 关闭灯并停止 run_lights.sh 和 Flask 应用程序。

该库和 flask 应用程序的代码位于 Raspberry Pi Neopixel Controller GitHub 存储库中。

接下来要阅读的内容
User profile image.
我的主要经验是使用编程为研究人员在进行研究工作时遇到的问题提供工业强度解决方案。

2 条评论

这让我想起了很久以前我制作“彩色音响”的时候——那是一个可以接收高保真音响的声音,然后使用3个频率范围来控制灯光的设备——红、绿、蓝(普通的白炽灯泡——那时LED还没有发明)。 这需要从一个裸电路板和基本的电子零件开始,包括用于控制3个电路的三端双向可控硅。

非常棒和简单的项目。非常适合假期

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.