RPPAL is a Rust library that provides access to the Raspberry Pi's GPIO, I2C, PWM and SPI peripherals. Support for additional peripherals will be added in future updates. The library is compatible with the Raspberry Pi A, A+, B, B+, 2B, 3A+, 3B, 3B+, Compute, Compute 3, Zero and Zero W.
Backwards compatibility for minor revisions isn't guaranteed until the library reaches v1.0.0.
RPPAL is currently under active development on the master branch of the repository on GitHub. If you're looking for the README.md
or the examples
folder for the latest release or any of the earlier releases, visit crates.io, download an archived release from the GitHub releases page, or clone and checkout the relevant release tag.
Online documentation is available for the latest release, older releases, and the version currently in development.
Add a dependency for rppal
to your Cargo.toml
.
toml
[dependencies]
rppal = "0.10"
Call new()
on any of the peripherals to construct a new instance.
```rust use rppal::gpio::Gpio; use rppal::i2c::I2c; use rppal::pwm::{Channel, Pwm}; use rppal::spi::{Bus, Mode, SlaveSelect, Spi};
let gpio = Gpio::new()?; let i2c = I2c::new()?; let pwm = Pwm::new(Channel::Pwm0)?; let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 16000000, Mode::Mode0)?; ```
Some peripherals may need to be enabled first through sudo raspi-config
or by editing /boot/config.txt
. Refer to the relevant module's documentation for any required steps.
This example demonstrates how to blink an LED connected to a GPIO pin. Remember to add a resistor of an appropriate value in series, to prevent exceeding the maximum current rating of the GPIO pin and the LED.
```rust use std::error::Error; use std::thread; use std::time::Duration;
use rppal::gpio::Gpio; use rppal::system::DeviceInfo;
// Gpio uses BCM pin numbering. BCM GPIO 23 is tied to physical pin 16. const GPIO_LED: u8 = 23;
fn main() -> Result<(), Box
let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();
// Blink the LED by setting the pin's logic level high for 500ms.
pin.set_high();
thread::sleep(Duration::from_millis(500));
pin.set_low();
Ok(())
} ```
Additional examples can be found in the examples
directory.
To ensure fast performance, RPPAL controls the GPIO peripheral by directly accessing the registers through either /dev/gpiomem
or /dev/mem
. GPIO interrupts are configured using the gpiochip
character device.
The Broadcom Serial Controller (BSC) peripheral controls a proprietary bus compliant with the I2C bus/interface. RPPAL communicates with the BSC using the i2cdev
device interface.
RPPAL controls the Raspberry Pi's PWM peripheral through the /sys/class/pwm
sysfs interface.
RPPAL controls the Raspberry Pi's main and auxiliary SPI peripherals through the spidev
device interface.
Always be careful when working with the Raspberry Pi's peripherals, especially if you attach any external components to the GPIO pins. Improper use can lead to permanent damage.
If you're not working directly on a Raspberry Pi, you'll likely need to cross compile your code for the appropriate ARM architecture. Check out this guide for more information, or try the cross project for "zero setup" cross compilation.
Copyright (c) 2017-2019 Rene van der Meer. Released under the MIT license.