library for using LSM303DM chip

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