5 releases (breaking)
new 0.6.0 | Jan 7, 2025 |
---|---|
0.5.0 | Dec 24, 2024 |
0.4.0 | Feb 12, 2024 |
0.3.0 | Jan 30, 2023 |
0.2.0 | Mar 2, 2022 |
#127 in Embedded development
232 downloads per month
135KB
2K
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
andembedded-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)
Examples
The examples
directory contains several examples demonstrating different features:
- Basic Async: Basic sensor initialization and data reading
- DMP Features: Digital Motion Processor usage and configuration
- FIFO Buffer: FIFO buffer operations and data processing
- Quaternion: 3D orientation tracking using quaternions
- Motion Detection: Hardware motion detection with configurable sensitivity
See the examples README for detailed information.
Demo Projects
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();
Temperature Measurement
The MPU-6050 includes an on-chip temperature sensor. Temperature readings are available through the temperature()
method when the temperature
feature is enabled (enabled by default):
// Get temperature reading
let temp = sensor.temperature().unwrap();
println!("Temperature: {}°C", temp.celsius());
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
~425–610KB
~12K SLoC