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 中使用
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 的特定产品驱动器。查看以下链接了解差异
- https://www.alldatasheet.com/view.jsp?Searchword=WS2818
- https://www.witop-tech.com/what-is-the-difference-ws2818-vs-ws2811-usc1903-magic-color-digital-led-strip/
- https://www.sdiplight.com/what-is-ws2818-and-how-to-use-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
端口连接。这就足够了。
查看示例/代码以获取更多信息。 :)
不能保证这个在你的配置上会工作!高频内容很复杂!
使用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