Cubli library
LSM9DS1/LSM9DS1.h@2:dc7840a67f77, 2019-02-25 (annotated)
- Committer:
- fbob
- Date:
- Mon Feb 25 16:39:52 2019 +0000
- Revision:
- 2:dc7840a67f77
- Parent:
- 1:085840a3d767
Update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fbob | 0:431ee55036ca | 1 | #ifndef LSM9DS1_h |
fbob | 0:431ee55036ca | 2 | #define LSM9DS1_h |
fbob | 0:431ee55036ca | 3 | |
fbob | 0:431ee55036ca | 4 | #include "mbed.h" |
fbob | 0:431ee55036ca | 5 | |
fbob | 0:431ee55036ca | 6 | // Physical constants |
fbob | 0:431ee55036ca | 7 | #define GRAVITY 9.80665f |
fbob | 0:431ee55036ca | 8 | #define PI 3.14159f |
fbob | 0:431ee55036ca | 9 | |
fbob | 0:431ee55036ca | 10 | // LSM9DS1 I2C bus address |
fbob | 2:dc7840a67f77 | 11 | #define LSM9DS1_ADDRESS_ACC_GYR 0x6B << 1 // (0xD6) Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit |
fbob | 2:dc7840a67f77 | 12 | #define LSM9DS1_ADDRESS_MAG 0x1E << 1 // (0x3C) Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit |
fbob | 0:431ee55036ca | 13 | |
fbob | 0:431ee55036ca | 14 | // Device identity |
fbob | 2:dc7840a67f77 | 15 | #define WHO_AM_I 0x0F |
fbob | 2:dc7840a67f77 | 16 | #define WHO_AM_I_M 0x0F |
fbob | 2:dc7840a67f77 | 17 | |
fbob | 2:dc7840a67f77 | 18 | // Gyroscope configuration registers addresses |
fbob | 2:dc7840a67f77 | 19 | #define CTRL_REG1_G 0x10 |
fbob | 2:dc7840a67f77 | 20 | // Gyroscope output register addresses |
fbob | 2:dc7840a67f77 | 21 | #define OUT_X_L_G 0x18 |
fbob | 2:dc7840a67f77 | 22 | #define OUT_X_H_G 0x19 |
fbob | 2:dc7840a67f77 | 23 | #define OUT_Y_L_G 0x1A |
fbob | 2:dc7840a67f77 | 24 | #define OUT_Y_H_G 0x1B |
fbob | 2:dc7840a67f77 | 25 | #define OUT_Z_L_G 0x1C |
fbob | 2:dc7840a67f77 | 26 | #define OUT_Z_H_G 0x1D |
fbob | 0:431ee55036ca | 27 | |
fbob | 0:431ee55036ca | 28 | // Accelerometer configuration registers addresses |
fbob | 0:431ee55036ca | 29 | #define CTRL_REG6_XL 0x20 |
fbob | 0:431ee55036ca | 30 | // Accelerometer output register addresses |
fbob | 2:dc7840a67f77 | 31 | #define OUT_X_L_XL 0x28 |
fbob | 2:dc7840a67f77 | 32 | #define OUT_X_H_XL 0x29 |
fbob | 2:dc7840a67f77 | 33 | #define OUT_Y_L_XL 0x2A |
fbob | 2:dc7840a67f77 | 34 | #define OUT_Y_H_XL 0x2B |
fbob | 2:dc7840a67f77 | 35 | #define OUT_Z_L_XL 0x2C |
fbob | 2:dc7840a67f77 | 36 | #define OUT_Z_H_XL 0x2D |
fbob | 0:431ee55036ca | 37 | |
fbob | 2:dc7840a67f77 | 38 | // Magnetometer configuration registers addresses |
fbob | 2:dc7840a67f77 | 39 | #define CTRL_REG1_M 0x20 |
fbob | 2:dc7840a67f77 | 40 | #define CTRL_REG2_M 0x21 |
fbob | 2:dc7840a67f77 | 41 | // Magnetometer output register addresses |
fbob | 2:dc7840a67f77 | 42 | #define OUT_X_L_M 0x28 |
fbob | 2:dc7840a67f77 | 43 | #define OUT_X_H_M 0x29 |
fbob | 2:dc7840a67f77 | 44 | #define OUT_Y_L_M 0x2A |
fbob | 2:dc7840a67f77 | 45 | #define OUT_Y_H_M 0x2B |
fbob | 2:dc7840a67f77 | 46 | #define OUT_Z_L_M 0x2C |
fbob | 2:dc7840a67f77 | 47 | #define OUT_Z_H_M 0x2D |
fbob | 2:dc7840a67f77 | 48 | |
fbob | 2:dc7840a67f77 | 49 | // Gyroscope full-scale ranges |
fbob | 2:dc7840a67f77 | 50 | enum gyr_scale |
fbob | 2:dc7840a67f77 | 51 | { |
fbob | 2:dc7840a67f77 | 52 | GYR_SCALE_245DPS = 0b00, |
fbob | 2:dc7840a67f77 | 53 | GYR_SCALE_500DPS = 0b01, |
fbob | 2:dc7840a67f77 | 54 | GYR_SCALE_2000DPS = 0b11 |
fbob | 2:dc7840a67f77 | 55 | }; |
fbob | 0:431ee55036ca | 56 | |
fbob | 0:431ee55036ca | 57 | // Accelerometer full-scale ranges |
fbob | 2:dc7840a67f77 | 58 | enum acc_scale |
fbob | 0:431ee55036ca | 59 | { |
fbob | 2:dc7840a67f77 | 60 | ACC_SCALE_2G = 0b00, |
fbob | 2:dc7840a67f77 | 61 | ACC_SCALE_4G = 0b10, |
fbob | 2:dc7840a67f77 | 62 | ACC_SCALE_8G = 0b11, |
fbob | 2:dc7840a67f77 | 63 | ACC_SCALE_16G = 0b01 |
fbob | 0:431ee55036ca | 64 | }; |
fbob | 0:431ee55036ca | 65 | |
fbob | 2:dc7840a67f77 | 66 | // Magnetometer full-scale ranges |
fbob | 2:dc7840a67f77 | 67 | enum mag_scale |
fbob | 0:431ee55036ca | 68 | { |
fbob | 2:dc7840a67f77 | 69 | MAG_SCALE_4G = 0b00, |
fbob | 2:dc7840a67f77 | 70 | MAG_SCALE_8G = 0b01, |
fbob | 2:dc7840a67f77 | 71 | MAG_SCALE_12G = 0b10, |
fbob | 2:dc7840a67f77 | 72 | MAG_SCALE_16G = 0b11 |
fbob | 0:431ee55036ca | 73 | }; |
fbob | 0:431ee55036ca | 74 | |
fbob | 0:431ee55036ca | 75 | /** LSM9DS1 (IMU sensor) class |
fbob | 0:431ee55036ca | 76 | * |
fbob | 0:431ee55036ca | 77 | * Example code (print accelerometer and gyroscope data on serial port every 0.2 seconds): |
fbob | 0:431ee55036ca | 78 | * @code |
fbob | 0:431ee55036ca | 79 | * #include "mbed.h" |
fbob | 0:431ee55036ca | 80 | * #include "USBSerial.h" |
fbob | 0:431ee55036ca | 81 | * #include "LSM9DS1.h" |
fbob | 0:431ee55036ca | 82 | * |
fbob | 0:431ee55036ca | 83 | * USBSerial pc; |
fbob | 0:431ee55036ca | 84 | * LSM9DS1 imu(A4,A5); |
fbob | 0:431ee55036ca | 85 | * |
fbob | 0:431ee55036ca | 86 | * int main() |
fbob | 0:431ee55036ca | 87 | * { |
fbob | 0:431ee55036ca | 88 | * imu.init(); |
fbob | 0:431ee55036ca | 89 | * while(1) |
fbob | 0:431ee55036ca | 90 | * { |
fbob | 0:431ee55036ca | 91 | * imu.read(); |
fbob | 2:dc7840a67f77 | 92 | pc.printf("Acc [m/s^2]: %.1f | %.1f | %.1f \n", imu.ax, imu.ay, imu.az); |
fbob | 2:dc7840a67f77 | 93 | pc.printf("Gyr [rad/s]: %.1f | %.1f | %.1f \n", imu.gx, imu.gy, imu.gz); |
fbob | 2:dc7840a67f77 | 94 | pc.printf("Mag [uT]: %.1f | %.1f | %.1f \n\n", imu.mx, imu.my, imu.mz); |
fbob | 0:431ee55036ca | 95 | * wait(0.2); |
fbob | 0:431ee55036ca | 96 | * } |
fbob | 0:431ee55036ca | 97 | * } |
fbob | 0:431ee55036ca | 98 | * @endcode |
fbob | 0:431ee55036ca | 99 | * |
fbob | 0:431ee55036ca | 100 | */ |
fbob | 0:431ee55036ca | 101 | class LSM9DS1 |
fbob | 0:431ee55036ca | 102 | { |
fbob | 0:431ee55036ca | 103 | public: |
fbob | 2:dc7840a67f77 | 104 | |
fbob | 0:431ee55036ca | 105 | /** Class constructor */ |
fbob | 0:431ee55036ca | 106 | LSM9DS1(PinName sda, PinName scl); |
fbob | 0:431ee55036ca | 107 | |
fbob | 0:431ee55036ca | 108 | /** Initialize sensor */ |
fbob | 0:431ee55036ca | 109 | bool init(); |
fbob | 0:431ee55036ca | 110 | /** Read sensor data */ |
fbob | 0:431ee55036ca | 111 | void read(); |
fbob | 1:085840a3d767 | 112 | |
fbob | 2:dc7840a67f77 | 113 | /** Gyroscope data in x-axis [rad/s]*/ |
fbob | 2:dc7840a67f77 | 114 | float gx; |
fbob | 2:dc7840a67f77 | 115 | /** Gyroscope data in y-axis [rad/s]*/ |
fbob | 2:dc7840a67f77 | 116 | float gy; |
fbob | 2:dc7840a67f77 | 117 | /** Gyroscope data in z-axis [rad/s]*/ |
fbob | 2:dc7840a67f77 | 118 | float gz; |
fbob | 1:085840a3d767 | 119 | /** Accelerometer data in x-axis [m/s^2]*/ |
fbob | 1:085840a3d767 | 120 | float ax; |
fbob | 1:085840a3d767 | 121 | /** Accelerometer data in y-axis [m/s^2]*/ |
fbob | 1:085840a3d767 | 122 | float ay; |
fbob | 1:085840a3d767 | 123 | /** Accelerometer data in z-axis [m/s^2]*/ |
fbob | 1:085840a3d767 | 124 | float az; |
fbob | 2:dc7840a67f77 | 125 | /** Magnetometer data in x-axis [??]*/ |
fbob | 2:dc7840a67f77 | 126 | float mx; |
fbob | 2:dc7840a67f77 | 127 | /** Magnetometer data in y-axis [??]*/ |
fbob | 2:dc7840a67f77 | 128 | float my; |
fbob | 2:dc7840a67f77 | 129 | /** Magnetometer data in z-axis [??]*/ |
fbob | 2:dc7840a67f77 | 130 | float mz; |
fbob | 2:dc7840a67f77 | 131 | |
fbob | 0:431ee55036ca | 132 | private: |
fbob | 2:dc7840a67f77 | 133 | |
fbob | 0:431ee55036ca | 134 | /** I2C bus */ |
fbob | 0:431ee55036ca | 135 | I2C i2c; |
fbob | 0:431ee55036ca | 136 | |
fbob | 0:431ee55036ca | 137 | /** Setup I2C bus */ |
fbob | 0:431ee55036ca | 138 | void setup_i2c(); |
fbob | 0:431ee55036ca | 139 | /** Test I2C bus */ |
fbob | 0:431ee55036ca | 140 | bool test_i2c(); |
fbob | 0:431ee55036ca | 141 | |
fbob | 2:dc7840a67f77 | 142 | /** Setup gyroscope configurations (full-scale range) */ |
fbob | 2:dc7840a67f77 | 143 | void setup_gyr(gyr_scale g_scale = GYR_SCALE_2000DPS); |
fbob | 0:431ee55036ca | 144 | /** Setup accelerometer configurations (full-scale range) */ |
fbob | 2:dc7840a67f77 | 145 | void setup_acc(acc_scale a_scale = ACC_SCALE_2G); |
fbob | 2:dc7840a67f77 | 146 | /** Setup magnetometer configurations (full-scale range) */ |
fbob | 2:dc7840a67f77 | 147 | void setup_mag(mag_scale m_scale = MAG_SCALE_4G); |
fbob | 2:dc7840a67f77 | 148 | |
fbob | 0:431ee55036ca | 149 | /** Read gyroscope data */ |
fbob | 2:dc7840a67f77 | 150 | void read_gyr(); |
fbob | 2:dc7840a67f77 | 151 | /** Read accelerometer data */ |
fbob | 2:dc7840a67f77 | 152 | void read_acc(); |
fbob | 2:dc7840a67f77 | 153 | /** Read magnetometer data */ |
fbob | 2:dc7840a67f77 | 154 | void read_mag(); |
fbob | 0:431ee55036ca | 155 | |
fbob | 2:dc7840a67f77 | 156 | /** Gyroscope resolution [rad/s / bit] */ |
fbob | 2:dc7840a67f77 | 157 | float g_res; |
fbob | 0:431ee55036ca | 158 | /** Accelerometer resolution [m/s^2 / bit] */ |
fbob | 0:431ee55036ca | 159 | float a_res; |
fbob | 2:dc7840a67f77 | 160 | /** Magnetometers resolution [uT / bit] */ |
fbob | 2:dc7840a67f77 | 161 | float m_res; |
fbob | 0:431ee55036ca | 162 | |
fbob | 0:431ee55036ca | 163 | }; |
fbob | 0:431ee55036ca | 164 | |
fbob | 0:431ee55036ca | 165 | #endif |