Coder Social home page Coder Social logo

georges760 / rppal Goto Github PK

View Code? Open in Web Editor NEW

This project forked from golemparts/rppal

0.0 0.0 0.0 1.34 MB

A Rust library that provides access to the Raspberry Pi's GPIO, I2C, PWM, SPI and UART peripherals.

License: MIT License

Rust 100.00%

rppal's Introduction

RPPAL - Raspberry Pi Peripheral Access Library

Build status crates.io MIT licensed Minimum rustc version

RPPAL provides access to the Raspberry Pi's GPIO, I2C, PWM, SPI and UART peripherals through a user-friendly interface. In addition to peripheral access, RPPAL also offers support for USB to serial adapters.

The library can be used in conjunction with a variety of platform-agnostic drivers through its embedded-hal trait implementations. Both embedded-hal v0.2.7 and v1.0.0-alpha.9 are supported.

RPPAL requires Raspberry Pi OS or any similar, recent, Linux distribution. Both gnu and musl libc targets are supported. RPPAL is compatible with the Raspberry Pi A, A+, B, B+, 2B, 3A+, 3B, 3B+, 4B, CM, CM 3, CM 3+, CM 4, 400, Zero, Zero W and Zero 2 W. Backwards compatibility for minor revisions isn't guaranteed until v1.0.0.

This library is under development on the master branch of the repository on GitHub. If you're looking for the README.md or the examples directory 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.

Table of contents

Documentation

Online documentation is available for the latest release, older releases, and the version currently in development.

Usage

Add a dependency for rppal to your Cargo.toml using cargo add rppal, or by adding the following line to your dependencies section.

[dependencies]
rppal = "0.14.1"

If your project requires embedded-hal trait implementations, specify either the hal or hal-unproven feature flag in the dependency declaration.

[dependencies]
rppal = { version = "0.14.1", features = ["hal"] }

Call new() on any of the peripherals to construct a new instance.

use rppal::gpio::Gpio;
use rppal::i2c::I2c;
use rppal::pwm::{Channel, Pwm};
use rppal::spi::{Bus, Mode, SlaveSelect, Spi};
use rppal::uart::{Parity, Uart};

let gpio = Gpio::new()?;
let i2c = I2c::new()?;
let pwm = Pwm::new(Channel::Pwm0)?;
let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 16_000_000, Mode::Mode0)?;
let uart = Uart::new(115_200, Parity::None, 8, 1)?;

Access to 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.

Examples

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.

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<dyn Error>> {
    println!("Blinking an LED on a {}.", DeviceInfo::new()?.model());

    let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();

    // Blink the LED by setting the pin's logic level high for 500 ms.
    pin.set_high();
    thread::sleep(Duration::from_millis(500));
    pin.set_low();

    Ok(())
}

Additional examples can be found in the examples directory.

Optional features

By default, all optional features are disabled. You can enable a feature by specifying the relevant feature flag(s) in the dependency declaration for rppal in your Cargo.toml.

  • hal - Enables embedded-hal trait implementations for all supported peripherals. This doesn't include unproven traits.
  • hal-unproven - Enables embedded-hal trait implementations for all supported peripherals, including traits marked as unproven. Note that embedded-hal's unproven traits don't follow semver rules. Patch releases may introduce breaking changes.

Supported peripherals

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.

Features

  • Get/set pin mode and logic level
  • Configure built-in pull-up/pull-down resistors
  • Synchronous and asynchronous interrupt handlers
  • Software-based PWM implementation
  • Optional embedded-hal trait implementations

The Broadcom Serial Controller (BSC) peripheral controls a proprietary bus compliant with the I2C bus/interface. RPPAL communicates with the BSC using the i2cdev character device.

Features

  • Single master, 7-bit slave addresses, transfer rates up to 400 kbit/s (Fast-mode)
  • I2C basic read/write, block read/write, combined write+read
  • SMBus protocols: Quick Command, Send/Receive Byte, Read/Write Byte/Word, Process Call, Block Write, PEC
  • Optional embedded-hal trait implementations

RPPAL controls the Raspberry Pi's PWM peripheral through the pwm sysfs interface.

Features

  • Up to two hardware PWM channels
  • Configurable frequency, duty cycle and polarity
  • Optional embedded-hal trait implementations

RPPAL controls the Raspberry Pi's main and auxiliary SPI peripherals through the spidev character device.

Features

  • SPI master, mode 0-3, Slave Select active-low/active-high, 8 bits per word, configurable clock speed
  • Half-duplex reads, writes, and multi-segment transfers
  • Full-duplex transfers and multi-segment transfers
  • Customizable options for each segment in a multi-segment transfer (clock speed, delay, SS change)
  • Reverse bit order helper function
  • Optional embedded-hal trait implementations

RPPAL controls the Raspberry Pi's UART peripherals through the ttyAMA0 (PL011) and ttyS0 (mini UART) character devices. USB to serial adapters are controlled using the ttyUSBx and ttyACMx character devices.

Features

  • Support for UART peripherals (PL011, mini UART) and USB to serial adapters
  • None/Even/Odd/Mark/Space parity, 5-8 data bits, 1-2 stop bits
  • Transfer rates up to 4 Mbit/s (device-dependent)
  • XON/XOFF software flow control
  • RTS/CTS hardware flow control with automatic pin configuration
  • Optional embedded-hal trait implementations

Cross compilation

If you're not working directly on a Raspberry Pi, you'll have 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.

Cargo

For manual cross-compilation without the use of cross, you will need to install the appropriate target. Most Raspberry Pi models either need the armv7-unknown-linux-gnueabihf target for 32-bit Linux distributions, or aarch64-unknown-linux-gnu for 64-bit. For some models, like the Raspberry Pi Zero, a different target triple is required.

Install the relevant target using rustup.

rustup target install armv7-unknown-linux-gnueabihf

In the root directory of your project, create a .cargo subdirectory, and save the following snippet to .cargo/config.

[build]
target = "armv7-unknown-linux-gnueabihf"

Visual Studio Code

The rust-analyzer extension for Visual Studio Code needs to be made aware of the target platform by setting the rust-analyzer.cargo.target configuration option. In the root directory of your project, create a .vscode subdirectory, and then save the following snippet to .vscode/settings.json.

{
    "rust-analyzer.cargo.target": "armv7-unknown-linux-gnueabihf"
}

Caution

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.

Copyright and license

Copyright (c) 2017-2022 Rene van der Meer. Released under the MIT license.

rppal's People

Contributors

aehmlo avatar benkard avatar binarybana avatar cbjamo avatar dragonrun1 avatar foxzool avatar gferon avatar golemparts avatar jacobrosenthal avatar lazybun avatar majkl578 avatar makerio90 avatar mbuesch avatar mcbridejc avatar reitermarkus avatar rumatoest avatar thecatster avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.