3.d. Inertial sensors (accelerometer, magnetometer, and gyro)

Overview

The Zumo Shield includes on-board inertial sensors that can be used in advanced applications, such as helping your Zumo detect collisions and determine its own orientation.

All versions of the Zumo Shield have a compass module that combines a 3-axis accelerometer and 3-axis magnetometer into a single package with an I²C interface. This chip is an LSM303D on the v1.2 shield or an LSM303DLHC on the original Zumo Shield.

The v1.2 version of the Zumo Shield also adds an L3GD20H 3-axis gyroscope on the same I²C bus.

We recommend carefully reading the LSM303D datasheet (1MB pdf), L3GD20H datasheet (3MB pdf), and/or LSM303DLHC datasheet (629k pdf) to understand how these sensors work and how to use them.

Using the sensors

Level shifters built into the shield allow the inertial sensors, which operate at 3.3 V, to be connected to the 5 V logic level pins of the Arduino. The sensors, level shifters, and I²C pull-up resistors are connected to the SCL and SDA pins on the Zumo Shield by default, but they can be disconnected by cutting traces to allow those pins to be used for other purposes. It is necessary to make some additional connections on the shield if you want to use the compass with an older Arduino without separate SCL and SDA pins; please see Section 3.c for more details about the compass connections.

We have written a basic LSM303 Arduino library and L3G Arduino library that makes it easier to interface the sensors with an Arduino, as well as an example project that demonstrates how to use the magnetometer to help the Zumo coordinate its turns.

In addition, the combination of accelerometer, magnetometer, and gyro on the v1.2 version of the Zumo Shield is enough to implement an inertial measurement unit (IMU); the sensor ICs are the same as those on our MinIMU-9 v3, so Arduino software written for the MinIMU-9 (such as our AHRS example) can also be adapted to work on an Arduino-controlled Zumo robot with a v1.2 shield.

Notes on the magnetometer

Please note that the magnetometer in the LSM303 is affected by currents in the motors and buzzer when they are operating, as well as metal in the batteries, and the readings are easily influenced by magnetic distortions in the environment around the Zumo (such as rebar in a concrete floor). As a result, it is very hard to accurately determine the Zumo’s absolute heading based on the magnetometer data. However, in our tests, we found that the magnetometer was still useful for detecting relative orientation changes; for example, once the magnetic readings are compensated for a particular environment, they can be used to help the Zumo turn left or right by a specific angle instead of just timing how long to run the motors to make such a turn.

In our tests, we found that the batteries, motors, and motor current affect the z axis of the magnetometer much more strongly than the x and y axes, so you probably will want to ignore the z readings. We were generally able to get decent results using only the x and y magnetometer readings to determine heading. Additionally, you might need to decrease the magnetometer sensitivity; if the magnetometer returns a value of -4096, that is a sign that the sensitivity range is set too narrow for your particular environment.