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

no-std mpu6050-dmp

适用于MPU6050的平台无关I2C驱动程序。支持DMP使用。drogue-mpu-6050的分支,仅使用嵌入式-hal特性(不依赖于嵌入式-time或drogue-embedded-timer)。

3个版本 (重大变更)

0.4.0 2024年2月12日
0.3.0 2023年1月30日
0.2.0 2022年3月2日

#370 in 嵌入式开发

每月 33次下载

Apache-2.0

68KB
1.5K SLoC

mpu6050-dmp

适用于InvenSense MPU-6050运动处理器的平台无关i2c驱动程序。

drogue-mpu-6050的分支

原因/差异

  • 移除了对drogue-embedded-timerembedded-time的依赖
    • 定时器在常规操作中不是必需的,仅用于设置
    • drogue-embedded-timer与分支时的嵌入式-time版本不同步
  • 移除了对log的依赖
  • 四元数到YPR转换存在微小差异(没有pitch -= PI
  • 对例如clippy lints的各种修复(也提交了PR到上游)

STM32F1的示例项目

STM32F4的示例项目

片上DMP '数字运动处理器'

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

设置

i2c

初始化您的i2c总线

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驱动程序

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

设置DMP需要暂时独占访问阻塞延迟实现。提供initialize_dmp(&mut delay)方法来设置合理的配置并将DMP固件加载到处理器中。

sensor.initialize_dmp(&mut delay).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[..16]).unwrap().normalize();
    let ypr = YawPitchRoll::from(quat);
    rprintln!("{:?}", ypr);
}

依赖项

~465KB