#i2c-driver #dmp #i2c #driver #motion #no-std

no-std mpu6050-dmp

Platform-independent I2C driver for MPU6050. Supports DMP usage. Fork of drogue-mpu-6050 which uses only embedded-hal traits (no dependency on embedded-time or drogue-embedded-timer).

3 releases (breaking)

0.4.0 Feb 12, 2024
0.3.0 Jan 30, 2023
0.2.0 Mar 2, 2022

#210 in Embedded development

Download history 68/week @ 2024-02-12 16/week @ 2024-02-19 31/week @ 2024-02-26

115 downloads per month

Apache-2.0

68KB
1.5K SLoC

mpu6050-dmp

Platform-independent i2c Driver for the InvenSense MPU-6050 motion-processor.

Fork of drogue-mpu-6050

Reasons/differences:

  • Dependency on drogue-embedded-timer and embedded-time removed
    • Timers are not required in regular operation, just for setup
    • drogue-embedded-timer is out of sync with current versions of embedded-time as of time-of-fork
  • Dependency on log removed
  • Slight difference in conversion of Quaternion to YPR (no pitch -= PI)
  • Various fixes for e.g. clippy lints (also PR'd upstream)

Demo Project for STM32F1

Demo Project for STM32F4

On-Chip DMP 'Digital Motion Processor'

This driver can load the appropriate firmware for quaternion-based on-chip DMP processing.

Setup

i2c

Initialize your i2c bus:

let gpiob = dp.GPIOB.split();
let scl = gpiob
    .pb8
    .into_alternate()
    .internal_pull_up(true)
    .set_open_drain();
let sda = gpiob
    .pb9
    .into_alternate()
    .internal_pull_up(true)
    .set_open_drain();
let i2c = dp.I2C1.i2c((scl, sda), 400.kHz(), &clocks);

MPU driver

let sensor = Mpu6050::new(i2c, Address::default()).unwrap();

Setting up the DMP requires temporary exclusive access to a blocking delay implementation. The initialize_dmp(&mut delay) method is provided to set up reasonable configurations and load the DMP firmware into the processor.

sensor.initialize_dmp(&mut delay).unwrap();

If using the advanced on-chip DMP logic, the FIFO will contain 28-byte packets of quaternion and other data.

The first 16 bytes are quaternions, which can be constructed using the Quaternion class.

let len = sensor.get_fifo_count().unwrap();
if len >= 28 {
    let buf = sensor.read_fifo(&mut buf).unwrap();
    let q = Quaternion::from_bytes(&buf[..16]).unwrap().normalize();
    let ypr = YawPitchRoll::from(quat);
    rprintln!("{:?}", ypr);
}

Dependencies

~465KB