3个版本

0.1.2 2022年10月11日
0.1.1 2022年10月8日
0.1.0 2022年10月8日

#1585 in 嵌入式开发


用于 navigator-rs

MIT 许可证

26KB
550

sk6812_rpi

适用于RaspberryPi的易于使用的SK6812RGBW库。

特性

  • 易于创建带子 - 只需设置您要使用的SPI总线,并设置LED数量。
  • 易于访问LED颜色 - LED作为Vec存储在Strip结构体中,因此您可以按需访问它们。
  • palette集成 - palette是一个专门用于颜色操作库,LED结构体实现了From/Into特性,允许轻松地将它们转换为/从palette SRGB类型。换句话说 - 您可以轻松地以任何此库允许的方式创建、修改或混合LED颜色。
  • 渐变支持 - 由于palette支持渐变,您只需将其传递给Strip,它就会自动推送到LED上。
  • 颜色位置移动支持 - 您可以使用Strip结构体实例上的<<=>>=运算符移动LED颜色的位置,以使用平滑动画。

兼容性

通过rppal库强制执行RaspberryPi兼容性。换句话说 - 它应该与任何带有GPIO引脚的RaspberryPi兼容。有关详细信息,请参阅rppal的readme。

应与任何SK6812RGBW带子或类似(类似WS2812)兼容,假设它使用GRBW颜色格式。修改它以支持不同的格式应该是相当直接的,但目前我没有时间和需求来扩展这个库,因此请随意fork它并自行修改。这应该相当简单,下面有更多详细信息。

安装

只需将其添加到您的Cargo.toml

[dependencies]
sk6812_rpi = "0.1"

使用方法和示例

创建带子

use sk6812_rpi::strip::{Bus, Strip};

let mut strip = Strip::new(Bus::Spi0, 144).unwrap()

// In case when you don't want to waste default slave-select pin, you can use this method and set it manually
let mut other_strip = Strip::new_with_custom_ss(Bus::Spi1, 20, SlaveSelect::Ss10);

将带子设置为特定的RGB(W)颜色

use sk6812_rpi::strip::{Bus, Strip};
use sk6812_rpi::led::Led;

let mut strip = Strip::new(Bus::Spi0, 144).unwrap()

strip.fill(Led {
    r: 200,
    g: 0,
    b: 150,
    w: 0,
});

strip.update().unwrap();

将带子设置为渐变颜色

use sk6812_rpi::strip::{Bus, Strip}
use palette::{FromColor, Gradient, Hsv, LinSrgb, Srgb};

let mut strip = Strip::new(Bus::Spi0, 144).unwrap();

let colors: Vec<LinSrgb> = (0..=360)
    .map(|i| Srgb::from_color(Hsv::new(i as f32, 1.0, 0.8)).into_linear())
    .collect();

let gradient = Gradient::new(colors);

strip.set_gradient(gradient);
strip.update().unwrap();

手动访问LED

use sk6812_rpi::strip::{Bus, Strip}
use sk6812_rpi::led::Led;
use palette::{Hsv, Hsl, Srgb};

let mut strip = Strip::new(Bus::Spi0, 10).unwrap();

// Direct access to Led fields
strip.leds[0].r = 100;
strip.leds[1].g = 150;
strip.leds[2].b = 200;

// Conversion from arrays (RGB and RGBW, depending on the amount of items)
strip.leds[3] = [100, 150, 200].into();
strip.leds[4] = [100, 150, 200, 50].into();

// Alternative way - use functions. Works exactly the same.
strip.leds[5] = Led::from_rgb(100, 150, 200);
strip.leds[6] = Led::from_rgbw(100, 150, 200, 50);

// Conversion from `palette` types
// Only f32 color types are currently supported
strip.leds[7] = Srgb::new(0.2, 0.4, 0.6).into();
strip.leds[8] = Hsv::new(0.5, 1.0, 1.0).into();
strip.leds[9] = Hsl::new(0.85, 0.8, 0.5).into();

// Mathematical operations are also supported
strip.leds[7] /= 2;
strip.leds[8] *= 1.5;
strip.leds[9] += 20;

// You can also iterate over LEDs via `iter`/`iter_mut`, and do anything else you can do on `Vec`.
strip
    .leds
    .iter_mut()
    .enumerate()
    .for_each(|(index, led)| led.w = index as u8);

有关更多示例和扩展使用,请查看 测试源代码 目录。每个模块都有测试,展示了如何使用大部分可用功能。

常见问题

SPI消息过长,Strip::update 抛出错误

这是由于默认的Raspbian SPI缓冲区大小为4096字节所致。要更改它,编辑 /boot/cmdline.txt 文件并将 spidev.bufsiz=65535 添加到命令行。

在我的情况下,它看起来像这样

console=tty1 root=PARTUUID=09632905-02 rootfstype=ext4 fsck.repair=yes spidev.bufsiz=65535 rootwait

您的可能看起来不同,但重要的是要在那里添加 spidev.bufsiz=65535重启您的树莓派,它应该会工作。

修改库以使用不同颜色格式的LED

如果您想使用此库与不使用GRBW格式的LED一起使用,您必须修改 Led::to_raw_led_bytes 函数(它在 led.rs 文件中)。默认情况下,它看起来像这样

pub fn to_raw_led_bytes(&self) -> Vec<u8> {
    [self.g, self.r, self.b, self.w]
        .view_bits::<Msb0>()
        .iter()
        .map(|bit| match *bit {
            true => BIT_HIGH,
            false => BIT_LOW,
        })
        .collect()
}

如你所见,它创建了一个颜色数组并使用来自 bitvec 库的 view_bits 获取位。要更改颜色顺序,只需更改数组中元素的顺序。如果您没有白色通道,请将其删除。就是这样。其余代码是通用的,将自动适应更改。

如果您将 Led 制作成支持多种颜色的通用版本,请提交一个pull request,我会很乐意合并它。应该相当简单,但我目前没有时间也没有必要这样做。

依赖项

约4.5MB
约105K SLoC