lsm303 accelerometer + compass breakout · overview the lsm303 breakout board combines a...

26
LSM303 Accelerometer + Compass Breakout Created by Bill Earl Last updated on 2018-03-03 12:41:23 AM UTC

Upload: truongthu

Post on 14-Apr-2018

244 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

LSM303 Accelerometer + Compass BreakoutCreated by Bill Earl

Last updated on 2018-03-03 12:41:23 AM UTC

Page 2: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

233344

555666

88889

101113131314

16181819202121

23252525

Guide Contents

Guide ContentsOverview

How it Works:MEMS - Micro Electro-Mechanical SystemsAcceleration MeasurementMagnetic Field Measurement

Assembly and WiringBoard Assembly:Position the headerPosition the boardAnd Solder!Connect to the Arduino:

Arduino CodeDownload the LibraryBasic Accelerometer ReadingsBasic Magnetometer ReadingsComputing a Compass Heading

CircuitPython CodeUsageCalibration

Ultimate Calibration:Simplified Calibration:Calibration Sketch:

Making Tracks!Materials:Calibrate your servo:Mount the servoMount the Uno and wire it upAdd a pointerAdd Zaxen!

Code:Downloads and LinksFilesSchematic & Fabrication Print

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 2 of 26

Page 3: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Overview

The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make acompact navigation subsystem. The I2C interface is compatible with both 3.3v and 5v processors and the two pins canbe shared by other I2C devices. Combined with a 3-axis gyro such as the L3GD20, you have all the sensors you needfor a complete IMU (Inertial Measurement Unit) for use in aerial, terrestrial or marine navigation.

In this tutorial we will show you how to connect the LSM303 to an Arduino and use it to measure orientation relative tothe earth's magnetic field, and acceleration in three axis.

How it Works:

MEMS - Micro Electro-Mechanical SystemsThe sensor consists of micro-machined structures on a silicon wafer. There are structures designed to measureacceleration and magnetic fields in the X, Y and Z axis.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 3 of 26

Page 4: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Acceleration MeasurementThese structures are suspended by polysilicon springs which allow them to deflect when subject to acceleration in theX, Y and/or Z axis. Deflection causes a change in capacitance between fixed plates and plates attached to thesuspended structure. This change in capacitance on each axis is converted to an output voltage proportional to theacceleration on that axis.

Magnetic Field MeasurementThese structures are similar to the accelerometer structures, but are etched with microscopic coils. An excitationcurrent is passed through the coils, and the Lorentz Force due to the magnetic field causes the structure to deflect.Once again the deflection is converted to an output voltage proportional to the strength of the magnetic field in thataxis.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 4 of 26

Page 5: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Assembly and Wiring

Board Assembly:All surface mount components are pre-soldered to the board. You can solder connections directly to the board, or youcan install the header strip (provided) to simplify use in a breadboard.

Position the headerCut the header to length if necessary and insert - long

pins down - into a breadboard.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 5 of 26

Page 6: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Position the boardPlace the board on top of the header pins. Prop the

back-side up of necessary to level the board before

soldering.

And Solder!Solder each pin to assure a good electrical connection.

If you are new to soldering, check out our Guide to

Excellent Soldering (https://adafru.it/aTk).

Connect to the Arduino:The LSM303 breakout requires only 4 wires:

GND->GNDVIN->5v (It will also work on 3.3v)SDA->SDA (A4 on 'classic' Arduinos)SCL->SCL (A5 on 'classic' Arduinos)

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 6 of 26

Page 7: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 7 of 26

Page 8: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Arduino Code

Download the LibraryTo get started with the LSM303, first download and install the Adafruit_LSM303DLHC library from Github. Since thisdriver is part of the Adafruit Unified Sensor system, you will also need to download and install the Adafruit_Sensorlibrary.

Basic Accelerometer ReadingsThe Adafruit_LSM303_Accel sensor class in the Adafruit_LSM303 library reports X, Y and Z axis accelerometerreadings directly in meters per second squared. The AccelSensor example code in the library reads from the sensorand 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). Bycalculating the angle of the gravity vector with respect to the X, Y and Z axis, the device can be used as aninclinometer.

Basic Magnetometer ReadingsThe Adafruit_LSM303_Mag sensor class in the Adafruit_LSM303 library reports X, Y and Z axis magnetometerreadings directly in micro-Teslas. The MagSensor example code in the library reads from the sensor and prints themicro-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

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 8 of 26

Page 9: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

respect to the X and Y axis, the device can be used as a compass.

Computing a Compass HeadingTo convert the microTesla readings into a 0-360 degree compass heading, we can use the atan2() function tocompute the angle of the vector defined by the Y and X axis readings. The result will be in radians, so we multiply by180 degrees and divide by Pi to convert that to degrees.

The following sketch will print the compass heading in degrees to to the serial monitor:

#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_LSM303_U.h>

/* Assign a unique ID to this sensor at the same time */Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);

void setup(void) { Serial.begin(9600); 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);}

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 9 of 26

Page 10: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

CircuitPython CodeIt's easy to use the LSM303 sensor with CircuitPython and the Adafruit CircuitPython LSM303 module. This moduleallows you to easily write Python code that reads the accelerometer and magentometer from the sensor.

First wire up a LSM303 to your board exactly as shown on the previous pages for Arduino using an I2C connection. Here's an example of wiring a Feather M0 to the sensor with I2C:

Board 3V to sensor VINBoard GND to sensor GNDBoard SCL to sensor SCLBoard SDA to sensor SDA

Next you'll need to install the Adafruit CircuitPython LSM303 library on your CircuitPython board.

First make sure you are running the latest version of Adafruit CircuitPython for your board.

Next you'll need to install the necessary libraries to use the hardware--carefully follow the steps to find and install theselibraries from Adafruit's CircuitPython library bundle. Our introduction guide has a great page on how to install thelibrary bundle for both express and non-express boards.

Remember for non-express boards like the, you'll need to manually install the necessary libraries from the bundle:

adafruit_lsm303.mpyadafruit_bus_device

You can also download the adafruit_lsm303.mpy from its releases page on Github.

Before continuing make sure your board's lib folder or root filesystem hasthe adafruit_lsm303.mpy, and adafruit_bus_device files and folders copied over.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 10 of 26

Page 11: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Next connect to the board's serial REPL so you are at the CircuitPython >>> prompt.

Usage

To demonstrate the usage of the sensor we'll initialize it and read the accelerometer and compass/magnetometer fromthe board's Python REPL.

Run the following code to import the necessary modules and initialize the I2C connection with the sensor:

Remember if you're using a board that doesn't support hardware I2C (like the ESP8266) you need to usethe bitbangio module instead:

Now you're ready to read values from the sensor using any of these properties:

acceleration - A 3-tuple of X, Y, Z acceleration values in meters per second per second (m/s^2).raw_acceleration - A 3-tuple of X, Y, Z acceleration values in the raw 16-bit unsigned values returned by thesensor. This is handy for doing the most accurate math yourself, but in practice you probably want to use theaccelerometer attribute above instead!magnetic - A 3-tuple of the X, Y, Z magnetometer readings in micro-Teslas.

In addition you can read and write a few properties to adjust the magnetometer:

mag_gain - The gain of the magnetometer, should be a value of:

adafruit_lsm303.MAGGAIN_1_3 - 1.3x (the default)adafruit_lsm303.MAGGAIN_1_9 - 1.9xadafruit_lsm303.MAGGAIN_2_5 - 2.5xadafruit_lsm303.MAGGAIN_4_0 - 4.0xadafruit_lsm303.MAGGAIN_4_7 - 4.7xadafruit_lsm303.MAGGAIN_5_6 - 5.6xadafruit_lsm303.MAGGAIN_8_1 - 8.1x

mag_rate - The rate at which the magnetometer is sampled, should be a value of:

import boardimport busioimport adafruit_lsm303i2c = busio.I2C(board.SCL, board.SDA)sensor = adafruit_lsm303.LSM303(i2c)

import boardimport bitbangioimport adafruit_lsm303i2c = bitbangio.I2C(board.SCL, board.SDA)sensor = adafruit_lsm303.LSM303(i2c)

print('Acceleration (m/s^2): X={0:0.3f} Y={1:0.3f} Z={2:0.3f}'.format(*sensor.acceleration))print('Magnetometer (micro-Teslas): X={0:0.3f} Y={1:0.3f} Z={2:0.3f}'.format(*sensor.magnetic))

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 11 of 26

Page 12: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

adafruit_lsm303.MAGRATE_0_7 - 0.75 hz (the default)adafruit_lsm303.MAGRATE_1_5 - 1.5 hzadafruit_lsm303.MAGRATE_3_0 - 3 hzadafruit_lsm303.MAGRATE_7_5 - 7.5 hzadafruit_lsm303.MAGRATE_15 - 15 hzadafruit_lsm303.MAGRATE_30 - 30 hzadafruit_lsm303.MAGRATE_75 - 75 hzadafruit_lsm303.MAGRATE_220 - 220 hz

That's all there is to using the LSM303 with CircuitPython!

Below is a complete example of reading the sensor and printing its values every second. Save this as main.py on yourboard and open the REPL to see the output. Remember to change to use bitbangio if necessary for your board!

sensor.mag_gain = adafruit_lsm303.MAGGAIN_8_1sensor.mag_rate = adafruit_lsm303.MAGRATE_220

""" Display both accelerometer and magnetometer data once per second """

import timeimport boardimport busioimport adafruit_lsm303

i2c = busio.I2C(board.SCL, board.SDA)sensor = adafruit_lsm303.LSM303(i2c)

while True: acc_x, acc_y, acc_z = sensor.acceleration mag_x, mag_y, mag_z = sensor.magnetic

print('Acceleration (m/s^2): ({0:10.3f}, {1:10.3f}, {2:10.3f})'.format(acc_x, acc_y, acc_z)) print('Magnetometer (gauss): ({0:10.3f}, {1:10.3f}, {2:10.3f})'.format(mag_x, mag_y, mag_z)) print('') time.sleep(1.0)

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 12 of 26

Page 13: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Calibration

(Calibration GUI image by Fabio Varesano)

The LSM303 chips are factory calibrated to a level of accuracy sufficient for many purposes. But for ultra-criticalapplications such as an IMU, you may want to further calibrate the device.

Ultimate Calibration:

For super-precise accelerometer calibration, you will want to check out the FreeIMU Magnetometer and AccelerometerGUI by the late Fabio Varesano. The image above (from Fabio's site) shows a graphical representation of the sensorreadings and the resulting calibration offsets calculated from the raw data.

This comprehensive calibration suite is designed to run on a PC. It is much too large to run on a microcontroller, likethe Arduino, but the resulting calibration offsets it generates can be incorporated into your Arduino sketch for betteraccuracy.

Simplified Calibration:

A simpler method that still generates good results can be accomplished on the Arduino. This method uses a simplesketch to record the minimum and maximum readings on all 3 axis. While running the sketch, slowly rotate the LSM303module multiple times in all three axis. The object is to record the absolute minimums and maximums for each axis, sothe more you rotate it, the more likely you are to capture the absolute peak.

Be sure to rotate the sensor slowly about its center so that the accelerometer readings will represent just accelerationdue to gravity and not linear acceleration of the sensor due to movement. After a while, the sketch output will stabilize.The values displayed will be the the min and max ranges for each axis and can be used to re-scale the output of thesensor.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 13 of 26

Page 14: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Calibration Sketch:

#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_LSM303_U.h>

/* Assign a unique ID to these sensors */Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321);Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);

float AccelMinX, AccelMaxX;float AccelMinY, AccelMaxY;float AccelMinZ, AccelMaxZ;

float MagMinX, MagMaxX;float MagMinY, MagMaxY;float MagMinZ, MagMaxZ;

long lastDisplayTime;

void setup(void) { Serial.begin(9600); Serial.println("LSM303 Calibration"); Serial.println(""); /* Initialise the accelerometer */ if(!accel.begin()) { /* There was a problem detecting the ADXL345 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while(1); } /* Initialise the magnetometer */ if(!mag.begin()) { /* There was a problem detecting the LSM303 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while(1); } lastDisplayTime = millis();}

void loop(void) { /* Get a new sensor event */ sensors_event_t accelEvent; sensors_event_t magEvent; accel.getEvent(&accelEvent); mag.getEvent(&magEvent); if (accelEvent.acceleration.x < AccelMinX) AccelMinX = accelEvent.acceleration.x; if (accelEvent.acceleration.x > AccelMaxX) AccelMaxX = accelEvent.acceleration.x; if (accelEvent.acceleration.y < AccelMinY) AccelMinY = accelEvent.acceleration.y; if (accelEvent.acceleration.y > AccelMaxY) AccelMaxY = accelEvent.acceleration.y;

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 14 of 26

Page 15: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

if (accelEvent.acceleration.z < AccelMinZ) AccelMinZ = accelEvent.acceleration.z; if (accelEvent.acceleration.z > AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;

if (magEvent.magnetic.x < MagMinX) MagMinX = magEvent.magnetic.x; if (magEvent.magnetic.x > MagMaxX) MagMaxX = magEvent.magnetic.x; if (magEvent.magnetic.y < MagMinY) MagMinY = magEvent.magnetic.y; if (magEvent.magnetic.y > MagMaxY) MagMaxY = magEvent.magnetic.y;

if (magEvent.magnetic.z < MagMinZ) MagMinZ = magEvent.magnetic.z; if (magEvent.magnetic.z > MagMaxZ) MagMaxZ = magEvent.magnetic.z;

if ((millis() - lastDisplayTime) > 1000) // display once/second { Serial.print("Accel Minimums: "); Serial.print(AccelMinX); Serial.print(" ");Serial.print(AccelMinY); Serial.print(" "); Serial.print(AccelMinZ); Serial.println(); Serial.print("Accel Maximums: "); Serial.print(AccelMaxX); Serial.print(" ");Serial.print(AccelMaxY); Serial.print(" "); Serial.print(AccelMaxZ); Serial.println(); Serial.print("Mag Minimums: "); Serial.print(MagMinX); Serial.print(" ");Serial.print(MagMinY); Serial.print(" "); Serial.print(MagMinZ); Serial.println(); Serial.print("Mag Maximums: "); Serial.print(MagMaxX); Serial.print(" ");Serial.print(MagMaxY); Serial.print(" "); Serial.print(MagMaxZ); Serial.println(); Serial.println(); lastDisplayTime = millis(); }}

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 15 of 26

Page 16: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Making Tracks!Now let's use the LSM303 module to do some simple navigation!

One day, making tracks

In the prairie of Prax,

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 16 of 26

Page 17: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Came a North-Going Zax

And a South-Going Zax.

This Zax-O-Meter is the perfect navigation instrument for either a North or a South-going Zax. This projectdemonstrates how to use the LSM303 magnetometer output to implement a simple navigation system. No matterwhich way you turn, the pointer will always rotate to the desired direction of travel.

Never budge! That’s my rule.

Never budge in the least!

Not an inch to the west!

Not an inch to the east!

The Zax-O-Meter uses the computed compass heading as feedback to a continuous rotation servo. When thecompass heading is zero degrees (due north), the servo stops rotating. Any deviation from that value causes the servoto rotate in the opposite direction to compensate. This basic principle of negative feedback can be used to build anavigation system for an autonomous robot.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 17 of 26

Page 18: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Materials:To build the Zax-O-Meter, you will need:

Adafruit LSM303 Breakout BoardArduino UnoArduino EnclosureContinuous Rotation ServoJumper WiresCard-stockCardboard or Foam Core

Calibrate your servo:For the Zax-O-Meter to function accurately, you first need to find the 'neutral' point of your continuous rotation servo.That is the servo output value that results in minimum rotation. This value is typically about 90, but varies somewhatbetween servos. Run this sketch and modify the value until you get minimum rotation. That is the value you should usefor ServoNeutral in the Zax-O-Meter sketch.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 18 of 26

Page 19: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Mount the servoMark and widen the opening in the enclosure to fit the

servo. Insert the servo with the rotor toward the center

of the enclosure. Press down until the flanges are flush

with the surface, the servo should snap into place and

be held securely.

#include <Servo.h> Servo servo;

void setup() { servo.attach(9); // attaches the servo on pin 9 to the servo object servo.write(90); // change this value to achieve minimum rotation!} void loop() { }

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 19 of 26

Page 20: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Mount the Uno and wire it upMount the Uno in the enclosure with the supplied

screws. Wire the servo and sensor as follows:

Servo:

Black -> Gnd

Red -> 5v

White -> Digital Pin 9

LSM303:

Gnd -> Gnd

Vin -> 3.3v

SDA -> Analog 4

SCL -> Analog 5

Then route the sensor wire through the opening next to

the servo and close up the enclosure.

Add a pointerCut a pointer from some stiff cardboard or foam-core

and attach it to the servo horn with some double-sided

foam tape.

Attach the sensor to the underside of the arrow with

some more double-sided foam tape. Locate the sensor

as far away from the servo body as possible to avoid

magnetic interference from the motor.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 20 of 26

Page 21: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Add Zaxen!Find an image of your favorite Zax (https://adafru.it/AI5).

Use Paint or other image editing tool to make a mirror

image pair.

Print the image on some heavy card-stock and fold it

over to make a double-sided image.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 21 of 26

Page 22: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Cut it out and mount to the top of your indicator arrow

with some double-sided tape.

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 22 of 26

Page 23: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Code:Load the code below. Don't forget to change "ServoNeutral" to the neutral value from the Servo Calibration step.

The example code is for a North-going Zax and uses a targetHeading of 0. If you are a Zax of the South-goingpersuasion, a targetHeading of 180 will keep you in your South-going groove. For those with a rebellious streak,choose any targetHeading setting from 0 - 360 degrees and start making tracks in the heading of your choice!

// **********************************************// Zax-O-Meter Sketch // for the Adafruit LSM303 Magnetometer Breakout//// Written by Bill Earl for Adafruit Industries//// **********************************************

#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_LSM303_U.h>#include <Servo.h>

/* Assign a unique ID to this sensor at the same time */Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);

// This is our continuous rotation servoServo servo;

// Pi for calculations - not the raspberry typeconst float Pi = 3.14159;

// This is the value that gives you minimal rotation on// a continuous rotation servo. It is usually about 90.// adjust this value to give minimal rotation for your servoconst float ServoNeutral = 97;

// This is the desired direction of travel// expressed as a 0-360 degree compass heading// 0.0 = North// 90.0 = East// 180.0 = South// 270 = Westconst float targetHeading = 0.0;

void setup(void) { Serial.begin(9600); Serial.println("Magnetometer Test"); Serial.println(""); /* Initialise the sensor */ if(!mag.begin()) {

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 23 of 26

Page 24: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

/* There was a problem detecting the LSM303 ... check your connections */ Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); while(1); } servo.attach(9); // Attach servo to pin 9}

void loop(void) { /* Get a new sensor event */ sensors_event_t event; mag.getEvent(&event); // 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; } // Calculate the error between tha measured heading and the target heading. float error = heading - targetHeading; if (error > 180) { error = error - 360; // for angles > 180, correct in the opposite direction. } // A non-zero difference between the heading and the // targetHeading will bias the servoNeutral value and // cause the servo to rotate back toward the targetHeading. // The divisor is to reduce the reaction speed and avoid oscillations servo.write(ServoNeutral + error / 4 );

delay(40);}

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 24 of 26

Page 25: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

Downloads and LinksFiles

LSM303DLHC datasheetPCB Files (Eagle Format)Fritzing object in the Adafruit Fritzing libraryTechnical Article: Everything about STMicroelectronics’ 3-axis digital MEMS gyroscopes

Schematic & Fabrication Print

© Adafruit Industries https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout Page 25 of 26

Page 26: LSM303 Accelerometer + Compass Breakout · Overview The LSM303 breakout board combines a magnetometer/compass module with a triple-axis accelerometer to make a compact navigation

© Adafruit Industries Last Updated: 2018-03-03 12:41:22 AM UTC Page 26 of 26