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
MPU9250/MPU9250.h@2:3d5f4b1c7bdb, 2018-04-17 (annotated)
- 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?
User | Revision | Line number | New 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 |