Cmps 12
Cmps 12
Introduction
The CMPS12 is our 4th generation tilt compensated compass. Employing a 3-axis magnetometer, a 3-
axis gyro and a 3-axis accelerometer. At the core of the module is the superb BNO055 running
algorithms to remove the errors caused by tilting of the PCB.
Power supply requirements are flexible, you can feed between 3.3 - 5v and the module draws a nominal
18mA of current. A choice of serial or I2C interfaces can be used for communication.
Overview of outputs
Heading, 16 bit – 2 outputs, one calculated by Bosch and one by us
Heading, 8 bit – 0-255 scaled for simpler requirements
Pitch – +/- 0-90° or +/- 0-180°
Roll – +/- 0-90°
Temperature – current temperature of the BNO055 in °c
Raw sensor outputs – 3 x 16 bit integers for each of the Magnetometer, accelerometer and gyro
Mode selection
Serial or I2C mode is easily selected with the state of the mode pin. Note the CMPS12 looks at the
mode selection pin at power-up only.
3.3v-5v
SDA/TX
SCL/RX
Mode
Factory use
0v ground
For I2C the mode pin can be left open or pulled to the supply voltage, for serial mode the mode pin
should be connected to 0v ground.
I2C Mode
The compass has a 31 byte array of registers:
Register Function
0x00 Command register (write) / Software version (read)
0x01 Compass Bearing 8 bit, i.e. 0-255 for a full circle
Compass Bearing 16 bit, i.e. 0-3599, representing 0-359.9 degrees. register 2 being the
0x02, 0x03
high byte. This is calculated by the processor from quaternion outputs of the BNO055
0x04 Pitch angle - signed byte giving angle in degrees from the horizontal plane (+/- 90°)
0x05 Roll angle - signed byte giving angle in degrees from the horizontal plane (+/- 90°)
0x06, 0x07 Magnetometer X axis raw output, 16 bit signed integer (register 0x06 high byte)
0x08,0x09 Magnetometer Y axis raw output, 16 bit signed integer (register 0x08 high byte)
0x0A,0x0B Magnetometer Z axis raw output, 16 bit signed integer (register 0x0A high byte)
0x0C, 0x0D Accelerometer X axis raw output, 16 bit signed integer (register 0x0C high byte)
0x0E, 0x0F Accelerometer Y axis raw output, 16 bit signed integer (register 0x0E high byte)
0x10, 0x11 Accelerometer Z axis raw output, 16 bit signed integer (register 0x10 high byte)
0x12, 0x13 Gyro X axis raw output, 16 bit signed integer (register 0x12 high byte)
0x14, 0x15 Gyro Y axis raw output, 16 bit signed integer (register 0x14 high byte)
0x16, 0x17 Gyro Z axis raw output, 16 bit signed integer (register 0x16 high byte)
0x18,0x19 Temperature of the BNO055 in degrees centigrade (register 0x18 high byte)
Compass Bearing 16 bit This is the angle Bosch generate in the BNO055 (0-5759),
0x1A, 0x1B
divide by 16 for degrees
Pitch angle 16 bit - signed byte giving angle in degrees from the horizontal plane (+/-
0x1C, 0x1D
180°)
Calibration state, bits 0 and 1 reflect the calibration status (0 un-calibrated, 3 fully
0x1E
calibrated)
Register 0x00 is a dual action register, in the event of a read the CMPS12 will reply with the software
version, for a write it acts as the command register and is used to initiate storage/deletion of the
calibration profile of the compass. There is also commands to change the I2C address that are sent here.
Register 0x01 is the bearing converted to a 0-255 value, this may be easier for some applications than
0-3599 which requires two bytes.
For those who require a bearing with better resolution registers 0x02 and 0x03 (high byte first) form a
16 bit unsigned integer in the range 0-3599. This represents 0-359.9°.
Registers 0x04 and 0x05 are the pitch and roll angles, giving an angle of 0 when the board is flat and
up to +/- 90° at maximum tilt in either direction.
There is then an array of registers (0x06-0x17) providing all the raw sensor data from the magnetic and
acceleration sensors.
Registers 0x18 (high byte) and 0x19 (low byte) form a 16 bit temperature that the BNO055 is currently
measuring, this is provided in °C.
Bosch generate a compass bearing within the BNO055, so this is available in registers 0x1A (high byte)
and 0x1B (low byte) and together they form a 16 bit unsigned integer in the range 0-5759, this number
can be scaled to degrees by dividing by 16.
Registers 0x1C (high byte) and 0x1D (low byte) form a 16 bit pitch angle for +/- 180 from the
horizontal plane.
Finally we have register 0x1E, this provides feedback on the degree of the calibration that the
automatic calibration routines have achieved.
The level to which the CMPS12 has been calibrated can be checked by reading register 0x1E, the gyro,
accelerometer and magnetometer are allocated 2 bits each in the register. A value of 0 in the two bits
reflects an uncalibrated state, when fully calibrated this will become 3 (both bits set). There is also a
complete system calibration level.
Address
flashes
Decimal Hex
192 C0 1
194 C2 2
196 C4 3
198 C6 4
200 C8 5
202 CA 6
204 CC 7
206 CE 8
Take care not to set more than one device to the same address, there will be a bus collision and very
unpredictable results.
Serial mode
Communication settings
The Serial mode operates over a link with a default baud rate of 9600 bps (no parity, 1 stop bit) and
3.3v-5v signal levels. This is not RS232. Do not connect RS232 to the module, the high RS232
voltages will irreversibly damage the module.
Bytes
Command Name Returned data description
returned
0x11 GET VERSION 1 Software version
0x12 GET BEARING 8 BIT 1 Bearing as a single byte 0-255
0x13 GET BEARING 16 BIT 2 Bearing (16 bit), high byte first 0-3599
0x14 GET PITCH 1 Pitch angle +/- 0-90°
0x15 GET ROLL 1 Roll angle +/- 0-90°
Raw magnetic data, 16 bit signed: X high, X
0x19 GET MAG RAW 6
low, Y high, Y low, Z high, Z low
Raw accelerometer data, 16 bit signed: X
0x20 GET ACCEL RAW 6
high, X low, Y high, Y low, Z high, Z low
Raw gyro data, 16 bit signed: X high, X low,
0x21 GET GYRO RAW 6
Y high, Y low, Z high, Z low
BNO055 reported temperature as two bytes,
0x22 GET TEMP 2
high byte first and scaled in °C
Angle high, angle low (0-3599), pitch (+/- 0-
0x23 GET ALL 4
90), roll (+/- 0-90)
Bits 0 and 1 reflect the calibration status (0
0x24 GET CALIBRATION STATE 1
un-calibrated, 3 fully calibrated)
GET BOSCH BEARING 16 Bearing (16 bit), high byte first (0-5759),
0x25 2
BIT divide by 16 for degrees
Pitch angle (16 bit) high bytes first +/- 0-
0x26 GET PITCH 180 2
180°
STORE CALIBRATION BYTE
0xF0 1 Returns ok (0x55)
1
STORE CALIBRATION BYTE
0xF5 1 Returns ok (0x55)
2
STORE CALIBRATION BYTE
0xF6 1 Returns ok (0x55)
3
DELETE CALIBRATION
0xE0 1 Returns ok (0x55)
BYTE 1
DELETE CALIBRATION
0xE5 1 Returns ok (0x55)
BYTE 2
DELETE CALIBRATION
0xE2 1 Returns ok (0x55)
BYTE 3
0xA0 BAUD 19200 1 Returns ok (0x55)
0xA1 BAUD 38400 1 Returns ok (0x55)
Calibration of the CMPS12
The CMPS12 is automatically calibrated, the user is just required to perform simple movements to
allow the CMPS12 to complete this.
The level to which the CMPS12 has been calibrated can be checked by using command 0x24, the gyro,
accelerometer and magnetometer are allocated 2 bits each in the register. A value of 0 in the two bits
reflects an uncalibrated state, when fully calibrated this will become 3 (both bits set). There is also a
complete system calibration level.
Every effort has been made to try and make the CMPS12 as compatible with its CMPS11 predecessor.
Electronically it has been designed to drop in with pin compatibility. In I2C mode all data is in the
same locations as it was found on the CMPS11 with some extra features in new registers, in serial
mode the original command set is implemented and added to for some extra features. There are
however a few differences:
Temperature is returned in °C
Pitch and roll values from the sensor are automatically filtered, so there is no longer pitch and roll with
no Kalman filter values. This affects registers 0x1A and 0x1B in I2C and commands 0x16 and 0x17 in
serial mode.
Calibration is fundamentally different, the CMPS12 is continually auto calibrating, there is commands
to save the current calibration profile so it can be automatically restored if power is lost. There is also a
command sequence to delete the profile if required.