Cubli library

Committer:
fbob
Date:
Mon Feb 25 16:39:52 2019 +0000
Revision:
2:dc7840a67f77
Parent:
1:085840a3d767
Update

Who changed what in which revision?

UserRevisionLine numberNew 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