#raspberry-pi #gpio-pin #pi #raspberry #gpio #rpi #shift-register

cupi_shift

一个用于通过树莓派GPIO引脚操作移位寄存器的Rust包

1个不稳定版本

使用旧的Rust 2015

0.1.0 2016年11月18日

#1639硬件支持

MIT 许可证

16KB
115

cupi_shift

一个用于通过树莓派GPIO引脚操作移位寄存器的Rust包。

Build Status

概述

此包提供了一种名为 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。如果我们为每个都设置applytrue,可能会出现一些闪烁。链中的移位寄存器越多,如果每次状态(即数据)变化都调用apply(),闪烁就越严重。

树莓派引脚排列参考

图片

API 文档

文档

树莓派交叉编译说明

说明

依赖关系

~2.5MB
~45K SLoC