1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2016年11月18日 |
---|
#1639 在 硬件支持
16KB
115 行
cupi_shift
一个用于通过树莓派GPIO引脚操作移位寄存器的Rust包。
概述
此包提供了一种名为 Shifter
的接口,使得使用树莓派(归功于 CuPi)操作移位寄存器变得非常简单。内部它会跟踪每个移位寄存器的状态,允许您像操作普通GPIO引脚一样操作每个引脚!
为什么要这样做呢?树莓派只有17个可用的GPIO引脚。像MCP23017这样的引脚扩展器可以每个芯片增加多达16个(每个大约花费2-3美元),但它们通过I2C工作,这在树莓派上是很慢的。使用像74HC595这样的移位寄存器(每个约0.05-0.10美元),您可以添加几乎无限的输出引脚,并且可以以硬件支持的速率刷新它们。您甚至可以使用多个3引脚组来并行运行多个移位寄存器链。
使用cupi_shift实现您用单个树莓派控制大量节日灯饰的梦想吧!
示例
extern crate cupi_shift;
use cupi_shift::Shifter;
fn main() {
// First define which pins you're using for your shift register(s)
let (data_pin, latch_pin, clock_pin) = (29, 28, 27);
// Now create a new Shifter instance using those pins
let mut shifter = Shifter::new(data_pin, latch_pin, clock_pin);
// Next we need to call `add()` for each shift register and tell it how
// many pins they have
let pins = 8;
let sr0 = shifter.add(pins); // Starts tracking a new shift register
// Now we can set the state (aka data) of our shift register
shifter.set(sr0, 0b11111111, true); // Set all pins HIGH
}
关于引脚编号的说明
CuPi当前使用GPIO引脚编号。因此,树莓派2上的最后一个引脚40实际上是引脚29。您可以参考此图像来确定哪个引脚是哪个
http://pi4j.com/images/j8header-2b-large.png
控制单个引脚
这很好(一次设置所有引脚的状态),但如果你只想一次控制一个引脚怎么办?你也可以这样做
// Set the 8th pin (aka pin 7) HIGH and apply this change immediately
shifter.set_pin_high(sr0, 7, true); // NOTE: 3rd arg is 'apply'
// Set the first pin (aka pin 0) LOW but don't apply just yet
shifter.set_pin_low(sr0, 0, false);
shifter.apply(); // Apply the change (the other way to apply changes)
控制多个移位寄存器
每次调用 Shifter.add()
时,它都会开始跟踪/控制一个额外的移位寄存器。因此,如果您有两个串联的移位寄存器,您可以像这样添加和控制它们
let last = shifter.add(8); // Add an 8-pin shift register (sr_index: 0)
let first = shifter.add(8); // Add another (sr_index: 1)
// Set pin 0 HIGH on shift register 0 (all others LOW) but don't apply the change yet
shifter.set(last, 0b00000001, false);
// Set pin 7 HIGH on shift register 1 (all others LOW) and apply the change
shifter.set(first, 0b10000000, true);
注意:移位寄存器需要按照它们链接的顺序添加,最后添加的移位寄存器是第一个。为什么顺序要这样反?这是因为移位寄存器的逻辑是这样的:每次数据从移位寄存器“移出”时,它将内存数据传递给链中的下一个移位寄存器。
您还可以对单个移位寄存器上的单个引脚进行更改。
shifter.set_pin_high(sr1, 2, false); // Set pin 2 HIGH on shift register 1
shifter.set_pin_low(sr0, 3, true); // Set pin 3 LOW on shift register 0 (and apply)
在上面的示例中,我们直到完成所有更改后才将apply(第3个)参数设置为true
。如果我们为每个都设置apply为true
,可能会出现一些闪烁。链中的移位寄存器越多,如果每次状态(即数据)变化都调用apply()
,闪烁就越严重。
树莓派引脚排列参考
API 文档
树莓派交叉编译说明
依赖关系
~2.5MB
~45K SLoC