AHRS library for the Polulu minIMU-9 Ability to interface with the Polulu Python minIMU-9 monitor
LSM303.h@1:3272ece36ce1, 2012-04-23 (annotated)
- Committer:
- krmreynolds
- Date:
- Mon Apr 23 14:31:08 2012 +0000
- Revision:
- 1:3272ece36ce1
- Parent:
- 0:dc35364e2291
Ported L3G4200D and LSM303 from the Polulu website, dropped the horrible code that someone else built
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
krmreynolds | 0:dc35364e2291 | 1 | #ifndef LSM303_h |
krmreynolds | 0:dc35364e2291 | 2 | #define LSM303_h |
krmreynolds | 0:dc35364e2291 | 3 | |
krmreynolds | 0:dc35364e2291 | 4 | #include "mbed.h" |
krmreynolds | 1:3272ece36ce1 | 5 | |
krmreynolds | 1:3272ece36ce1 | 6 | // device types |
krmreynolds | 1:3272ece36ce1 | 7 | |
krmreynolds | 1:3272ece36ce1 | 8 | #define LSM303DLH_DEVICE 0 |
krmreynolds | 1:3272ece36ce1 | 9 | #define LSM303DLM_DEVICE 1 |
krmreynolds | 1:3272ece36ce1 | 10 | #define LSM303DLHC_DEVICE 2 |
krmreynolds | 1:3272ece36ce1 | 11 | #define LSM303_DEVICE_AUTO 3 |
krmreynolds | 1:3272ece36ce1 | 12 | |
krmreynolds | 1:3272ece36ce1 | 13 | // SA0_A states |
krmreynolds | 1:3272ece36ce1 | 14 | |
krmreynolds | 1:3272ece36ce1 | 15 | #define LSM303_SA0_A_LOW 0 |
krmreynolds | 1:3272ece36ce1 | 16 | #define LSM303_SA0_A_HIGH 1 |
krmreynolds | 1:3272ece36ce1 | 17 | #define LSM303_SA0_A_AUTO 2 |
krmreynolds | 1:3272ece36ce1 | 18 | |
krmreynolds | 1:3272ece36ce1 | 19 | // register addresses |
krmreynolds | 1:3272ece36ce1 | 20 | |
krmreynolds | 1:3272ece36ce1 | 21 | #define LSM303_CTRL_REG1_A 0x20 |
krmreynolds | 1:3272ece36ce1 | 22 | #define LSM303_CTRL_REG2_A 0x21 |
krmreynolds | 1:3272ece36ce1 | 23 | #define LSM303_CTRL_REG3_A 0x22 |
krmreynolds | 1:3272ece36ce1 | 24 | #define LSM303_CTRL_REG4_A 0x23 |
krmreynolds | 1:3272ece36ce1 | 25 | #define LSM303_CTRL_REG5_A 0x24 |
krmreynolds | 1:3272ece36ce1 | 26 | #define LSM303_CTRL_REG6_A 0x25 // DLHC only |
krmreynolds | 1:3272ece36ce1 | 27 | #define LSM303_HP_FILTER_RESET_A 0x25 // DLH, DLM only |
krmreynolds | 1:3272ece36ce1 | 28 | #define LSM303_REFERENCE_A 0x26 |
krmreynolds | 1:3272ece36ce1 | 29 | #define LSM303_STATUS_REG_A 0x27 |
krmreynolds | 1:3272ece36ce1 | 30 | |
krmreynolds | 1:3272ece36ce1 | 31 | #define LSM303_OUT_X_L_A 0x28 |
krmreynolds | 1:3272ece36ce1 | 32 | #define LSM303_OUT_X_H_A 0x29 |
krmreynolds | 1:3272ece36ce1 | 33 | #define LSM303_OUT_Y_L_A 0x2A |
krmreynolds | 1:3272ece36ce1 | 34 | #define LSM303_OUT_Y_H_A 0x2B |
krmreynolds | 1:3272ece36ce1 | 35 | #define LSM303_OUT_Z_L_A 0x2C |
krmreynolds | 1:3272ece36ce1 | 36 | #define LSM303_OUT_Z_H_A 0x2D |
krmreynolds | 1:3272ece36ce1 | 37 | |
krmreynolds | 1:3272ece36ce1 | 38 | #define LSM303_FIFO_CTRL_REG_A 0x2E // DLHC only |
krmreynolds | 1:3272ece36ce1 | 39 | #define LSM303_FIFO_SRC_REG_A 0x2F // DLHC only |
krmreynolds | 1:3272ece36ce1 | 40 | |
krmreynolds | 1:3272ece36ce1 | 41 | #define LSM303_INT1_CFG_A 0x30 |
krmreynolds | 1:3272ece36ce1 | 42 | #define LSM303_INT1_SRC_A 0x31 |
krmreynolds | 1:3272ece36ce1 | 43 | #define LSM303_INT1_THS_A 0x32 |
krmreynolds | 1:3272ece36ce1 | 44 | #define LSM303_INT1_DURATION_A 0x33 |
krmreynolds | 1:3272ece36ce1 | 45 | #define LSM303_INT2_CFG_A 0x34 |
krmreynolds | 1:3272ece36ce1 | 46 | #define LSM303_INT2_SRC_A 0x35 |
krmreynolds | 1:3272ece36ce1 | 47 | #define LSM303_INT2_THS_A 0x36 |
krmreynolds | 1:3272ece36ce1 | 48 | #define LSM303_INT2_DURATION_A 0x37 |
krmreynolds | 1:3272ece36ce1 | 49 | |
krmreynolds | 1:3272ece36ce1 | 50 | #define LSM303_CLICK_CFG_A 0x38 // DLHC only |
krmreynolds | 1:3272ece36ce1 | 51 | #define LSM303_CLICK_SRC_A 0x39 // DLHC only |
krmreynolds | 1:3272ece36ce1 | 52 | #define LSM303_CLICK_THS_A 0x3A // DLHC only |
krmreynolds | 1:3272ece36ce1 | 53 | #define LSM303_TIME_LIMIT_A 0x3B // DLHC only |
krmreynolds | 1:3272ece36ce1 | 54 | #define LSM303_TIME_LATENCY_A 0x3C // DLHC only |
krmreynolds | 1:3272ece36ce1 | 55 | #define LSM303_TIME_WINDOW_A 0x3D // DLHC only |
krmreynolds | 1:3272ece36ce1 | 56 | |
krmreynolds | 1:3272ece36ce1 | 57 | #define LSM303_CRA_REG_M 0x00 |
krmreynolds | 1:3272ece36ce1 | 58 | #define LSM303_CRB_REG_M 0x01 |
krmreynolds | 1:3272ece36ce1 | 59 | #define LSM303_MR_REG_M 0x02 |
krmreynolds | 1:3272ece36ce1 | 60 | |
krmreynolds | 1:3272ece36ce1 | 61 | #define LSM303_OUT_X_H_M 0x03 |
krmreynolds | 1:3272ece36ce1 | 62 | #define LSM303_OUT_X_L_M 0x04 |
krmreynolds | 1:3272ece36ce1 | 63 | #define LSM303_OUT_Y_H_M -1 // The addresses of the Y and Z magnetometer output registers |
krmreynolds | 1:3272ece36ce1 | 64 | #define LSM303_OUT_Y_L_M -2 // are reversed on the DLM and DLHC relative to the DLH. |
krmreynolds | 1:3272ece36ce1 | 65 | #define LSM303_OUT_Z_H_M -3 // These four defines have dummy values so the library can |
krmreynolds | 1:3272ece36ce1 | 66 | #define LSM303_OUT_Z_L_M -4 // determine the correct address based on the device type. |
krmreynolds | 1:3272ece36ce1 | 67 | |
krmreynolds | 1:3272ece36ce1 | 68 | #define LSM303_SR_REG_M 0x09 |
krmreynolds | 1:3272ece36ce1 | 69 | #define LSM303_IRA_REG_M 0x0A |
krmreynolds | 1:3272ece36ce1 | 70 | #define LSM303_IRB_REG_M 0x0B |
krmreynolds | 1:3272ece36ce1 | 71 | #define LSM303_IRC_REG_M 0x0C |
krmreynolds | 1:3272ece36ce1 | 72 | |
krmreynolds | 1:3272ece36ce1 | 73 | #define LSM303_WHO_AM_I_M 0x0F // DLM only |
krmreynolds | 1:3272ece36ce1 | 74 | |
krmreynolds | 1:3272ece36ce1 | 75 | #define LSM303_TEMP_OUT_H_M 0x31 // DLHC only |
krmreynolds | 1:3272ece36ce1 | 76 | #define LSM303_TEMP_OUT_L_M 0x32 // DLHC only |
krmreynolds | 1:3272ece36ce1 | 77 | |
krmreynolds | 1:3272ece36ce1 | 78 | #define LSM303DLH_OUT_Y_H_M 0x05 |
krmreynolds | 1:3272ece36ce1 | 79 | #define LSM303DLH_OUT_Y_L_M 0x06 |
krmreynolds | 1:3272ece36ce1 | 80 | #define LSM303DLH_OUT_Z_H_M 0x07 |
krmreynolds | 1:3272ece36ce1 | 81 | #define LSM303DLH_OUT_Z_L_M 0x08 |
krmreynolds | 1:3272ece36ce1 | 82 | |
krmreynolds | 1:3272ece36ce1 | 83 | #define LSM303DLM_OUT_Z_H_M 0x05 |
krmreynolds | 1:3272ece36ce1 | 84 | #define LSM303DLM_OUT_Z_L_M 0x06 |
krmreynolds | 1:3272ece36ce1 | 85 | #define LSM303DLM_OUT_Y_H_M 0x07 |
krmreynolds | 1:3272ece36ce1 | 86 | #define LSM303DLM_OUT_Y_L_M 0x08 |
krmreynolds | 1:3272ece36ce1 | 87 | |
krmreynolds | 1:3272ece36ce1 | 88 | #define LSM303DLHC_OUT_Z_H_M 0x05 |
krmreynolds | 1:3272ece36ce1 | 89 | #define LSM303DLHC_OUT_Z_L_M 0x06 |
krmreynolds | 1:3272ece36ce1 | 90 | #define LSM303DLHC_OUT_Y_H_M 0x07 |
krmreynolds | 1:3272ece36ce1 | 91 | #define LSM303DLHC_OUT_Y_L_M 0x08 |
krmreynolds | 1:3272ece36ce1 | 92 | |
krmreynolds | 1:3272ece36ce1 | 93 | #define MAG_ADDRESS 0x3C |
krmreynolds | 1:3272ece36ce1 | 94 | #define ACC_ADDRESS_SA0_A_LOW 0x30 |
krmreynolds | 1:3272ece36ce1 | 95 | #define ACC_ADDRESS_SA0_A_HIGH 0x32 |
krmreynolds | 1:3272ece36ce1 | 96 | |
krmreynolds | 1:3272ece36ce1 | 97 | #define M_PI 3.14159265 |
krmreynolds | 1:3272ece36ce1 | 98 | |
krmreynolds | 1:3272ece36ce1 | 99 | typedef unsigned char byte; |
krmreynolds | 0:dc35364e2291 | 100 | |
krmreynolds | 0:dc35364e2291 | 101 | class LSM303 { |
krmreynolds | 0:dc35364e2291 | 102 | public: |
krmreynolds | 1:3272ece36ce1 | 103 | typedef struct Plane { |
krmreynolds | 1:3272ece36ce1 | 104 | float x, y, z; |
krmreynolds | 1:3272ece36ce1 | 105 | } Plane; |
krmreynolds | 1:3272ece36ce1 | 106 | |
krmreynolds | 1:3272ece36ce1 | 107 | I2C i2c; |
krmreynolds | 1:3272ece36ce1 | 108 | |
krmreynolds | 1:3272ece36ce1 | 109 | Plane a; // accelerometer readings |
krmreynolds | 1:3272ece36ce1 | 110 | Plane m; // magnetometer readings |
krmreynolds | 1:3272ece36ce1 | 111 | Plane m_max; // maximum magnetometer values, used for calibration |
krmreynolds | 1:3272ece36ce1 | 112 | Plane m_min; // minimum magnetometer values, used for calibration |
krmreynolds | 0:dc35364e2291 | 113 | |
krmreynolds | 1:3272ece36ce1 | 114 | LSM303(PinName, PinName); |
krmreynolds | 0:dc35364e2291 | 115 | |
krmreynolds | 1:3272ece36ce1 | 116 | void init(byte device = LSM303_DEVICE_AUTO, byte sa0_a = LSM303_SA0_A_AUTO); |
krmreynolds | 0:dc35364e2291 | 117 | |
krmreynolds | 1:3272ece36ce1 | 118 | void enableDefault(void); |
krmreynolds | 0:dc35364e2291 | 119 | |
krmreynolds | 1:3272ece36ce1 | 120 | void writeAccReg(byte reg, byte value); |
krmreynolds | 1:3272ece36ce1 | 121 | int readAccReg(byte reg); |
krmreynolds | 1:3272ece36ce1 | 122 | void writeMagReg(byte reg, byte value); |
krmreynolds | 1:3272ece36ce1 | 123 | int readMagReg(int reg); |
krmreynolds | 0:dc35364e2291 | 124 | |
krmreynolds | 1:3272ece36ce1 | 125 | void readAcc(void); |
krmreynolds | 1:3272ece36ce1 | 126 | void readMag(void); |
krmreynolds | 1:3272ece36ce1 | 127 | void read(void); |
krmreynolds | 1:3272ece36ce1 | 128 | |
krmreynolds | 1:3272ece36ce1 | 129 | int heading(void); |
krmreynolds | 1:3272ece36ce1 | 130 | int heading(Plane from); |
krmreynolds | 1:3272ece36ce1 | 131 | |
krmreynolds | 1:3272ece36ce1 | 132 | // Plane functions |
krmreynolds | 1:3272ece36ce1 | 133 | static void vector_cross(const Plane *a, const Plane *b, Plane *out); |
krmreynolds | 1:3272ece36ce1 | 134 | static float vector_dot(const Plane *a,const Plane *b); |
krmreynolds | 1:3272ece36ce1 | 135 | static void vector_normalize(Plane *a); |
krmreynolds | 0:dc35364e2291 | 136 | |
krmreynolds | 0:dc35364e2291 | 137 | private: |
krmreynolds | 1:3272ece36ce1 | 138 | byte _device; // chip type (DLH, DLM, or DLHC) |
krmreynolds | 1:3272ece36ce1 | 139 | byte acc_address; |
krmreynolds | 0:dc35364e2291 | 140 | |
krmreynolds | 1:3272ece36ce1 | 141 | byte detectSA0_A(void); |
krmreynolds | 0:dc35364e2291 | 142 | }; |
krmreynolds | 0:dc35364e2291 | 143 | |
krmreynolds | 1:3272ece36ce1 | 144 | #endif |