#i2c-driver #i2c #driver #dmp #motion

no-std drogue-mpu-6050

InvenSense MPU-6050 i2c 驱动程序

1 个不稳定版本

0.1.0 2020年10月19日

#1395嵌入式开发

Apache-2.0

43KB
797 代码行

crates.io docs.rs Matrix

drogue-mpu-6050

为InvenSense MPU-6050 运动处理器提供的i2c驱动程序。

高级DMP

此驱动程序可以在芯片上加载基于四元数的DMP处理的适当固件。

设置

i2c

按照常规初始化您的i2c总线

let scl3 = gpioc.pc0.into_open_drain_output(&mut gpioc.moder, &mut gpioc.otyper).into_af4(&mut gpioc.moder, &mut gpioc.afrl);
let sda3 = gpioc.pc1.into_open_drain_output(&mut gpioc.moder, &mut gpioc.otyper).into_af4(&mut gpioc.moder, &mut gpioc.afrl);
let i2c = I2c::i2c3(device.I2C3, (scl3, sda3), KiloHertz(100), clocks, &mut rcc.apb1r1);

MPU驱动程序

MPU驱动程序需要一个具有embedded-time功能的时钟。

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

一旦时钟开始滴答,您就可以操作MPU。为了方便,提供了initialize_dmp()方法来设置合理的配置并将DMP固件加载到处理器中。

let sensor: &mut Mpu6050<'_, _, _> = ctx.resources.sensor;
sensor.initialize_dmp().unwrap();

如果使用高级的芯片内DMP逻辑,FIFO将包含28字节的四元数和其他数据包。

前16个字节是四元数,可以使用Quaternion类构建。

let len = sensor.get_fifo_count().unwrap();
if len >= 28 {
    let buf = sensor.read_fifo(&mut buf).unwrap();
    let q = Quaternion::from_bytes(&buf[0..16]).unwrap().normalize();
    ....
}

四元数也可以转换为EulerYawPitchRoll测量。

依赖关系

~2MB
~34K SLoC