- Connect board VCC (red wire) to Arduino 5V if you are running a 5V board Arduino (Uno, etc.). If your board is 3V, connect to that instead.
- Connect board GND (black wire) to Arduino GND
- Connect board SCL (yellow wire) to Arduino SCL
- Connect board SDA (blue wire) to Arduino SDA
Install the Libraries
To get started with the LSM303, you'll need to install the accelerometer library and the magnetometer library for your board. Additionally you will need the Adafruit_Sensor library that allows it to return data in a consistent way with other similar sensors, as well as the Adafruit_BusIO library. All of the libraries can be installed using the Library Manager in the Arduino IDE:
Make sure you know which version of the sensor you have before continuing
Install the Accelerometer Library
Click the Manage Libraries ... menu item, search for Adafruit LSM303 Accel, and select the Adafruit_LSM303_Accel library:
Install the Magnetometer Library
Next you'll need to install the library for the magnetometer in the LSM303. Make sure to download the correct driver for your breakout board.
LSM303AGR
Search the library manager for the Adafruit_LIS2MDL library:
LSM303/LSM303DLHC
Search the library manager for the Adafruit_LSM303DLH_Mag library:
Follow the same process for the Adafruit BusIO library:
Finally do the same for the Adafruit Unified Sensor library:
Accelerometer Demo
This first demo will show you how to get readings of what an accelerometer does best: measure acceleration!
Open up File -> Examples -> Adafruit LSM303 Accel-> accelsensor and upload to your Arduino wired up to the sensor.
Upload the sketch to your board and open up the Serial Monitor (Tools -> Serial Monitor) at 115200 baud. You should see the the values for the current configuration settings printed on startup, followed by acceleration readings for the X, Y, and Z axes similar to this:
The Adafruit_LSM303_Accel_Unified sensor class in the Adafruit_LSM303_Accel library reports X, Y and Z axis accelerometer readings directly in meters per second squared. The accelsensor example code in the library reads from the sensor and prints the acceleration readings to the Serial Monitor.
At rest, the sensor should report no acceleration except that due to gravity (about 9.8 meters/second squared). By calculating the angle of the gravity vector with respect to the X, Y and Z axis, the device can be used as an inclinometer.
Basic Magnetometer Readings
This first demo will show you how to get readings of what an accelerometer does best: measure acceleration!
LSM303AGR
Open up File -> Examples -> Adafruit LIS2MDL-> magsensor and upload to your Arduino wired up to the sensor.
LSM303/LSM303DLH
Open up File -> Examples -> Adafruit LSM303DLH Mag-> magsensor and upload to your Arduino wired up to the sensor.
Upload the sketch to your board and open up the Serial Monitor (Tools -> Serial Monitor) at 115200 baud. You should see the the values for the current configuration settings printed on startup, followed by magnetic field readings for the X, Y, and Z axes similar to this:
The sensor class in the magnetometer library reports X, Y and Z axis magnetometer readings directly in micro-Teslas. The magsensor example code reads from the sensor and prints the micro-Tesla readings to the Serial Monitor.
In the absence of any strong local magnetic fields, the sensor readings should reflect the magnetic field of the earth (between 20 and 60 micro-Teslas). When the sensor is held level, by calculating the angle of the magnetic filed with respect to the X and Y axis, the device can be used as a compass.
Computing a Compass Heading
To convert the microTesla readings into a 0-360 degree compass heading, we can use the atan2() function to compute the angle of the vector defined by the Y and X axis readings. The result will be in radians, so we multiply by 180 degrees and divide by Pi to convert that to degrees.
LSM303AGR
Open up File -> Examples -> Adafruit LIS2MDL-> compass and upload to your Arduino wired up to the sensor.
LSM303/LSM303DLH
Open up File -> Examples -> Adafruit LSM303DLH Mag-> compass and upload to your Arduino wired up to the sensor.
Upload the sketch to your board and open up the Serial Monitor (Tools -> Serial Monitor) at 115200 baud. You will see heading calculations printed out to the serial monitor. If you rotate the sensor as it runs you can see the heading change:
#include <Adafruit_LSM303_Accel.h> #include <Adafruit_Sensor.h> #include <Wire.h> /* Assign a unique ID to this sensor at the same time */ Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321); void displaySensorDetails(void) { sensor_t sensor; accel.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print("Sensor: "); Serial.println(sensor.name); Serial.print("Driver Ver: "); Serial.println(sensor.version); Serial.print("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print("Max Value: "); Serial.print(sensor.max_value); Serial.println(" m/s^2"); Serial.print("Min Value: "); Serial.print(sensor.min_value); Serial.println(" m/s^2"); Serial.print("Resolution: "); Serial.print(sensor.resolution); Serial.println(" m/s^2"); Serial.println("------------------------------------"); Serial.println(""); delay(500); } void setup(void) { #ifndef ESP8266 while (!Serial) ; // will pause Zero, Leonardo, etc until serial console opens #endif Serial.begin(9600); Serial.println("Accelerometer Test"); Serial.println(""); /* Initialise the sensor */ if (!accel.begin()) { /* There was a problem detecting the ADXL345 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while (1) ; } /* Display some basic information on this sensor */ displaySensorDetails(); accel.setRange(LSM303_RANGE_4G); Serial.print("Range set to: "); lsm303_accel_range_t new_range = accel.getRange(); switch (new_range) { case LSM303_RANGE_2G: Serial.println("+- 2G"); break; case LSM303_RANGE_4G: Serial.println("+- 4G"); break; case LSM303_RANGE_8G: Serial.println("+- 8G"); break; case LSM303_RANGE_16G: Serial.println("+- 16G"); break; } accel.setMode(LSM303_MODE_NORMAL); Serial.print("Mode set to: "); lsm303_accel_mode_t new_mode = accel.getMode(); switch (new_mode) { case LSM303_MODE_NORMAL: Serial.println("Normal"); break; case LSM303_MODE_LOW_POWER: Serial.println("Low Power"); break; case LSM303_MODE_HIGH_RESOLUTION: Serial.println("High Resolution"); break; } } void loop(void) { /* Get a new sensor event */ sensors_event_t event; accel.getEvent(&event); /* Display the results (acceleration is measured in m/s^2) */ Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" "); Serial.println("m/s^2"); /* Delay before the next sample */ delay(500); }
#include <Adafruit_LIS2MDL.h> #include <Adafruit_Sensor.h> #include <Wire.h> /* Assign a unique ID to this sensor at the same time */ Adafruit_LIS2MDL lis2mdl = Adafruit_LIS2MDL(12345); #define LIS2MDL_CLK 13 #define LIS2MDL_MISO 12 #define LIS2MDL_MOSI 11 #define LIS2MDL_CS 10 void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("LIS2MDL Magnetometer Test"); Serial.println(""); /* Enable auto-gain */ lis2mdl.enableAutoRange(true); /* Initialise the sensor */ if (!lis2mdl.begin()) { // I2C mode //if (! lis2mdl.begin_SPI(LIS2MDL_CS)) { // hardware SPI mode //if (! lis2mdl.begin_SPI(LIS2MDL_CS, LIS2MDL_CLK, LIS2MDL_MISO, LIS2MDL_MOSI)) { // soft SPI /* There was a problem detecting the LIS2MDL ... check your connections */ Serial.println("Ooops, no LIS2MDL detected ... Check your wiring!"); while (1) delay(10); } /* Display some basic information on this sensor */ lis2mdl.printSensorDetails(); } void loop(void) { /* Get a new sensor event */ sensors_event_t event; lis2mdl.getEvent(&event); /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" "); Serial.println("uT"); /* Note: You can also get the raw (non unified values) for */ /* the last data sample as follows. The .getEvent call populates */ /* the raw values used below. */ // Serial.print("X Raw: "); Serial.print(lis2mdl.raw.x); Serial.print(" "); // Serial.print("Y Raw: "); Serial.print(lis2mdl.raw.y); Serial.print(" "); // Serial.print("Z Raw: "); Serial.print(lis2mdl.raw.z); Serial.println(""); /* Delay before the next sample */ delay(100); }
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_LIS2MDL.h> Adafruit_LIS2MDL mag = Adafruit_LIS2MDL(12345); void setup(void) { Serial.begin(115200); Serial.println("Magnetometer Test"); Serial.println(""); /* Initialise the sensor */ if(!mag.begin()) { /* There was a problem detecting the LIS2MDL ... check your connections */ Serial.println("Ooops, no LIS2MDL detected ... Check your wiring!"); while(1); } } void loop(void) { /* Get a new sensor event */ sensors_event_t event; mag.getEvent(&event); float Pi = 3.14159; // Calculate the angle of the vector y,x float heading = (atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi; // Normalize to 0-360 if (heading < 0) { heading = 360 + heading; } Serial.print("Compass Heading: "); Serial.println(heading); delay(500); }
#include <Adafruit_LSM303DLH_Mag.h> #include <Adafruit_Sensor.h> #include <Wire.h> /* Assign a unique ID to this sensor at the same time */ Adafruit_LSM303DLH_Mag_Unified mag = Adafruit_LSM303DLH_Mag_Unified(12345); void displaySensorDetails(void) { sensor_t sensor; mag.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print("Sensor: "); Serial.println(sensor.name); Serial.print("Driver Ver: "); Serial.println(sensor.version); Serial.print("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT"); Serial.print("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT"); Serial.print("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT"); Serial.println("------------------------------------"); Serial.println(""); delay(500); } void setup(void) { #ifndef ESP8266 while (!Serial) ; // will pause Zero, Leonardo, etc until serial console opens #endif Serial.begin(115200); Serial.println("Magnetometer Test"); Serial.println(""); /* Enable auto-gain */ mag.enableAutoRange(true); /* Initialise the sensor */ if (!mag.begin()) { /* There was a problem detecting the LSM303 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while (1) ; } /* Display some basic information on this sensor */ displaySensorDetails(); } void loop(void) { /* Get a new sensor event */ sensors_event_t event; mag.getEvent(&event); /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" "); Serial.println("uT"); /* Delay before the next sample */ delay(500); }
#include <Adafruit_LSM303DLH_Mag.h> #include <Adafruit_Sensor.h> #include <Wire.h> Adafruit_LSM303DLH_Mag_Unified mag = Adafruit_LSM303DLH_Mag_Unified(12345); void setup(void) { Serial.begin(115200); Serial.println("Magnetometer Test"); Serial.println(""); /* Initialise the sensor */ if (!mag.begin()) { /* There was a problem detecting the LSM303 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while (1) ; } } void loop(void) { /* Get a new sensor event */ sensors_event_t event; mag.getEvent(&event); float Pi = 3.14159; // Calculate the angle of the vector y,x float heading = (atan2(event.magnetic.y, event.magnetic.x) * 180) / Pi; // Normalize to 0-360 if (heading < 0) { heading = 360 + heading; } Serial.print("Compass Heading: "); Serial.println(heading); delay(500); }
The Adafruit_LSM303DLHC Library for the older LSM303DLH breakout has been archived and replaced by Adafruit_LSM303_Accel and Adafruit_LSM303DLH_Mag libraries which are used above. We recommend switching to the newer libraries as the old one will not be supported or have features added.
If you still wish to use the old library, you can click the buttons below to go to the repository or download it as a ZIP