Library containing Crazyflie 2.0 sensors drivers: - LPS25H (barometer) - MPU9250 (IMU) - PMW3901 (optical flow) - VL53L0X (range)

Dependents:   Drones-Controlador controladoatitude_cteste Drone_Controlador_Atitude optical_test

Revision:
8:930aa9d0f5ae
Child:
12:2bbe233d25fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPU9250/MPU9250.h	Mon May 14 20:18:20 2018 +0000
@@ -0,0 +1,145 @@
+#ifndef MPU9250_h
+#define MPU9250_h
+
+#include "mbed.h"
+
+// Physical constants
+#define GRAVITY 9.80665f
+#define PI 3.14159f
+
+// MPU9250 I2C bus address
+#define MPU9250_ADDRESS 0b1101001 << 1  // Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit
+
+// Device identity  
+#define WHO_AM_I 0x75
+
+// Accelerometer configuration registers addresses
+#define ACCEL_CONFIG_1 0x1C
+#define ACCEL_CONFIG_2 0x1D
+// Accelerometer output register addresses
+#define ACCEL_XOUT_H 0x3B
+#define ACCEL_XOUT_L 0x3C
+#define ACCEL_YOUT_H 0x3D
+#define ACCEL_YOUT_L 0x3E
+#define ACCEL_ZOUT_H 0x3F
+#define ACCEL_ZOUT_L 0x40
+
+// Gyroscope configuration registers addresses
+#define GYRO_CONFIG 0x1B
+// Accelerometer output register addresses
+#define GYRO_XOUT_H 0x43
+#define GYRO_XOUT_L 0x44
+#define GYRO_YOUT_H 0x45
+#define GYRO_YOUT_L 0x46
+#define GYRO_ZOUT_H 0x47
+#define GYRO_ZOUT_L 0x48
+
+// Auxiliary I2C configuration registers addresses
+#define INT_PIN_CFG 0x37
+
+// Accelerometer full-scale ranges
+enum accel_scale
+{
+    ACCEL_SCALE_2G = 0b00, 
+    ACCEL_SCALE_4G = 0b01,
+    ACCEL_SCALE_8G = 0b10, 
+    ACCEL_SCALE_16G = 0b11 
+};
+
+// Gyroscope full-scale ranges
+enum gyro_scale
+{
+    GYRO_SCALE_250DPS = 0b00,   
+    GYRO_SCALE_500DPS = 0b01,  
+    GYRO_SCALE_1000DPS = 0b10,  
+    GYRO_SCALE_2000DPS = 0b11 
+};
+
+/** MPU9250 (IMU sensor) class
+ *
+ * Example code (print accelerometer and gyroscope data on serial port every 0.2 seconds):
+ * @code
+ * #include "mbed.h"
+ * #include "USBSerial.h"
+ * #include "MPU9250.h"
+ *
+ * USBSerial pc;
+ * MPU9250 imu(PC_9,PA_8);
+ * 
+ * int main() 
+ * {
+ *     if(!imu.init())
+ *     {
+ *          pc.printf("Failed to detect and initialize IMU on I2C bus!");    
+ *          while(1);
+ *     }
+ *     while(1)
+ *     {
+ *          imu.read();
+ *          pc.printf("Accel  [m/s^2]: %6.2f %6.2f %6.2f \n", imu.ax, imu.ay, imu.az);
+ *          pc.printf("Gyro   [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.gx, imu.gy, imu.gz);
+ *          wait(0.2);
+ *     }
+ * }
+ * @endcode
+ * (Need to target to NUCLEO-F401RE board platform)
+ */
+class MPU9250
+{
+    public:
+        /** Class constructor */
+        MPU9250(PinName sda, PinName scl);
+        
+        /** Initialize sensor */
+        bool init();
+        /** Read sensor data */
+        void read();
+        
+        uint8_t bob();
+        
+        /** Accelerometer data in x-axis [m/s^2]*/
+        float ax;
+        /** Accelerometer data in y-axis [m/s^2]*/
+        float ay;
+        /** Accelerometer data in z-axis [m/s^2]*/
+        float az;
+        /** Gyroscope data in x-axis [rad/s]*/
+        float gx;
+        /** Gyroscope data in y-axis [rad/s]*/
+        float gy;
+        /** Gyroscope data in z-axis [rad/s]*/
+        float gz;
+    private:
+        /** I2C bus */
+        I2C i2c;
+        
+        /** Setup I2C bus */
+        void setup_i2c();
+        /** Test I2C bus */
+        bool test_i2c();
+        
+        /** Setup auxiliary I2C bus pins */
+        void setup_aux_i2c();
+        
+        /** Setup accelerometer configurations (full-scale range) */
+        void setup_accel(accel_scale a_scale = ACCEL_SCALE_16G);
+        /** Setup gyroscope  configurations (full-scale range) */
+        void setup_gyro(gyro_scale g_scale = GYRO_SCALE_500DPS);
+        /** Read accelerometer data */
+        void read_accel();
+        /** Read gyroscope data */
+        void read_gyro();
+        
+        /** Write data into register on MPU9250 I2C bus address */
+        void write_reg(uint8_t reg, uint8_t data);
+        /** Read data from register on MPU9250 I2C bus address */
+        char read_reg(uint8_t reg);
+        
+        /** Accelerometer resolution [m/s^2 / bit]*/
+        float a_res;
+        /** Gyroscope resolution [rad/s / bit]*/
+        float g_res;
+        
+};
+
+#endif
\ No newline at end of file