10#ifndef M5_UNIT_IMU_UNIT_UNIT_MPU6XXX_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_MPU6XXX_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
32 public PeriodicMeasurementAdapter<UnitMPU6xxx, mpu6886::Data>,
64 virtual bool begin()
override;
67 virtual void update(
const bool force =
false)
override;
171 bool sleep()
override;
188 return m5::imu::Capability::Accel | m5::imu::Capability::Gyro | m5::imu::Capability::Temp;
201 explicit UnitMPU6xxx(
const uint8_t addr = DEFAULT_ADDRESS);
218 bool stop_periodic_measurement();
220 bool write_register8_verified(
const uint8_t reg,
const uint8_t val);
232 mpu6886::GyroRange _gyro_range{};
233 mpu6886::Dlpf _dlpf{};
234 uint8_t _sample_rate_div{};
235 uint32_t _pushed{}, _consumed{};
236 std::unique_ptr<m5::container::CircularBuffer<mpu6886::Data>> _data{};
242constexpr uint32_t DEFAULT_STORED_SIZE{8};
247constexpr uint8_t REG_GYRO_OFFS_USR{0x13};
248constexpr uint8_t REG_SMPLRT_DIV{0x19};
249constexpr uint8_t REG_CONFIG{0x1A};
250constexpr uint8_t REG_GYRO_CONFIG{0x1B};
251constexpr uint8_t REG_ACCEL_CONFIG{0x1C};
252constexpr uint8_t REG_ACCEL_CONFIG2{0x1D};
253constexpr uint8_t REG_FIFO_EN{0x23};
254constexpr uint8_t REG_INT_PIN_CFG{0x37};
255constexpr uint8_t REG_INT_ENABLE{0x38};
256constexpr uint8_t REG_INT_STATUS{0x3A};
257constexpr uint8_t REG_ACCEL_XOUT_H{0x3B};
258constexpr uint8_t REG_USER_CTRL{0x6A};
259constexpr uint8_t REG_PWR_MGMT_1{0x6B};
260constexpr uint8_t REG_PWR_MGMT_2{0x6C};
261constexpr uint8_t REG_WHO_AM_I{0x75};
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
Shared base for the TDK InvenSense MPU 6-axis family (accel + gyro + temp)
Definition unit_mpu6xxx.hpp:33
virtual float temperature_offset() const =0
Temperature conversion: degC offset (imu_convert_param_t::temp_offset)
bool writeGyroRange(const mpu6886::GyroRange range)
Write the gyroscope range.
Definition unit_mpu6xxx.cpp:220
UnitMPU6xxx(const uint8_t addr=DEFAULT_ADDRESS)
Protected: UnitMPU6xxx is abstract, constructed only by concrete derived chips.
Definition unit_mpu6xxx.cpp:37
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_mpu6xxx.cpp:177
bool sleep() override
Put the chip to sleep (REG_PWR_MGMT_1 SLEEP)
Definition unit_mpu6xxx.cpp:182
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_mpu6xxx.cpp:349
bool wakeup() override
Wake the chip from sleep()
Definition unit_mpu6xxx.cpp:197
bool readAccelRange(mpu6886::AccelRange &range)
Read the accelerometer range from the device (REG_ACCEL_CONFIG bits[4:3])
Definition unit_mpu6xxx.cpp:233
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_mpu6xxx.cpp:172
virtual bool accepts_whoami(const uint8_t id) const =0
Accepted WHO_AM_I id(s) for this chip; begin() rejects the device unless this returns true.
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_mpu6xxx.hpp:186
bool writeAccelRange(const mpu6886::AccelRange range)
Write the accelerometer range.
Definition unit_mpu6xxx.cpp:207
virtual void update(const bool force=false) override
Update the unit.
Definition unit_mpu6xxx.cpp:108
virtual bool start_periodic_measurement(const mpu6886::AccelRange accel_range, const mpu6886::GyroRange gyro_range, const mpu6886::Dlpf dlpf, const uint8_t sample_rate_div)
Virtual: UnitMPU9250 layers its aux-bypass re-open on top (the config write here includes INT_PIN_CFG...
Definition unit_mpu6xxx.cpp:125
bool writeSampleRateDiv(const uint8_t div)
Write the sample rate divider.
Definition unit_mpu6xxx.cpp:253
void config(const config_t &cfg)
Set the configuration.
Definition unit_mpu6xxx.hpp:79
virtual float temperature_res() const =0
Temperature conversion: degC per LSB (imu_convert_param_t::temp_res)
bool readGyroRange(mpu6886::GyroRange &range)
Read the gyroscope range from the device (REG_GYRO_CONFIG bits[4:3])
Definition unit_mpu6xxx.cpp:243
virtual bool begin() override
Begin the unit.
Definition unit_mpu6xxx.cpp:46
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_mpu6xxx.cpp:321
config_t config() const
Gets the configuration.
Definition unit_mpu6xxx.hpp:73
bool readDlpf(mpu6886::Dlpf &dlpf)
Read the digital low-pass filter bandwidth from the device (REG_CONFIG bits[2:0])
Definition unit_mpu6xxx.cpp:285
bool writeDlpf(const mpu6886::Dlpf dlpf)
Write the digital low-pass filter bandwidth.
Definition unit_mpu6xxx.cpp:272
bool readSampleRateDiv(uint8_t &div)
Read the sample rate divider from the device (REG_SMPLRT_DIV)
Definition unit_mpu6xxx.cpp:267
bool softReset()
Soft reset (REG_PWR_MGMT_1 DEVICE_RESET), leaving the chip initialized but unconfigured and stopped.
Definition unit_mpu6xxx.cpp:94
Public interface for IMU data providers.
Capability
Capability of the IMU data source (bitwise combinable)
Definition imu_types.hpp:22
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Raw to physical unit conversion coefficients.
Definition imu_types.hpp:69
Unified raw data (chip-native axes, no remap applied)
Definition imu_types.hpp:57
Settings for begin()
Definition unit_mpu6xxx.hpp:46
mpu6886::AccelRange accel_range
Accelerometer range.
Definition unit_mpu6xxx.hpp:50
uint8_t sample_rate_div
Sample rate divider (ODR = 1000/(1+div) Hz). 3 -> 250Hz.
Definition unit_mpu6xxx.hpp:56
mpu6886::GyroRange gyro_range
Gyroscope range.
Definition unit_mpu6xxx.hpp:52
mpu6886::Dlpf dlpf
Gyro/temp low pass filter.
Definition unit_mpu6xxx.hpp:54
bool start_periodic
Start periodic measurement on begin()?
Definition unit_mpu6xxx.hpp:48
One measurement (14 bytes burst from REG_ACCEL_XOUT_H, big-endian)
Definition unit_mpu6886_data.hpp:72
MPU6886 setting enums and measurement data (framework independent)
AccelRange
Accelerometer full scale range (register value = enum << 3)
Definition unit_mpu6886_data.hpp:24
GyroRange
Gyroscope full scale range (register value = enum << 3)
Definition unit_mpu6886_data.hpp:35
Dlpf
Gyro/temp digital low pass filter (REG_CONFIG reg DLPF_CFG, valid when FCHOICE_B=00)
Definition unit_mpu6886_data.hpp:46