M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
m5::unit::UnitMAG3110 Class Reference

NXP/Freescale MAG3110 3-axis magnetometer. No standalone GROVE unit exists; it is the magnetometer on the original (2017) classic M5Stack Gray (paired with an MPU6050). It sits directly on the host I2C bus at 0x0E (no aux bypass needed, unlike the MPU9250's AK8963). More...

#include <unit_mag3110.hpp>

Inheritance diagram for m5::unit::UnitMAG3110:
m5::imu::IMUDataSource

Classes

struct  config_t
 Settings for begin() More...
 

Public Member Functions

 UnitMAG3110 (const uint8_t addr=DEFAULT_ADDRESS)
 Construct with the I2C address the chip will answer on.
 
virtual ~UnitMAG3110 ()
 Destructor.
 
virtual bool begin () override
 Begin the unit.
 
virtual void update (const bool force=false) override
 Update the unit.
 
Settings
config_t config () const
 Gets the configuration.
 
void config (const config_t &cfg)
 Set the configuration.
 
Reset
bool softReset ()
 Soft reset (the MAG3110 has no reset command; returns to STANDBY via REG_CTRL_REG1), leaving the chip initialized but unconfigured and stopped.
 
Measurement setting (stop periodic measurement first)
bool writeDataRate (const mag3110::DataRate rate, const mag3110::OverSampling os)
 Write the output data rate and over sampling ratio.
 
bool readDataRate (mag3110::DataRate &rate, mag3110::OverSampling &os)
 Read the output data rate and over sampling ratio.
 
Periodic measurement
bool startPeriodicMeasurement (const mag3110::DataRate rate, const mag3110::OverSampling os)
 Start periodic measurement (auto magnetic reset + continuous ACTIVE)
 
bool startPeriodicMeasurement ()
 Start periodic measurement in the current settings.
 
bool stopPeriodicMeasurement ()
 Mark periodic measurement as stopped (bookkeeping only; the chip stays in ACTIVE – call sleep() to drop to STANDBY for actual quiescence)
 
Power
bool sleep () override
 Enter STANDBY mode (REG_CTRL_REG1 AC cleared)
 
bool wakeup () override
 Leave STANDBY.
 
IMUDataSource
virtual m5::imu::Capability imuSpec () const override
 Capability of this unit.
 
virtual m5::imu::Capability readImuRaw (m5::imu::imu_raw_data_t &out) override
 Read the latest raw IMU data.
 
virtual void imuConvertParam (m5::imu::imu_convert_param_t &out) const override
 Gets the conversion parameters for raw IMU data.
 

Protected Member Functions

bool start_periodic_measurement (const mag3110::DataRate rate, const mag3110::OverSampling os)
 
bool start_periodic_measurement ()
 
bool stop_periodic_measurement ()
 
bool read_measurement (mag3110::Data &d)
 
 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER (UnitMAG3110, mag3110::Data)
 

Detailed Description

NXP/Freescale MAG3110 3-axis magnetometer. No standalone GROVE unit exists; it is the magnetometer on the original (2017) classic M5Stack Gray (paired with an MPU6050). It sits directly on the host I2C bus at 0x0E (no aux bypass needed, unlike the MPU9250's AK8963).

Constructor & Destructor Documentation

◆ UnitMAG3110()

m5::unit::UnitMAG3110::UnitMAG3110 ( const uint8_t addr = DEFAULT_ADDRESS)
explicit

Construct with the I2C address the chip will answer on.

Parameters
[in]addrI2C address (defaults to the chip's factory address)

Member Function Documentation

◆ imuConvertParam()

void m5::unit::UnitMAG3110::imuConvertParam ( m5::imu::imu_convert_param_t & out) const
overridevirtual

Gets the conversion parameters for raw IMU data.

Parameters
[out]outDestination for the scale factors this driver applies

Implements m5::imu::IMUDataSource.

◆ imuSpec()

virtual m5::imu::Capability m5::unit::UnitMAG3110::imuSpec ( ) const
inlineoverridevirtual

Capability of this unit.

Returns
Mag (no temperature output exposed)

Implements m5::imu::IMUDataSource.

◆ readDataRate()

bool m5::unit::UnitMAG3110::readDataRate ( mag3110::DataRate & rate,
mag3110::OverSampling & os )

Read the output data rate and over sampling ratio.

Parameters
[out]rateOutput data rate
[out]osOver sampling ratio
Returns
True if successful
Note
Decoded from REG_CTRL_REG1, so it works while measuring as well as while stopped

◆ readImuRaw()

Capability m5::unit::UnitMAG3110::readImuRaw ( m5::imu::imu_raw_data_t & out)
overridevirtual

Read the latest raw IMU data.

Parameters
[out]outDestination buffer filled with the most recent sample
Returns
Capability of the sample (which axes were populated)

Implements m5::imu::IMUDataSource.

◆ sleep()

bool m5::unit::UnitMAG3110::sleep ( )
overridevirtual

Enter STANDBY mode (REG_CTRL_REG1 AC cleared)

Returns
True if successful

Works while periodic measurement is running: it is stopped first, since a standby chip produces no data. STANDBY is the MAG3110's low-power state.

Reimplemented from m5::imu::IMUDataSource.

◆ softReset()

bool m5::unit::UnitMAG3110::softReset ( )

Soft reset (the MAG3110 has no reset command; returns to STANDBY via REG_CTRL_REG1), leaving the chip initialized but unconfigured and stopped.

Returns
True if successful
Warning
During periodic measurements, an error is returned; call stopPeriodicMeasurement() first
Measurement stops and settings must be reapplied; call startPeriodicMeasurement() to reconfigure and resume measurement

◆ startPeriodicMeasurement() [1/2]

bool m5::unit::UnitMAG3110::startPeriodicMeasurement ( )

Start periodic measurement in the current settings.

Returns
True if successful

◆ startPeriodicMeasurement() [2/2]

bool m5::unit::UnitMAG3110::startPeriodicMeasurement ( const mag3110::DataRate rate,
const mag3110::OverSampling os )

Start periodic measurement (auto magnetic reset + continuous ACTIVE)

Parameters
[in]rateOutput data rate
[in]osOver sampling ratio
Returns
True if successful

◆ stopPeriodicMeasurement()

bool m5::unit::UnitMAG3110::stopPeriodicMeasurement ( )

Mark periodic measurement as stopped (bookkeeping only; the chip stays in ACTIVE – call sleep() to drop to STANDBY for actual quiescence)

Returns
True on success

◆ update()

void m5::unit::UnitMAG3110::update ( const bool force = false)
overridevirtual

Update the unit.

Parameters
[in]forceForces an update if true, even if not time for periodic measurement

◆ wakeup()

bool m5::unit::UnitMAG3110::wakeup ( )
overridevirtual

Leave STANDBY.

Returns
True (always)

No-op by design: on the MAG3110 STANDBY is also the state the chip has to be in to be configured, so there is nothing to undo here. Call startPeriodicMeasurement() to enter ACTIVE continuous measurement.

Reimplemented from m5::imu::IMUDataSource.

◆ writeDataRate()

bool m5::unit::UnitMAG3110::writeDataRate ( const mag3110::DataRate rate,
const mag3110::OverSampling os )

Write the output data rate and over sampling ratio.

Parameters
[in]rateOutput data rate
[in]osOver sampling ratio
Returns
True if successful

Applied to the chip immediately, and to the periodic measurement interval

Warning
Fails while periodic measurement is running. Every REG_CTRL_REG1 field except AC can only be changed in STANDBY, and a write attempted in ACTIVE is silently ignored rather than reported – so this drops the chip to STANDBY itself instead of trusting inPeriodic(), which says nothing about AC (stopPeriodicMeasurement() leaves the chip running by design; sleep() is what stops it)
Note
The datasheet notes the first output period after leaving STANDBY reads slightly off