#rgb-led #spi-driver #led-driver #spi #ws2812 #ws2818 #ws2811

无 std ws2818-rgb-led-spi-driver

一个简单、精简、用于教育的、兼容无 std 的 WS28XX (WS2811/12) RGB LED 驱动器。使用 SPI 设备进行定时/时钟,肯定适用于 Linux/Raspberry Pi。

9 个版本 (3 个稳定版)

2.0.0 2021年4月2日
1.0.1 2021年2月22日
1.0.0 2020年7月15日
0.1.5 2020年7月15日

#416硬件支持

每月 下载 39
beat-detector 中使用

MIT 协议

2MB
140

WS28xx RGB LED SPI 驱动器

这个 crate 是 WS28XX (WS2811, WS2812, WS2812B, WS2818) RGB LED 链条/条目的驱动器。它们也被称为 "NeoPixel" 设备或 "Smart LEDs"。

等等,crates.io 上已经有那么多 WS2811/WS2812 的驱动器了吗?

最初我不知道 WS2811, WS2812, WS2812B, ..., WS2818 基本上是一样的。我只是没有注意到。我以为我使用了 WS2818 LED,而且没有名为 WS2818 的特定产品驱动器。查看以下链接了解差异

看起来它们都使用相同的协议。这意味着这个驱动器可能适用于所有这些。

关于这个驱动器

这是一个 简单、精简、用于教育的示例,展示了如何使你的 LED 活跃起来。这个 [0] 是一个带有串联 WS2818 RGB LED 的示例设备,可以使用这个驱动器。这个驱动器只能在具有 SPI 设备的 Linux 系统上运行,例如 Raspberry Pi [1]。这是因为我的驱动器在 15.6MHz 的频率下运行。这是必要的,因为我需要在发送数据时根据规范达到特定的 纳秒级定时 [2]。WS28xx LED 使用一条无时钟的线协议,因此在数据传输期间的定时很重要。

你的 Raspberry Pi 上的 SPI 设备具有可靠的时钟和可用的高频率。常规 GPIO 引脚 无法工作! 在我的测试中,切换 GPIO 引脚需要 1µs(太慢了!)因此我使用 SPI。硬件中有一个时钟设备 - 更可靠!

在你的设备(例如 Raspberry Pi)上找到 MOSI 引脚,并将其与 LED 的 DIN 端口连接。这就足够了。

查看示例/代码以获取更多信息。 :)

不能保证这个在你的配置上会工作!高频内容很复杂!

demo

使用8x8 RGB LED矩阵的演示。DIN与MOSI(SPI输出端口)相连。

示例

请参阅https://github.com/phip1611/ws2818-rgb-led-spi-driver/tree/master/examples

Cargo.toml

[dependencies]
ws2818-rgb-led-spi-driver = "<latest version>"
# or if you need no_std
ws2818-rgb-led-spi-driver = { version = "<latest version>", default-features = false }

代码

//! Example that definitely works on Raspberry Pi.
//! Make sure you have "SPI" on your Pi enabled and that MOSI-Pin is connected
//! with DIN-Pin of the LEDs. You just need DIN pin, no clock. WS2818 uses an one-wire-protocol.
//! See the specification for details.

use ws2818_rgb_led_spi_driver::adapter_gen::WS28xxAdapter;
use ws2818_rgb_led_spi_driver::adapter_spi::WS28xxSpiAdapter;
use ws2818_rgb_led_spi_driver::encoding::encode_rgb;

fn main() {
    println!("make sure you have \"SPI\" on your Pi enabled and that MOSI-Pin is connected with DIN-Pin!");
    let mut adapter = WS28xxSpiAdapter::new("/dev/spidev0.0").unwrap();

    // Method 1: encode first and write in two step (preferred way; better performance)
    {
        let mut spi_encoded_rgb_bits = vec![];
        // set first three pixels to bright red, bright green and bright blue
        spi_encoded_rgb_bits.extend_from_slice(&encode_rgb(255, 0, 0));
        spi_encoded_rgb_bits.extend_from_slice(&encode_rgb(0, 255, 0));
        spi_encoded_rgb_bits.extend_from_slice(&encode_rgb(0, 0, 255));
        adapter.write_encoded_rgb(&spi_encoded_rgb_bits).unwrap();
    }

    // Method 2: encode and write in one step
    {
        let mut rgb_values = vec![];
        // set first three pixels to bright red, bright green and bright blue
        rgb_values.push((255, 0, 0));
        rgb_values.push((0, 255, 0));
        rgb_values.push((0, 0, 255));
        adapter.write_rgb(&rgb_values).unwrap();
    }
}

[0] https://www.az-delivery.de/products/u-64-led-panel?variant=6127700738075
[1] https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md
[2] https://cdn-shop.adafruit.com/datasheets/WS2812.pdf

依赖项