Crate lsm303agr

source ·
Expand description

This is a platform agnostic Rust driver for the LSM303AGR ultra-compact high-performance eCompass module: ultra-low-power 3D accelerometer and 3D magnetometer using the embedded-hal traits.

This driver allows you to:

§The devices

The LSM303AGR is an ultralow-power high-performance system-in-package featuring a 3-axis digital linear acceleration sensor and a 3-axis digital magnetic sensor.

The LSM303AGR has linear acceleration full scales of ±2g/±4g/±8g/±16g and a magnetic field dynamic range of ±50 gauss. The LSM303AGR includes an I²C serial bus interface that supports standard, fast mode, fast mode plus, and high-speed (100 kHz, 400 kHz, 1 MHz, and 3.4 MHz) and an SPI serial standard interface.

The system can be configured to generate an interrupt signal for free-fall, motion detection, and magnetic field detection. The magnetic and accelerometer blocks can be enabled or put into power-down mode separately.

Documents: Datasheet - Application note

§Usage examples (see also examples folder)

To use this driver, import this crate and an embedded_hal implementation, then instantiate the appropriate device.

Please find additional examples using hardware in this repository: driver-examples

§Connect through I2C, initialize and take some measurements

use linux_embedded_hal::{Delay, I2cdev};
use lsm303agr::{AccelMode, AccelOutputDataRate, Lsm303agr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Lsm303agr::new_with_i2c(dev);

sensor.init().unwrap();
sensor.set_accel_mode_and_odr(&mut Delay, AccelMode::Normal, AccelOutputDataRate::Hz10).unwrap();

loop {
    if sensor.accel_status().unwrap().xyz_new_data() {
        let data = sensor.acceleration().unwrap();
        println!("Acceleration: x {} y {} z {}", data.x_mg(), data.y_mg(), data.z_mg());
    }
}

§Connect through SPI, initialize and take some measurements

use linux_embedded_hal::{Delay, SpidevDevice};
use lsm303agr::{AccelMode, AccelOutputDataRate, Lsm303agr};

let accel_dev = SpidevDevice::open("/dev/spidev0.0").unwrap();
let mag_dev = SpidevDevice::open("/dev/spidev0.1").unwrap();
let mut sensor = Lsm303agr::new_with_spi(accel_dev, mag_dev);

sensor.init().unwrap();
sensor.set_accel_mode_and_odr(&mut Delay, AccelMode::Normal, AccelOutputDataRate::Hz10).unwrap();

loop {
    if sensor.accel_status().unwrap().xyz_new_data() {
        let data = sensor.acceleration().unwrap();
        println!("Acceleration: x {} y {} z {}", data.x_mg(), data.y_mg(), data.z_mg());
    }
}

Modules§

Structs§

Enums§