Release Date: 2011-12-12
This is a library for the Arduino that interfaces with the Pololu LSM303DLH 3D compass and accelerometer carrier and MinIMU-9 L3G4200D and LSM303DLM carrier (it also works with the older MinIMU-9 L3G4200D and LSM303DLH carrier). It makes it simple to read the raw accelerometer and magnetometer data, and it has a function for computing the tilt-compensated heading for those looking to use this sensor as a tilt-compensated compass.
Download the archive from GitHub, decompress it, and drag the “LSM303” folder to your arduino-00xx/libraries directory. Then restart the Arduino environment, so the libraries can be updated to include the LSM303 library and its examples.
The board for the LSM303 can be purchased on Pololu’s website.
Make the following connections with wires between the Arduino and the LSM303:
Arduino Uno/Duemilanove LSM303 Carrier 5V -> VIN GND -> GND Analog Pin 5 -> SCL Analog Pin 4 -> SDA
Arduino Mega LSM303 Carrier 5V -> VIN GND -> GND Analog Pin 21 -> SCL Analog Pin 20 -> SDA
Open an example code sketch by selecting File→Examples→LSM303→example_name
This program continuously reads the accelerometer and magnetometer, communicating the readings over the serial interface. You can display the readings with the Arduino Serial Monitor.
A X: -151 Y: 848 Z: -509 M X: 281 Y: -442 Z: 87 A X: -147 Y: 847 Z: -509 M X: 266 Y: -446 Z: 78 A X: -147 Y: 849 Z: -508 M X: 280 Y: -450 Z: 81
This program is similar to the Serial example, but instead of printing the most recent readings, it prints a running minimum and maximum of the readings from each magnetometer axis. These values can be used to calibrate the
heading() functions and the Heading example after moving the LSM303 through every possible orientation.
This program uses readings from the accelerometer and magnetometer to calculate a tilt-compensated compass heading (in degrees relative to the negative Y axis), which is communicated serially and can be displayed with the Arduino Serial Monitor. For the most accurate results, you should replace the values of
m_max assigned in the
setup() function with your own values obtained from the Calibrate example.
- The last values read from the accelerometer.
- The last values read from the magnetometer.
- Lower bounds (minimum values) for the magnetometer readings on each axis; set this appropriately to calibrate
- Upper bounds (maximum values) for the magnetometer readings on each axis; set this appropriately to calibrate
- Constructor; initializes
m_maxwith placeholder values.
void init(byte device, byte sa0_a)
- Initializes the library with the device being used (LSM303DLH or LSM303DLM) and the state of the SA0_A (accelerometer slave address least significant bit) pin. Constants for these arguments are defined in LSM303.h. Both of these arguments are optional; if they are not specified, the library will try to automatically detect the device and accelerometer address. However, the automatic detection might fail if you do not use the Pololu boards’ default accelerometer address, so you should specify your particular device if you change the state of the SA0_A pin.
- Turns on the accelerometer and magnetometer in the default configuration. (This function was previously called
void writeAccReg(byte reg, byte value)
- Writes an accelerometer register with the given value. Register address constants are defined in LSM303.h.
byte readAccReg(byte reg)
- Reads an accelerometer register and returns the value read.
void writeMagReg(byte reg, byte value)
- Writes a magnetometer register with the given value.
byte readMagReg(int reg)
- Reads a magnetometer register and returns the value read. If the magnetometer Y and Z registers are read using register address constants beginning with
LSM303_, this function will automatically use the correct register addresses depending on the device type.
- Takes a reading from the accelerometer and stores the values in the vector
- Takes a reading from the magnetometer and stores the values in the vector
- Takes a reading from both the accelerometer and magnetometer and stores the values in the vectors
- Returns the tilt-compensated heading in degrees headed away from the negative Y axis.
int heading(vector from)
- Returns the tilt-compensated heading in degrees headed away from the from vector.
This library is very similar to our earlier LSM303DLH library, which is not compatible with the LSM303DLM. Besides the name change, the main difference in this library is that you need to call the
init() function before using any of the other library functions, typically from within the Arduino
setup() function. While the older library only works with the Pololu boards’ default accelerometer slave address of 0011000b, this library allows you to specify the slave address with the
- 1.3.0 (2011-12-12): Arduino 1.0 compatibility.
- 1.2.0 (2011-11-15): Original release. (numbered to avoid confusion with our earlier LSM303DLH library)