Fabio Bobrow / Cubli
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LSM9DS1.h Source File

LSM9DS1.h

00001 #ifndef LSM9DS1_h
00002 #define LSM9DS1_h
00003 
00004 #include "mbed.h"
00005 
00006 // Physical constants
00007 #define GRAVITY 9.80665f
00008 #define PI 3.14159f
00009 
00010 // LSM9DS1 I2C bus address
00011 #define LSM9DS1_ADDRESS_ACC_GYR 0x6B << 1 // (0xD6) Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit 
00012 #define LSM9DS1_ADDRESS_MAG     0x1E << 1 // (0x3C) Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit 
00013 
00014 // Device identity  
00015 #define WHO_AM_I    0x0F
00016 #define WHO_AM_I_M  0x0F
00017 
00018 // Gyroscope configuration registers addresses
00019 #define CTRL_REG1_G 0x10
00020 // Gyroscope output register addresses
00021 #define OUT_X_L_G 0x18
00022 #define OUT_X_H_G 0x19
00023 #define OUT_Y_L_G 0x1A
00024 #define OUT_Y_H_G 0x1B
00025 #define OUT_Z_L_G 0x1C
00026 #define OUT_Z_H_G 0x1D
00027 
00028 // Accelerometer configuration registers addresses
00029 #define CTRL_REG6_XL 0x20
00030 // Accelerometer output register addresses
00031 #define OUT_X_L_XL 0x28
00032 #define OUT_X_H_XL 0x29
00033 #define OUT_Y_L_XL 0x2A
00034 #define OUT_Y_H_XL 0x2B
00035 #define OUT_Z_L_XL 0x2C
00036 #define OUT_Z_H_XL 0x2D
00037 
00038 // Magnetometer configuration registers addresses
00039 #define CTRL_REG1_M 0x20
00040 #define CTRL_REG2_M 0x21
00041 // Magnetometer output register addresses
00042 #define OUT_X_L_M 0x28
00043 #define OUT_X_H_M 0x29
00044 #define OUT_Y_L_M 0x2A
00045 #define OUT_Y_H_M 0x2B
00046 #define OUT_Z_L_M 0x2C
00047 #define OUT_Z_H_M 0x2D
00048 
00049 // Gyroscope full-scale ranges
00050 enum gyr_scale
00051 {
00052     GYR_SCALE_245DPS = 0b00,   
00053     GYR_SCALE_500DPS = 0b01,  
00054     GYR_SCALE_2000DPS = 0b11 
00055 };
00056 
00057 // Accelerometer full-scale ranges
00058 enum acc_scale
00059 {
00060     ACC_SCALE_2G = 0b00, 
00061     ACC_SCALE_4G = 0b10,
00062     ACC_SCALE_8G = 0b11, 
00063     ACC_SCALE_16G = 0b01 
00064 };
00065 
00066 // Magnetometer full-scale ranges
00067 enum mag_scale
00068 {
00069     MAG_SCALE_4G = 0b00,  
00070     MAG_SCALE_8G = 0b01,
00071     MAG_SCALE_12G = 0b10,
00072     MAG_SCALE_16G = 0b11
00073 };
00074 
00075 /** LSM9DS1 (IMU sensor) class
00076  *
00077  * Example code (print accelerometer and gyroscope data on serial port every 0.2 seconds):
00078  * @code
00079  * #include "mbed.h"
00080  * #include "USBSerial.h"
00081  * #include "LSM9DS1.h"
00082  *
00083  * USBSerial pc;
00084  * LSM9DS1 imu(A4,A5);
00085  * 
00086  * int main() 
00087  * {
00088  *     imu.init();
00089  *     while(1)
00090  *     {
00091  *          imu.read();
00092             pc.printf("Acc [m/s^2]: %.1f | %.1f | %.1f \n", imu.ax, imu.ay, imu.az);
00093             pc.printf("Gyr [rad/s]: %.1f | %.1f | %.1f \n", imu.gx, imu.gy, imu.gz);
00094             pc.printf("Mag    [uT]: %.1f | %.1f | %.1f \n\n", imu.mx, imu.my, imu.mz);
00095  *          wait(0.2);
00096  *     }
00097  * }
00098  * @endcode
00099  *
00100  */
00101 class LSM9DS1
00102 {
00103     public:
00104     
00105         /** Class constructor */
00106         LSM9DS1(PinName sda, PinName scl);
00107         
00108         /** Initialize sensor */
00109         bool init();
00110         /** Read sensor data */
00111         void read();
00112         
00113         /** Gyroscope data in x-axis [rad/s]*/
00114         float gx;
00115         /** Gyroscope data in y-axis [rad/s]*/
00116         float gy;
00117         /** Gyroscope data in z-axis [rad/s]*/
00118         float gz;
00119         /** Accelerometer data in x-axis [m/s^2]*/
00120         float ax;
00121         /** Accelerometer data in y-axis [m/s^2]*/
00122         float ay;
00123         /** Accelerometer data in z-axis [m/s^2]*/
00124         float az;
00125         /** Magnetometer data in x-axis [??]*/
00126         float mx;
00127         /** Magnetometer data in y-axis [??]*/
00128         float my;
00129         /** Magnetometer data in z-axis [??]*/
00130         float mz;
00131         
00132     private:
00133     
00134         /** I2C bus */
00135         I2C i2c;
00136         
00137         /** Setup I2C bus */
00138         void setup_i2c();
00139         /** Test I2C bus */
00140         bool test_i2c();
00141         
00142         /** Setup gyroscope configurations (full-scale range) */
00143         void setup_gyr(gyr_scale g_scale = GYR_SCALE_2000DPS);
00144         /** Setup accelerometer configurations (full-scale range) */
00145         void setup_acc(acc_scale a_scale = ACC_SCALE_2G);
00146         /** Setup magnetometer configurations (full-scale range) */
00147         void setup_mag(mag_scale m_scale = MAG_SCALE_4G);
00148         
00149         /** Read gyroscope data */
00150         void read_gyr();
00151         /** Read accelerometer data */
00152         void read_acc();
00153         /** Read magnetometer data */
00154         void read_mag();
00155         
00156         /** Gyroscope resolution [rad/s / bit] */
00157         float g_res;
00158         /** Accelerometer resolution [m/s^2 / bit] */
00159         float a_res;
00160         /** Magnetometers resolution [uT / bit] */
00161         float m_res;
00162         
00163 };
00164 
00165 #endif