uBit.compass#
Overview#
Onboard the micro:bit is an electronic magnetometer. Like the accelerometer, the
magnetometer is linked to the i2c bus, which is used to access data
on the magnetometer.
The magnetometer provides information about the magnetic field where a micro:bit is situated, crucially providing an indication of where magnetic North is located.
Raw magnetic field information alone is not enough to provide accurate compass headings. Therefore, the accelerometer is used in conjunction with the magnetometer to reduce the inaccuracy of the magnetometer reading.
The magnetometer is inaccurate because it considers all 3 planes: x, y and z. The heading North only exists in the horizontal planes (x and y), therefore we only need values in these planes. The accelerometer is used to filter out the vertical plane (z) to make our headings far more accurate. You can see this in action when calibrating the compass.
After calibration has been performed, the end product is an e-compass!
The micro:bit uses the NXP MAG3110.
Real time updates#
When using the standard uBit presentation, the compass is continuously updated in the background using an idle thread (after it is first used), which is executed whenever the micro:bit has no other tasks to perform.
If there is no scheduler running, the values are synchronously read on get[X,Y,Z]()
and heading()
calls. Additionally, if you would like to drive compass updates manually updateSample()
can be used.
Message Bus ID#
Constant | Value |
---|---|
MICROBIT_ID_COMPASS | 5 |
Message Bus Events#
Constant | Value |
---|---|
MICROBIT_COMPASS_EVT_CAL_REQUIRED | 1 (DEPRECATED) |
MICROBIT_COMPASS_EVT_CAL_START | 2 (DEPRECATED) |
MICROBIT_COMPASS_EVT_CAL_END | 3 (DEPRECATED) |
MICROBIT_COMPASS_EVT_DATA_UPDATE | 4 |
MICROBIT_COMPASS_EVT_CONFIG_NEEDED | 5 |
MICROBIT_COMPASS_EVT_CALIBRATE | 6 |
API#
Constructor#
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer, MicroBitStorage & _storage)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitStorage storage;
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer, MicroBitStorage & _storage, uint16_t address)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitStorage storage;
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer, MicroBitStorage & _storage, uint16_t address, uint16_t id)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.uint16_tid - the ID of the new MicroBitCompass object. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitStorage storage;
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer, uint16_t address)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitAccelerometer & _accelerometer, uint16_t address, uint16_t id)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitAccelerometer &_accelerometer - an instance of the accelerometer, used for tilt compensation.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.uint16_tid - the ID of the new MicroBitCompass object. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitAccelerometer accelerometer(i2c);
MicroBitCompass compass(i2c, accelerometer, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitStorage & _storage)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitStorage storage;
MicroBitCompass compass(i2c, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitStorage & _storage, uint16_t address)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitStorage storage;
MicroBitCompass compass(i2c, storage);
MicroBitCompass( MicroBitI2C & _i2c, MicroBitStorage & _storage, uint16_t address, uint16_t id)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.MicroBitStorage &_storage - an instance of MicroBitStorage , used to persist calibration data across resets.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.uint16_tid - the ID of the new MicroBitCompass object. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitStorage storage;
MicroBitCompass compass(i2c, storage);
MicroBitCompass( MicroBitI2C & _i2c)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitCompass compass(i2c);
MicroBitCompass( MicroBitI2C & _i2c, uint16_t address)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitCompass compass(i2c);
MicroBitCompass( MicroBitI2C & _i2c, uint16_t address, uint16_t id)#
Description#
Constructor. Create a software representation of an e-compass.
Parameters#
MicroBitI2C &_i2c - an instance of i2c, which the compass is accessible from.uint16_taddress - the default address for the compass register on the i2c bus. Defaults to MAG3110_DEFAULT_ADDR.uint16_tid - the ID of the new MicroBitCompass object. Defaults to MAG3110_DEFAULT_ADDR.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MicroBitCompass compass(i2c);
configure#
int configure()#
Description#
Configures the compass for the sample rate defined in this object. The nearest values are chosen to those defined that are supported by the hardware. The instance variables are then updated to reflect reality.
Returns#
MICROBIT_OK or MICROBIT_I2C_ERROR if the magnetometer could not be configured.
setPeriod#
int setPeriod( int period)#
Description#
Attempts to set the sample rate of the compass to the specified value (in ms).
Parameters#
intperiod - the requested time between samples, in milliseconds.
Returns#
MICROBIT_OK or MICROBIT_I2C_ERROR if the magnetometer could not be updated.
Example#
// sample rate is now 20 ms.
compass.setPeriod(20);
Note
The requested rate may not be possible on the hardware. In this case, the nearest lower rate is chosen.
getPeriod#
int getPeriod()#
Description#
Reads the currently configured sample rate of the compass.
Returns#
The time between samples, in milliseconds.
heading#
int heading()#
Description#
Gets the current heading of the device, relative to magnetic north.
If the compass is not calibrated, it will raise the MICROBIT_COMPASS_EVT_CALIBRATE event.
Users wishing to implement their own calibration algorithms should listen for this event, using MESSAGE_BUS_LISTENER_IMMEDIATE model. This ensures that calibration is complete before the user program continues.
Returns#
the current heading, in degrees. Or MICROBIT_CALIBRATION_IN_PROGRESS if the compass is calibrating.
Example#
compass.heading();
whoAmI#
int whoAmI()#
Description#
Attempts to read the 8 bit ID from the magnetometer, this can be used for validation purposes.
Returns#
the 8 bit ID returned by the magnetometer, or MICROBIT_I2C_ERROR if the request fails.
Example#
compass.whoAmI();
getX#
int getX()#
Description#
Reads the value of the X axis from the latest update retrieved from the magnetometer.
Returns#
The magnetic force measured in the X axis, in nano teslas.
Example#
compass.getX();
int getX( MicroBitCoordinateSystem system)#
Description#
Reads the value of the X axis from the latest update retrieved from the magnetometer.
Parameters#
MicroBitCoordinateSystemsystem - The coordinate system to use. By default, a simple cartesian system is provided.
Returns#
The magnetic force measured in the X axis, in nano teslas.
Example#
compass.getX();
getY#
int getY()#
Description#
Reads the value of the Y axis from the latest update retrieved from the magnetometer.
Returns#
The magnetic force measured in the Y axis, in nano teslas.
Example#
compass.getY();
int getY( MicroBitCoordinateSystem system)#
Description#
Reads the value of the Y axis from the latest update retrieved from the magnetometer.
Parameters#
MicroBitCoordinateSystemsystem - The coordinate system to use. By default, a simple cartesian system is provided.
Returns#
The magnetic force measured in the Y axis, in nano teslas.
Example#
compass.getY();
getZ#
int getZ()#
Description#
Reads the value of the Z axis from the latest update retrieved from the magnetometer.
Returns#
The magnetic force measured in the Z axis, in nano teslas.
Example#
compass.getZ();
int getZ( MicroBitCoordinateSystem system)#
Description#
Reads the value of the Z axis from the latest update retrieved from the magnetometer.
Parameters#
MicroBitCoordinateSystemsystem - The coordinate system to use. By default, a simple cartesian system is provided.
Returns#
The magnetic force measured in the Z axis, in nano teslas.
Example#
compass.getZ();
getFieldStrength#
int getFieldStrength()#
Description#
Determines the overall magnetic field strength based on the latest update from the magnetometer.
Returns#
The magnetic force measured across all axis, in nano teslas.
Example#
compass.getFieldStrength();
readTemperature#
int readTemperature()#
Description#
Reads the current die temperature of the compass.
Returns#
the temperature in degrees celsius, or MICROBIT_I2C_ERROR if the temperature reading could not be retreived from the accelerometer.
calibrate#
int calibrate()#
Description#
Perform a calibration of the compass.
This method will be called automatically if a user attempts to read a compass value when the compass is uncalibrated. It can also be called at any time by the user.
The method will only return once the compass has been calibrated.
Returns#
MICROBIT_OK, MICROBIT_I2C_ERROR if the magnetometer could not be accessed, or MICROBIT_CALIBRATION_REQUIRED if the calibration algorithm failed to complete successfully.
Note
THIS MUST BE CALLED TO GAIN RELIABLE VALUES FROM THE COMPASS
setCalibration#
void setCalibration( CompassSample calibration)#
Description#
Configure the compass to use the calibration data that is supplied to this call.
Calibration data is comprised of the perceived zero offset of each axis of the compass.
After calibration this should now take into account trimming errors in the magnetometer, and any “hard iron” offsets on the device.
calibration
A CompassSample containing the offsets for the x, y and z axis.
Parameters#
CompassSamplecalibration - A CompassSample containing the offsets for the x, y and z axis.
getCalibration#
CompassSample getCalibration()#
Description#
Provides the calibration data currently in use by the compass.
More specifically, the x, y and z zero offsets of the compass.
Returns#
calibration A CompassSample containing the offsets for the x, y and z axis.
updateSample#
int updateSample()#
Description#
Updates the local sample, only if the compass indicates that data is stale.
Note
Can be used to trigger manual updates, if the device is running without a scheduler. Also called internally by all getX,Y,Z member functions.
isCalibrated#
int isCalibrated()#
Description#
Returns 0 or 1. 1 indicates that the compass is calibrated, zero means the compass requires calibration.
isCalibrating#
int isCalibrating()#
Description#
Returns 0 or 1. 1 indicates that the compass is calibrating, zero means the compass is not currently calibrating.
clearCalibration#
void clearCalibration()#
Description#
Clears the calibration held in persistent storage, and sets the calibrated flag to zero.