3个版本
0.1.2 | 2022年10月11日 |
---|---|
0.1.1 | 2022年10月8日 |
0.1.0 | 2022年10月8日 |
#1585 in 嵌入式开发
用于 navigator-rs
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