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

Committer:
fbob
Date:
Tue Apr 17 23:35:21 2018 +0000
Revision:
2:3d5f4b1c7bdb
Child:
3:2f2b8e863991
Updated name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fbob 2:3d5f4b1c7bdb 1 #ifndef MPU9250_h
fbob 2:3d5f4b1c7bdb 2 #define MPU9250_h
fbob 2:3d5f4b1c7bdb 3
fbob 2:3d5f4b1c7bdb 4 #include "mbed.h"
fbob 2:3d5f4b1c7bdb 5
fbob 2:3d5f4b1c7bdb 6 // Physical constants
fbob 2:3d5f4b1c7bdb 7 #define GRAVITY 9.80665
fbob 2:3d5f4b1c7bdb 8 #define PI 3.14159
fbob 2:3d5f4b1c7bdb 9
fbob 2:3d5f4b1c7bdb 10 // MPU9250 I2C address
fbob 2:3d5f4b1c7bdb 11 #define MPU9250_ADDRESS 0b1101001 << 1
fbob 2:3d5f4b1c7bdb 12
fbob 2:3d5f4b1c7bdb 13 // Accelerometer configuration registers addresses
fbob 2:3d5f4b1c7bdb 14 #define ACCEL_CONFIG_1 0x1C
fbob 2:3d5f4b1c7bdb 15 #define ACCEL_CONFIG_2 0x1D
fbob 2:3d5f4b1c7bdb 16 // Accelerometer output register addresses
fbob 2:3d5f4b1c7bdb 17 #define ACCEL_XOUT_H 0x3B
fbob 2:3d5f4b1c7bdb 18 #define ACCEL_XOUT_L 0x3C
fbob 2:3d5f4b1c7bdb 19 #define ACCEL_YOUT_H 0x3D
fbob 2:3d5f4b1c7bdb 20 #define ACCEL_YOUT_L 0x3E
fbob 2:3d5f4b1c7bdb 21 #define ACCEL_ZOUT_H 0x3F
fbob 2:3d5f4b1c7bdb 22 #define ACCEL_ZOUT_L 0x40
fbob 2:3d5f4b1c7bdb 23
fbob 2:3d5f4b1c7bdb 24 // Gyroscope configuration registers addresses
fbob 2:3d5f4b1c7bdb 25 #define GYRO_CONFIG 0x1B
fbob 2:3d5f4b1c7bdb 26 // Accelerometer output register addresses
fbob 2:3d5f4b1c7bdb 27 #define GYRO_XOUT_H 0x43
fbob 2:3d5f4b1c7bdb 28 #define GYRO_XOUT_L 0x44
fbob 2:3d5f4b1c7bdb 29 #define GYRO_YOUT_H 0x45
fbob 2:3d5f4b1c7bdb 30 #define GYRO_YOUT_L 0x46
fbob 2:3d5f4b1c7bdb 31 #define GYRO_ZOUT_H 0x47
fbob 2:3d5f4b1c7bdb 32 #define GYRO_ZOUT_L 0x48
fbob 2:3d5f4b1c7bdb 33
fbob 2:3d5f4b1c7bdb 34 // Custom structure for storing multiple axis values
fbob 2:3d5f4b1c7bdb 35 struct vector
fbob 2:3d5f4b1c7bdb 36 {
fbob 2:3d5f4b1c7bdb 37 // Raw data provided by IMU (bits)
fbob 2:3d5f4b1c7bdb 38 int16_t x_raw;
fbob 2:3d5f4b1c7bdb 39 int16_t y_raw;
fbob 2:3d5f4b1c7bdb 40 int16_t z_raw;
fbob 2:3d5f4b1c7bdb 41 // SI data (accel: m/s^2 | mag: rad/s | mag: T)
fbob 2:3d5f4b1c7bdb 42 float x;
fbob 2:3d5f4b1c7bdb 43 float y;
fbob 2:3d5f4b1c7bdb 44 float z;
fbob 2:3d5f4b1c7bdb 45 // Resolution (accel: (m/s^2)/bit | mag: (rad/s)/bit | mag: T/bit)
fbob 2:3d5f4b1c7bdb 46 float res;
fbob 2:3d5f4b1c7bdb 47 };
fbob 2:3d5f4b1c7bdb 48
fbob 2:3d5f4b1c7bdb 49
fbob 2:3d5f4b1c7bdb 50 /** MPU9250 class
fbob 2:3d5f4b1c7bdb 51 *
fbob 2:3d5f4b1c7bdb 52 * Example code (print accelerometer and gyroscope readings every 1 second):
fbob 2:3d5f4b1c7bdb 53 * @code
fbob 2:3d5f4b1c7bdb 54 * #include "mbed.h"
fbob 2:3d5f4b1c7bdb 55 * #include "USBSerial.h"
fbob 2:3d5f4b1c7bdb 56 * #include "MPU9250.h"
fbob 2:3d5f4b1c7bdb 57 *
fbob 2:3d5f4b1c7bdb 58 * USBSerial pc;
fbob 2:3d5f4b1c7bdb 59 * MPU9250 imu(PC_9,PA_8);
fbob 2:3d5f4b1c7bdb 60 *
fbob 2:3d5f4b1c7bdb 61 * int main()
fbob 2:3d5f4b1c7bdb 62 * {
fbob 2:3d5f4b1c7bdb 63 * imu.setup();
fbob 2:3d5f4b1c7bdb 64 * while(1)
fbob 2:3d5f4b1c7bdb 65 * {
fbob 2:3d5f4b1c7bdb 66 * imu.read();
fbob 2:3d5f4b1c7bdb 67 * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.a.x, imu.a.y, imu.a.z);
fbob 2:3d5f4b1c7bdb 68 * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.g.x, imu.g.y, imu.g.z);
fbob 2:3d5f4b1c7bdb 69 * wait(1);
fbob 2:3d5f4b1c7bdb 70 * }
fbob 2:3d5f4b1c7bdb 71 * }
fbob 2:3d5f4b1c7bdb 72 * @endcode
fbob 2:3d5f4b1c7bdb 73 */
fbob 2:3d5f4b1c7bdb 74 class MPU9250
fbob 2:3d5f4b1c7bdb 75 {
fbob 2:3d5f4b1c7bdb 76 public:
fbob 2:3d5f4b1c7bdb 77 //! Accelerometer scales
fbob 2:3d5f4b1c7bdb 78 enum accel_scale
fbob 2:3d5f4b1c7bdb 79 {
fbob 2:3d5f4b1c7bdb 80 ACCEL_SCALE_2G = 0b00, // +/- 2g
fbob 2:3d5f4b1c7bdb 81 ACCEL_SCALE_4G = 0b01, // +/- 4g
fbob 2:3d5f4b1c7bdb 82 ACCEL_SCALE_8G = 0b10, // +/- 8g
fbob 2:3d5f4b1c7bdb 83 ACCEL_SCALE_16G = 0b11 // +/- 16g
fbob 2:3d5f4b1c7bdb 84 };
fbob 2:3d5f4b1c7bdb 85 //! Gyroscope scales
fbob 2:3d5f4b1c7bdb 86 enum gyro_scale
fbob 2:3d5f4b1c7bdb 87 {
fbob 2:3d5f4b1c7bdb 88 GYRO_SCALE_250DPS = 0b00, // +/- 250dps
fbob 2:3d5f4b1c7bdb 89 GYRO_SCALE_500DPS = 0b01, // +/- 500dps
fbob 2:3d5f4b1c7bdb 90 GYRO_SCALE_1000DPS = 0b10, // +/- 1000dps
fbob 2:3d5f4b1c7bdb 91 GYRO_SCALE_2000DPS = 0b11 // +/- 2000dps
fbob 2:3d5f4b1c7bdb 92 };
fbob 2:3d5f4b1c7bdb 93 /** MPU9250 class constructor
fbob 2:3d5f4b1c7bdb 94 * Used for printing "Hello World" on USB serial.
fbob 2:3d5f4b1c7bdb 95 *
fbob 2:3d5f4b1c7bdb 96 * Example:
fbob 2:3d5f4b1c7bdb 97 * @code
fbob 2:3d5f4b1c7bdb 98 * #include "mbed.h"
fbob 2:3d5f4b1c7bdb 99 * #include "USBSerial.h"
fbob 2:3d5f4b1c7bdb 100 * #include "MPU9250.h"
fbob 2:3d5f4b1c7bdb 101 *
fbob 2:3d5f4b1c7bdb 102 * USBSerial pc;
fbob 2:3d5f4b1c7bdb 103 * MPU9250 imu(PC_9,PA_8);
fbob 2:3d5f4b1c7bdb 104 *
fbob 2:3d5f4b1c7bdb 105 * int main()
fbob 2:3d5f4b1c7bdb 106 * {
fbob 2:3d5f4b1c7bdb 107 * imu.setup();
fbob 2:3d5f4b1c7bdb 108 * while(1)
fbob 2:3d5f4b1c7bdb 109 * {
fbob 2:3d5f4b1c7bdb 110 * imu.read();
fbob 2:3d5f4b1c7bdb 111 * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.a.x, imu.a.y, imu.a.z);
fbob 2:3d5f4b1c7bdb 112 * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.g.x, imu.g.y, imu.g.z);
fbob 2:3d5f4b1c7bdb 113 * wait(1);
fbob 2:3d5f4b1c7bdb 114 * }
fbob 2:3d5f4b1c7bdb 115 * }
fbob 2:3d5f4b1c7bdb 116 * @endcode
fbob 2:3d5f4b1c7bdb 117 */
fbob 2:3d5f4b1c7bdb 118 MPU9250(PinName sda, PinName scl);
fbob 2:3d5f4b1c7bdb 119 //! Setup accelerometer, gyroscope and magnetometer
fbob 2:3d5f4b1c7bdb 120 void setup(accel_scale a_scale = ACCEL_SCALE_16G, gyro_scale g_scale = GYRO_SCALE_500DPS);
fbob 2:3d5f4b1c7bdb 121 //! Setup accelerometer
fbob 2:3d5f4b1c7bdb 122 void setup_accel(accel_scale a_scale = ACCEL_SCALE_16G);
fbob 2:3d5f4b1c7bdb 123 //! Setup gyroscope
fbob 2:3d5f4b1c7bdb 124 void setup_gyro(gyro_scale g_scale = GYRO_SCALE_500DPS);
fbob 2:3d5f4b1c7bdb 125 //! Setup magnetometer
fbob 2:3d5f4b1c7bdb 126 void setup_mag();
fbob 2:3d5f4b1c7bdb 127 //! Read accelerometer, gyroscope and magnetometer output data
fbob 2:3d5f4b1c7bdb 128 void read();
fbob 2:3d5f4b1c7bdb 129 //! Read accelerometer output data
fbob 2:3d5f4b1c7bdb 130 void read_accel();
fbob 2:3d5f4b1c7bdb 131 //! Read accelerometer output data
fbob 2:3d5f4b1c7bdb 132 void read_gyro();
fbob 2:3d5f4b1c7bdb 133 //! Read accelerometer output data
fbob 2:3d5f4b1c7bdb 134 void read_mag();
fbob 2:3d5f4b1c7bdb 135 //! Accelerometer vector data
fbob 2:3d5f4b1c7bdb 136 vector a;
fbob 2:3d5f4b1c7bdb 137 //! Gyroscope vector data
fbob 2:3d5f4b1c7bdb 138 vector g;
fbob 2:3d5f4b1c7bdb 139 //! Magnetometer vector data
fbob 2:3d5f4b1c7bdb 140 vector m;
fbob 2:3d5f4b1c7bdb 141 private:
fbob 2:3d5f4b1c7bdb 142 //! I2C bus
fbob 2:3d5f4b1c7bdb 143 I2C i2c;
fbob 2:3d5f4b1c7bdb 144 };
fbob 2:3d5f4b1c7bdb 145
fbob 2:3d5f4b1c7bdb 146 #endif