library for using LSM303DM chip
LSM303.h@5:9786e0a13a3a, 2014-08-12 (annotated)
- 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?
User | Revision | Line number | New 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 |