library for using LSM303DM chip
LSM303.h@6:22556393747b, 2014-09-08 (annotated)
- 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?
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 | 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 |