commit 991383bdce3d499f8ec13a078b54e1f0b6c20b64
Author: Daniel P. <daniel@steew.eu>
Date: Sun Nov 02 22:03:42 2025 +0000
diff --git a/fw/RustFM/Cargo.toml b/fw/RustFM/Cargo.toml
index 1930c59..31f9549 100644
--- a/fw/RustFM/Cargo.toml
+++ b/fw/RustFM/Cargo.toml
@@ -57 +57 @@ edition = "2021"
[dependencies]
# mpu6050 = "0.1.6"
-mpu6050-dmp = "0.6.1"
+mpu6050-dmp = {version = "0.6.1", features = ["async"]}
embassy-executor = { version = "0.9.0", features = ["defmt", "arch-cortex-m", "executor-thread"] }
embassy-time = { version = "0.5.0", features = ["defmt"] }
embassy-sync = { version = "0.7.2", features = [ "defmt" ] }
diff --git a/fw/RustFM/src/main.rs b/fw/RustFM/src/main.rs
index 954f462..8b03cad 100644
--- a/fw/RustFM/src/main.rs
+++ b/fw/RustFM/src/main.rs
@@ -115 +129 @@
#![no_std]
#![no_main]
-use defmt::{trace};
+use defmt::info;
use embassy_executor::Spawner;
use embassy_stm32::{
- exti::ExtiInput, gpio::{AnyPin, Level, Output, Speed}, i2c::{self, I2c, Master}, mode::Blocking, rcc::{self}, Config, Peri
+ bind_interrupts,
+ exti::ExtiInput,
+ gpio::{AnyPin, Level, Output, Speed},
+ i2c::{self, I2c, Master},
+ mode::Async,
+ rcc::{self},
+ Config, Peri,
};
-use embassy_time::{Timer, Delay};
+use embassy_time::{Delay, Timer};
use {defmt_rtt as _, panic_probe as _};
-use mpu6050_dmp::{sensor::Mpu6050};
+use mpu6050_dmp::{
+ calibration::CalibrationParameters, quaternion::Quaternion, sensor_async::Mpu6050,
+ yaw_pitch_roll::YawPitchRoll,
+};
+
+bind_interrupts!(struct Irqs {
+ I2C1_EV => i2c::EventInterruptHandler<embassy_stm32::peripherals::I2C1>;
+ I2C1_ER => i2c::ErrorInterruptHandler<embassy_stm32::peripherals::I2C1>;
+});
#[embassy_executor::main]
async fn main(spawner: Spawner) {
@@ -2014 +3423 @@ async fn main(spawner: Spawner) {
-
- let iic = I2c::new_blocking(p.I2C1, p.PA9, p.PA10, i2c::Config::default());
+
+ // let iic = I2c::new_blocking(p.I2C1, p.PA9, p.PA10, i2c::Config::default());
+ let iic = I2c::new(
+ p.I2C1,
+ p.PA9,
+ p.PA10,
+ Irqs,
+ p.DMA1_CH6,
+ p.DMA1_CH7,
+ i2c::Config::default(),
+ );
-
+
@@ -3614 +5913 @@ async fn main(spawner: Spawner) {
-
+
-
}
#[embassy_executor::task(pool_size = 2)]
@@ -6931 +9155 @@ async fn transmit(p: Peri<'static, AnyPin>) {
- Timer::after_millis(4).await;
+ Timer::after_millis(1).await;
}
-
#[embassy_executor::task]
-async fn read_mpu(iic: I2c<'static, Blocking, Master>, mut ext: ExtiInput<'static>) {
- let mpu = Mpu6050::new(iic, mpu6050_dmp::address::Address::default());
- let mut mpu = mpu.unwrap();
- mpu.initialize_dmp(&mut Delay).unwrap();
- mpu.enable_dmp().unwrap();
- mpu.set_clock_source(mpu6050_dmp::clock_source::ClockSource::Xgyro).unwrap();
- let mut fifo : [u8; 6] = [0; 6];
- mpu.interrupt_fifo_oflow_en().unwrap();
- mpu.enable_fifo().unwrap();
- mpu.interrupt_read_clear().unwrap();
+async fn read_mpu(iic: I2c<'static, Async, Master>, mut ext: ExtiInput<'static>) {
+ let mut mpu = Mpu6050::new(iic, mpu6050_dmp::address::Address::default())
+ .await
+ .unwrap();
+ mpu.initialize_dmp(&mut Delay).await.unwrap();
+ // Configure calibration parameters
+ let calibration_params = CalibrationParameters::new(
+ mpu6050_dmp::accel::AccelFullScale::G2,
+ mpu6050_dmp::gyro::GyroFullScale::Deg2000,
+ mpu6050_dmp::calibration::ReferenceGravity::ZN,
+ );
+
+ // info!("Calibrating Sensor");
+ // mpu
+ // .calibrate(&mut Delay, &calibration_params)
+ // .await
+ // .unwrap();
+ // info!("Sensor Calibrated");
+ mpu.enable_dmp().await.unwrap();
+ mpu.load_firmware().await.unwrap();
+ mpu.boot_firmware().await.unwrap();
+ // mpu.set_clock_source(mpu6050_dmp::clock_source::ClockSource::Xgyro).unwrap();
+ let mut fifo: [u8; 28] = [0; 28];
+ mpu.interrupt_fifo_oflow_en().await.unwrap();
+ mpu.enable_fifo().await.unwrap();
- trace!("Received new data");
- mpu.read_fifo(&mut fifo).unwrap();
+ // info!("Received new data");
+ mpu.read_fifo(&mut fifo).await.unwrap();
- // trace!("X: {}, Y: {}, Z: {}" , accel.x(), accel.y(), accel.z());
- trace!("{}", fifo);
- mpu.interrupt_read_clear().unwrap();
+ // trace!("X: {}, Y: {}, Z: {}" , accel.x(), accel.y(),accel.z());
+ // trace!("{}", fifo);
+ let quat = Quaternion::from_bytes(&fifo[..16]).unwrap().normalize();
+ let ypr = YawPitchRoll::from(quat);
+ let yaw_deg = ypr.yaw * 180.0 / core::f32::consts::PI;
+ let pitch_deg = ypr.pitch * 180.0 / core::f32::consts::PI;
+ let roll_deg = ypr.roll * 180.0 / core::f32::consts::PI;
+
+ info!(
+ " Angles [deg]: yaw={}, pitch={}, roll={}",
+ yaw_deg, pitch_deg, roll_deg
+ );
+ mpu.interrupt_read_clear().await.unwrap();
+ mpu.reset_fifo().await.unwrap();
}
-