library for using LSM303DM chip

Committer:
fin4478
Date:
Mon Sep 08 01:46:11 2014 +0000
Revision:
6:22556393747b
Parent:
5:9786e0a13a3a
soft iron correction scale added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fin4478 0:4d358fbeab6e 1 #ifndef LSM303_h
fin4478 0:4d358fbeab6e 2 #define LSM303_h
fin4478 0:4d358fbeab6e 3 #include "mbed.h"
fin4478 0:4d358fbeab6e 4
fin4478 0:4d358fbeab6e 5 /* LSM303 Address definitions */
fin4478 0:4d358fbeab6e 6 #define LSM303_MAG 0x3C // assuming SA0 grounded
fin4478 0:4d358fbeab6e 7 #define LSM303_ACC 0x30 // assuming SA0 grounded
fin4478 0:4d358fbeab6e 8
fin4478 0:4d358fbeab6e 9
fin4478 0:4d358fbeab6e 10 /* LSM303 Register definitions */
fin4478 0:4d358fbeab6e 11 #define CTRL_REG1_A 0x20
fin4478 0:4d358fbeab6e 12 #define CTRL_REG2_A 0x21
fin4478 0:4d358fbeab6e 13 #define CTRL_REG3_A 0x22
fin4478 0:4d358fbeab6e 14 #define CTRL_REG4_A 0x23
fin4478 0:4d358fbeab6e 15 #define CTRL_REG5_A 0x24
fin4478 0:4d358fbeab6e 16 #define HP_FILTER_RESET_A 0x25
fin4478 0:4d358fbeab6e 17 #define REFERENCE_A 0x26
fin4478 0:4d358fbeab6e 18 #define STATUS_REG_A 0x27
fin4478 0:4d358fbeab6e 19 #define OUT_X_L_A 0x28
fin4478 0:4d358fbeab6e 20 #define OUT_X_H_A 0x29
fin4478 0:4d358fbeab6e 21 #define OUT_Y_L_A 0x2A
fin4478 0:4d358fbeab6e 22 #define OUT_Y_H_A 0x2B
fin4478 0:4d358fbeab6e 23 #define OUT_Z_L_A 0x2C
fin4478 0:4d358fbeab6e 24 #define OUT_Z_H_A 0x2D
fin4478 0:4d358fbeab6e 25 #define INT1_CFG_A 0x30
fin4478 0:4d358fbeab6e 26 #define INT1_SOURCE_A 0x31
fin4478 0:4d358fbeab6e 27 #define INT1_THS_A 0x32
fin4478 0:4d358fbeab6e 28 #define INT1_DURATION_A 0x33
fin4478 0:4d358fbeab6e 29 #define CRA_REG_M 0x00
fin4478 0:4d358fbeab6e 30 #define CRB_REG_M 0x01//refer to the Table 58 of the datasheet of LSM303DLM
fin4478 0:4d358fbeab6e 31 #define MAG_SCALE_1_3 0x20//full-scale is +/-1.3Gauss
fin4478 0:4d358fbeab6e 32 #define MAG_SCALE_1_9 0x40//+/-1.9Gauss
fin4478 0:4d358fbeab6e 33 #define MAG_SCALE_2_5 0x60//+/-2.5Gauss
fin4478 0:4d358fbeab6e 34 #define MAG_SCALE_4_0 0x80//+/-4.0Gauss
fin4478 0:4d358fbeab6e 35 #define MAG_SCALE_4_7 0xa0//+/-4.7Gauss
fin4478 0:4d358fbeab6e 36 #define MAG_SCALE_5_6 0xc0//+/-5.6Gauss
fin4478 0:4d358fbeab6e 37 #define MAG_SCALE_8_1 0xe0//+/-8.1Gauss
fin4478 0:4d358fbeab6e 38 #define MR_REG_M 0x02
fin4478 0:4d358fbeab6e 39 #define OUT_X_H_M 0x03
fin4478 0:4d358fbeab6e 40 #define OUT_X_L_M 0x04
fin4478 0:4d358fbeab6e 41 #define OUT_Y_H_M 0x07
fin4478 0:4d358fbeab6e 42 #define OUT_Y_L_M 0x08
fin4478 0:4d358fbeab6e 43 #define OUT_Z_H_M 0x05
fin4478 0:4d358fbeab6e 44 #define OUT_Z_L_M 0x06
fin4478 0:4d358fbeab6e 45 #define SR_REG_M 0x09
fin4478 0:4d358fbeab6e 46 #define IRA_REG_M 0x0A
fin4478 0:4d358fbeab6e 47 #define IRB_REG_M 0x0B
fin4478 0:4d358fbeab6e 48 #define IRC_REG_M 0x0C
fin4478 0:4d358fbeab6e 49 #define LSM303_WHO_AM_I_M 0x0F // DLM only
fin4478 0:4d358fbeab6e 50
fin4478 0:4d358fbeab6e 51 #define PI 3.14159265
fin4478 5:9786e0a13a3a 52 //#define CALIBRATING //uncomment when calibrating
fin4478 0:4d358fbeab6e 53
fin4478 6:22556393747b 54 /** LSM303DLM mbed code based on AN3192 Application note and LSM303DLH example code by Jim Lindblom SparkFun Electronics
fin4478 6:22556393747b 55 modified by Frankie.Chu to arduino in year 2012.
fin4478 6:22556393747b 56
fin4478 6:22556393747b 57 date: 13/10/13
fin4478 6:22556393747b 58 license: Use this with your own risk:-)
fin4478 6:22556393747b 59
fin4478 6:22556393747b 60 Calibration the compass and accelometer is a must to make your compass to work:
fin4478 6:22556393747b 61 @code
fin4478 6:22556393747b 62 //calibration loop
fin4478 6:22556393747b 63 for(int i = 0; i <200; i++) {
fin4478 6:22556393747b 64
fin4478 6:22556393747b 65 lsm.getLSM303_mag();
fin4478 6:22556393747b 66
fin4478 6:22556393747b 67 // Mmin handler
fin4478 6:22556393747b 68 if(lsm.m.x < lsm.m_min.x)
fin4478 6:22556393747b 69 lsm.m_min.x = lsm.m.x;
fin4478 6:22556393747b 70
fin4478 6:22556393747b 71 if(lsm.m.y < lsm.m_min.y)
fin4478 6:22556393747b 72 lsm.m_min.y = lsm.m.y;
fin4478 6:22556393747b 73
fin4478 6:22556393747b 74 if(lsm.m.z < lsm.m_min.z)
fin4478 6:22556393747b 75 lsm.m_min.z = lsm.m.z;
fin4478 6:22556393747b 76
fin4478 6:22556393747b 77 // Mmax handler
fin4478 6:22556393747b 78 if(lsm.m.x > lsm.m_max.x)
fin4478 6:22556393747b 79 lsm.m_max.x = lsm.m.x ;
fin4478 6:22556393747b 80
fin4478 6:22556393747b 81 if(lsm.m.y > lsm.m_max.y)
fin4478 6:22556393747b 82 lsm.m_max.y = lsm.m.y;
fin4478 6:22556393747b 83
fin4478 6:22556393747b 84 if(lsm.m.z > lsm.m_max.z)
fin4478 6:22556393747b 85 lsm.m_max.z = lsm.m.z;
fin4478 6:22556393747b 86 wait(0.1);
fin4478 6:22556393747b 87 }
fin4478 6:22556393747b 88 @endcode
fin4478 6:22556393747b 89 */
fin4478 0:4d358fbeab6e 90 class LSM303
fin4478 6:22556393747b 91 {
fin4478 0:4d358fbeab6e 92 public:
fin4478 6:22556393747b 93 //! A plane with x,y and z axis
fin4478 0:4d358fbeab6e 94 typedef struct Plane {
fin4478 0:4d358fbeab6e 95 float x, y, z;
fin4478 0:4d358fbeab6e 96 } Plane;
fin4478 0:4d358fbeab6e 97
fin4478 6:22556393747b 98 //! accelerometer readings
fin4478 6:22556393747b 99 Plane a;
fin4478 5:9786e0a13a3a 100 Plane a_max;
fin4478 5:9786e0a13a3a 101 Plane a_min;
fin4478 6:22556393747b 102 //! magnetometer readings
fin4478 6:22556393747b 103 Plane m;
fin4478 0:4d358fbeab6e 104 Plane m_max; // maximum magnetometer values, used for calibration
fin4478 0:4d358fbeab6e 105 Plane m_min; // minimum magnetometer values, used for calibration
fin4478 6:22556393747b 106 Plane scale; //soft magneting field scaling
fin4478 6:22556393747b 107 //! Initialises LSM303DLM chip
fin4478 6:22556393747b 108 void setup();
fin4478 6:22556393747b 109 //!Tests Accelometer. Returns 0xFF on error, 0x30 if succesful.
fin4478 6:22556393747b 110 int testAcc();
fin4478 6:22556393747b 111 //!Tests Compass. Returns 0xFF on error, 0x0F if succesful and LSM303DLM; 0x3C if LSM303DH.
fin4478 6:22556393747b 112 int testMag();
fin4478 6:22556393747b 113 //! Returns compass heading in degrees
fin4478 6:22556393747b 114 float getTiltHeading();
fin4478 6:22556393747b 115 //! Reads magnetometer values to m
fin4478 6:22556393747b 116 void getLSM303_mag();
fin4478 6:22556393747b 117 //! Reads accelerometer values to a
fin4478 6:22556393747b 118 void getLSM303_accel();
fin4478 6:22556393747b 119
fin4478 6:22556393747b 120 private:
fin4478 6:22556393747b 121 int _i2c_address;
fin4478 0:4d358fbeab6e 122 float pitch;
fin4478 0:4d358fbeab6e 123 float roll;
fin4478 6:22556393747b 124
fin4478 0:4d358fbeab6e 125 int LSM303_read(int address);
fin4478 6:22556393747b 126 int LSM303_write(int data, int address);
fin4478 0:4d358fbeab6e 127 // Plane functions
fin4478 0:4d358fbeab6e 128 static void vector_cross(const Plane *a, const Plane *b, Plane *out);
fin4478 0:4d358fbeab6e 129 static float vector_dot(const Plane *a,const Plane *b);
fin4478 0:4d358fbeab6e 130 static void vector_normalize(Plane *a);
fin4478 6:22556393747b 131
fin4478 6:22556393747b 132 void getScale(Plane *scale);
fin4478 0:4d358fbeab6e 133 };
fin4478 0:4d358fbeab6e 134
fin4478 0:4d358fbeab6e 135 #endif
fin4478 0:4d358fbeab6e 136