3 个不稳定版本
0.2.0 | 2022年6月26日 |
---|---|
0.1.1 | 2022年4月6日 |
0.1.0 | 2022年4月6日 |
#5 in #rt
9KB
77 行代码,不包括注释
在 imxrt1062 板上使用 ws2812 灯
- 适用于
smart-leds
- 实现了
SmartLedsWrite
特性
警告
WS2812s 在 5v 下运行。IMXRT1062 引脚在 3v 下运行,并且不耐受 5v。您需要一个逻辑电平转换器,并且布线时需要小心。
为什么?
因为我显然太笨了,无法使用 ws2812-timer-delay 让周期性定时器工作。
如何?
此库使用汇编中的简单 nop
循环来等待。
WS2812s 每周期大约 333ns 长读取输入。每 LED 写入 3 个字节 (GRB | 绿色,红色,蓝色),然后“锁存”(设为低)6us 到 250us,具体取决于您的型号。写入单个位需要三个位消息,其外观为 [1, x, 0]
,其中 x 是要写入的位。也就是说,要将一个位 1
写入 LED,您必须发送 [1, 1, 0]
,并在每个位之间等待 333ns。
尽管 WS2812 周期据称约为 333ns,但某些时间约束非常严格,而其他则非常宽松。
了解更多关于 WS2812s 的时间约束。
附言。我将锁存硬编码为 6us。如果您需要 250us,请给我发邮件或克隆项目。
使用 teensy4-bsp 的示例
#[cortex_m_rt::entry]
fn main() -> ! {
...
let mut data: [RGB8; 3] = [RGB8::default(); 3];
let empty: [RGB8; 3] = [RGB8::default(); 3];
data[0] = RGB8 {
r: 0x10,
g: 0x00,
b: 0x00,
};
data[1] = RGB8 {
r: 0x00,
g: 0x10,
b: 0x00,
};
data[2] = RGB8 {
r: 0x00,
g: 0x00,
b: 0x10,
};
configure(&mut pins.p2,{
Config::zero()
.set_drive_strength(DriveStrength::R0_7)
.set_speed(Speed::Max)
.set_slew_rate(SlewRate::Fast)
});
let pin = GPIO::new(pins.p2).output();
let mut ws = ws2812_nop_imxrt1062::Ws2812::new(pin, 600.0);
loop {
ws.write(data.iter().cloned()).unwrap();
systick.delay_ms(500);
ws.write(empty.iter().cloned()).unwrap();
systick.delay_ms(500);
}
}
依赖项
~220KB