CMPS09 - Tilt Compensated Compass Module
I2C mode
Connections
![]() |
![]() |
To enter the I2C mode of operation leave the mode pin unconnected
I2C Communication
I2C communication protocol with the compass module is the same as popular
eeprom's such as the 24C04. First send a start bit, the module address with the
read/write bit low, then the register number you wish to read. This is followed
by a repeated start and the module address again with the read/write bit high. You now read one or two bytes for 8bit or 16bit registers respectively.
16bit registers are read high byte first. The compass has a 23 byte array of
registers. organized as below:
| Register | Function |
| 0 | Software version |
| 1 | Compass Bearing as a byte, i.e. 0-255 for a full circle |
| 2,3 | Compass Bearing as a word, i.e. 0-3599 for a full circle, representing 0-359.9 degrees. |
| 4 | Pitch angle - signed byte giving angle in degrees from the horizontal plane |
| 5 | Roll angle - signed byte giving angle in degrees from the horizontal plane |
| 6 | Unused |
| 7 | Unused |
| 8 | Unused |
| 9 | Unused |
| 10,11 | Magnetometer X axis raw output, 16 bit signed integer with register 10 being the upper 8 bits |
| 12,13 | Magnetometer Y axis raw output, 16 bit signed integer with register 12 being the upper 8 bits |
| 14,15 | Magnetometer Z axis raw output, 16 bit signed integer with register 14 being the upper 8 bits |
| 16,17 | Accelerometer X axis raw output, 16 bit signed integer with register 16 being the upper 8 bits |
| 18,19 | Accelerometer Y axis raw output, 16 bit signed integer with register 18 being the upper 8 bits |
| 20,21 | Accelerometer Z axis raw output, 16 bit signed integer with register 20 being the upper 8 bits |
| 22 | Command register |
Register 1 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 better resolution registers 2 and 3 (high byte first) form a 16 bit unsigned integer in the range 0-3599. This represents 0-359.9°. Register 4 is the pitch angle, giving an angle of 0 when the board is flat and up to +/- 85° at maximum tilt in either direction. Register 5 works the same way but with results for the Roll angle. There is then an array of registers (10-21) providing all the raw sensor data from the magnetic and acceleration sensors. Finally Register 22 is the command register and is used to calibrate the compass, change address and if necessary restore the factory default calibration.
Calibration the CMPS09
I would recommend evaluating the CMPS09 performance first
before implementing this function. Its purpose is to remove offsets caused by
constant magnetic sources around the CMPS09. First of all you need to determine North
and align the CMPS09 with it, then enter the calibration mode by writing
0xF0 to the command register (22). To calibrate
the first point write 0xF5 to the command register, this should also light the
LED, then move the object through 90° and write 0xF5 to the command register.
Repeat this twice more so four points are calibrated and the LED should also turn
off to confirm calibration completion.
Should you need to revert to the factory calibration then write the following to
the command register with 100ms between bytes 0x20,0x2A,0x60. These commands must be sent in the correct sequence to
restore the calibration, additionally, No other command may be issued in the middle of the
sequence. The sequence must be sent to the command register at location 22,
which means 4 separate write transactions on the I2C bus. Please make sure that the CMPS09 is not located near to ferrous objects as this
will distort the magnetic field and induce errors in the reading.
Changing the I2C Bus Address
To change the I2C address of the CMPS09 you must have only one module on the bus.
Write the 3 sequence commands in the correct order followed by the address with
100ms between writes.
Example; to change the address of a compass currently at 0xC0 (the default
shipped address) to 0xC2, write the following to address 0xC0; (0xA0, 0xAA,
0xA5, 0xC2 ) with a 100ms delay after each of the first three bytes. These commands must be sent in the correct sequence to change the
I2C address, additionally, No other command may be issued in the middle of the
sequence. The sequence must be sent to the command register at location 22,
which means 4 separate write transactions on the I2C bus. When done, you should
label the CMPS09 with its address, however if you do forget, just power it up
without sending any commands. The CMPS09 will flash its address out on the LED.
One long flash followed by a number of shorter flashes indicating its address.
The flashing is terminated immediately on sending a command the CMPS09.
| Address | Long Flash | Short flashes | |
| Decimal | Hex | ||
| 192 | C0 | 1 | 0 |
| 194 | C2 | 1 | 1 |
| 196 | C4 | 1 | 2 |
| 198 | C6 | 1 | 3 |
| 200 | C8 | 1 | 4 |
| 202 | CA | 1 | 5 |
| 204 | CC | 1 | 6 |
| 206 | CE | 1 | 7 |
Take care not to set more than one device to the same address, there will be a bus collision and very unpredictable results.
If you need more information on the I2C bus, have a look at our I2C tutorial.