M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
unit_ak8963.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_UNIT_UNIT_AK8963_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_AK8963_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <memory>
16#include "unit_ak8963_data.hpp"
18
19namespace m5 {
20namespace unit {
21
29class UnitAK8963 : public Component,
30 public PeriodicMeasurementAdapter<UnitAK8963, ak8963::Data>,
32 M5_UNIT_COMPONENT_HPP_BUILDER(UnitAK8963, 0x0C);
33
34public:
39 struct config_t {
41 bool start_periodic{true};
46 ak8963::MeasurementMode measurement_mode{ak8963::MeasurementMode::Cont100Hz};
48 ak8963::OutputBit output_bit{ak8963::OutputBit::Bit16};
49 };
50
53 explicit UnitAK8963(const uint8_t addr = DEFAULT_ADDRESS);
55 virtual ~UnitAK8963()
56 {
57 }
58
60 virtual bool begin() override;
63 virtual void update(const bool force = false) override;
64
69 {
70 return _cfg;
71 }
73 void config(const config_t& cfg)
74 {
75 _cfg = cfg;
76 }
78
86 bool softReset();
88
91
113
116
131
134
140 bool sleep() override;
148 bool wakeup() override;
150
155 virtual m5::imu::Capability imuSpec() const override
156 {
157 return m5::imu::Capability::Mag;
158 }
165 virtual void imuConvertParam(m5::imu::imu_convert_param_t& out) const override;
167
168protected:
169 bool start_periodic_measurement(const ak8963::MeasurementMode mode, const ak8963::OutputBit bit);
170 bool start_periodic_measurement();
171 bool stop_periodic_measurement();
172 bool read_measurement(ak8963::Data& d);
173 bool read_sensitivity(std::array<uint8_t, 3>& asa);
174
175 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitAK8963, ak8963::Data);
176
177private:
178 config_t _cfg{};
179 // Live state, seeded from _cfg by begin() and thereafter owned by writeMeasurementMode(); _cfg
180 // is only ever read in begin()
181 ak8963::MeasurementMode _mode{ak8963::MeasurementMode::Cont100Hz};
182 ak8963::OutputBit _bit{ak8963::OutputBit::Bit16};
183 std::array<uint8_t, 3> _asa{}; // Per-axis sensitivity adjustment (read once in begin, FUSE-ROM)
184 uint32_t _pushed{}, _consumed{};
185 std::unique_ptr<m5::container::CircularBuffer<ak8963::Data>> _data{};
186};
187
188namespace ak8963 {
190constexpr uint32_t DEFAULT_STORED_SIZE{4};
191
192namespace command {
194constexpr uint8_t REG_WIA{0x00}; // WHO_AM_I = 0x48
195constexpr uint8_t REG_ST1{0x02}; // burst start: ST1 + X/Y/Z(LE) + ST2 = 8 bytes
196constexpr uint8_t REG_CNTL1{0x0A}; // bits[3:0] mode, bit4 = 16bit
197constexpr uint8_t REG_CNTL2{0x0B}; // bit0 = SRST
198constexpr uint8_t REG_ASAX{0x10}; // ASAX/ASAY/ASAZ (FUSE-ROM only)
200} // namespace command
201} // namespace ak8963
202
203} // namespace unit
204} // namespace m5
205#endif
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
3-axis magnetometer unit. No standalone GROVE unit exists; it is the magnetometer embedded in the MPU...
Definition unit_ak8963.hpp:31
bool sleep() override
Enter power-down mode (REG_CNTL1 mode 0)
Definition unit_ak8963.cpp:210
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_ak8963.cpp:200
virtual ~UnitAK8963()
Destructor.
Definition unit_ak8963.hpp:55
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_ak8963.cpp:270
UnitAK8963(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_ak8963.cpp:31
virtual void update(const bool force=false) override
Update the unit.
Definition unit_ak8963.cpp:142
bool readMeasurementMode(ak8963::MeasurementMode &mode, ak8963::OutputBit &bit) const
Read the continuous measurement rate and output bit width.
Definition unit_ak8963.cpp:97
virtual bool begin() override
Begin the unit.
Definition unit_ak8963.cpp:40
bool writeMeasurementMode(const ak8963::MeasurementMode mode, const ak8963::OutputBit bit)
Write the continuous measurement rate and output bit width.
Definition unit_ak8963.cpp:77
config_t config() const
Gets the configuration.
Definition unit_ak8963.hpp:68
void config(const config_t &cfg)
Set the configuration.
Definition unit_ak8963.hpp:73
bool wakeup() override
Leave power-down.
Definition unit_ak8963.cpp:225
bool softReset()
Soft reset (REG_CNTL2 SRST), leaving the chip initialized but unconfigured and stopped.
Definition unit_ak8963.cpp:104
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_ak8963.hpp:155
bool stopPeriodicMeasurement()
Mark periodic measurement as stopped (bookkeeping only; the chip stays in its current mode – call sle...
Definition unit_ak8963.cpp:205
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_ak8963.cpp:246
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
Unit-related namespace.
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_ak8963.hpp:39
ak8963::MeasurementMode measurement_mode
Definition unit_ak8963.hpp:46
ak8963::OutputBit output_bit
Output bit width. Full scale is the same either way, only the resolution differs.
Definition unit_ak8963.hpp:48
bool start_periodic
Start periodic measurement on begin()?
Definition unit_ak8963.hpp:41
One AK8963 sample: an 8-byte burst from ST1 (0x02) plus the device ASA trim.
Definition unit_ak8963_data.hpp:84
constexpr uint32_t DEFAULT_STORED_SIZE
Default ring buffer depth.
Definition unit_ak8963.hpp:190
AK8963 setting enums and measurement data (framework independent)
MeasurementMode
Continuous measurement rate, the subset of Mode this driver measures in.
Definition unit_ak8963_data.hpp:42
OutputBit
Output bit width (CNTL1 bit4 BIT)
Definition unit_ak8963_data.hpp:53