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@3:2f2b8e863991, 2018-04-19 (annotated)
- Committer:
- fbob
- Date:
- Thu Apr 19 19:41:02 2018 +0000
- Revision:
- 3:2f2b8e863991
- Parent:
- 2:3d5f4b1c7bdb
- Child:
- 5:1ef8b91a0318
Included barometer class
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 | 3:2f2b8e863991 | 11 | #define MPU9250_ADDRESS 0b1101001 << 1 // Shift 1 bit left because mbed utilizes 8-bit addresses and not 7-bit |
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 | 3:2f2b8e863991 | 34 | // Auxiliary I2C configuration registers addresses |
fbob | 3:2f2b8e863991 | 35 | #define INT_PIN_CFG 0x37 |
fbob | 3:2f2b8e863991 | 36 | |
fbob | 3:2f2b8e863991 | 37 | // Accelerometer full-scale ranges |
fbob | 3:2f2b8e863991 | 38 | enum accel_scale |
fbob | 2:3d5f4b1c7bdb | 39 | { |
fbob | 3:2f2b8e863991 | 40 | ACCEL_SCALE_2G = 0b00, |
fbob | 3:2f2b8e863991 | 41 | ACCEL_SCALE_4G = 0b01, |
fbob | 3:2f2b8e863991 | 42 | ACCEL_SCALE_8G = 0b10, |
fbob | 3:2f2b8e863991 | 43 | ACCEL_SCALE_16G = 0b11 |
fbob | 3:2f2b8e863991 | 44 | }; |
fbob | 3:2f2b8e863991 | 45 | |
fbob | 3:2f2b8e863991 | 46 | // Gyroscope full-scale ranges |
fbob | 3:2f2b8e863991 | 47 | enum gyro_scale |
fbob | 3:2f2b8e863991 | 48 | { |
fbob | 3:2f2b8e863991 | 49 | GYRO_SCALE_250DPS = 0b00, |
fbob | 3:2f2b8e863991 | 50 | GYRO_SCALE_500DPS = 0b01, |
fbob | 3:2f2b8e863991 | 51 | GYRO_SCALE_1000DPS = 0b10, |
fbob | 3:2f2b8e863991 | 52 | GYRO_SCALE_2000DPS = 0b11 |
fbob | 2:3d5f4b1c7bdb | 53 | }; |
fbob | 2:3d5f4b1c7bdb | 54 | |
fbob | 2:3d5f4b1c7bdb | 55 | |
fbob | 3:2f2b8e863991 | 56 | /** MPU9250 (IMU sensor) class |
fbob | 2:3d5f4b1c7bdb | 57 | * |
fbob | 3:2f2b8e863991 | 58 | * Example code (print accelerometer and gyroscope data on serial port every 1 second): |
fbob | 2:3d5f4b1c7bdb | 59 | * @code |
fbob | 2:3d5f4b1c7bdb | 60 | * #include "mbed.h" |
fbob | 2:3d5f4b1c7bdb | 61 | * #include "USBSerial.h" |
fbob | 2:3d5f4b1c7bdb | 62 | * #include "MPU9250.h" |
fbob | 2:3d5f4b1c7bdb | 63 | * |
fbob | 2:3d5f4b1c7bdb | 64 | * USBSerial pc; |
fbob | 2:3d5f4b1c7bdb | 65 | * MPU9250 imu(PC_9,PA_8); |
fbob | 2:3d5f4b1c7bdb | 66 | * |
fbob | 2:3d5f4b1c7bdb | 67 | * int main() |
fbob | 2:3d5f4b1c7bdb | 68 | * { |
fbob | 3:2f2b8e863991 | 69 | * imu.init(); |
fbob | 2:3d5f4b1c7bdb | 70 | * while(1) |
fbob | 2:3d5f4b1c7bdb | 71 | * { |
fbob | 2:3d5f4b1c7bdb | 72 | * imu.read(); |
fbob | 3:2f2b8e863991 | 73 | * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.ax, imu.ay, imu.az); |
fbob | 3:2f2b8e863991 | 74 | * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.gx, imu.gy, imu.gz); |
fbob | 2:3d5f4b1c7bdb | 75 | * wait(1); |
fbob | 2:3d5f4b1c7bdb | 76 | * } |
fbob | 2:3d5f4b1c7bdb | 77 | * } |
fbob | 2:3d5f4b1c7bdb | 78 | * @endcode |
fbob | 3:2f2b8e863991 | 79 | * (Need to target to NUCLEO-F401RE board platform) |
fbob | 2:3d5f4b1c7bdb | 80 | */ |
fbob | 2:3d5f4b1c7bdb | 81 | class MPU9250 |
fbob | 2:3d5f4b1c7bdb | 82 | { |
fbob | 2:3d5f4b1c7bdb | 83 | public: |
fbob | 3:2f2b8e863991 | 84 | /** Class constructor */ |
fbob | 2:3d5f4b1c7bdb | 85 | MPU9250(PinName sda, PinName scl); |
fbob | 3:2f2b8e863991 | 86 | |
fbob | 3:2f2b8e863991 | 87 | /** Initialize accelerometer and gyroscope */ |
fbob | 3:2f2b8e863991 | 88 | void init(); |
fbob | 3:2f2b8e863991 | 89 | /** Read accelerometer and gyroscope */ |
fbob | 3:2f2b8e863991 | 90 | void read(); |
fbob | 3:2f2b8e863991 | 91 | |
fbob | 3:2f2b8e863991 | 92 | /** Accelerometer data in x-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 93 | float ax; |
fbob | 3:2f2b8e863991 | 94 | /** Accelerometer data in y-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 95 | float ay; |
fbob | 3:2f2b8e863991 | 96 | /** Accelerometer data in z-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 97 | float az; |
fbob | 3:2f2b8e863991 | 98 | /** Gyroscope data in x-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 99 | float gx; |
fbob | 3:2f2b8e863991 | 100 | /** Gyroscope data in y-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 101 | float gy; |
fbob | 3:2f2b8e863991 | 102 | /** Gyroscope data in z-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 103 | float gz; |
fbob | 3:2f2b8e863991 | 104 | private: |
fbob | 3:2f2b8e863991 | 105 | /** I2C bus */ |
fbob | 3:2f2b8e863991 | 106 | I2C i2c; |
fbob | 3:2f2b8e863991 | 107 | |
fbob | 3:2f2b8e863991 | 108 | /** Setup auxiliary I2C */ |
fbob | 3:2f2b8e863991 | 109 | void setup_aux_i2c(); |
fbob | 3:2f2b8e863991 | 110 | |
fbob | 3:2f2b8e863991 | 111 | /** Setup accelerometer with given output data rate and full-scale range*/ |
fbob | 2:3d5f4b1c7bdb | 112 | void setup_accel(accel_scale a_scale = ACCEL_SCALE_16G); |
fbob | 3:2f2b8e863991 | 113 | /** Setup gyroscope with given output data rate and full-scale range*/ |
fbob | 2:3d5f4b1c7bdb | 114 | void setup_gyro(gyro_scale g_scale = GYRO_SCALE_500DPS); |
fbob | 3:2f2b8e863991 | 115 | /** Read accelerometer output data */ |
fbob | 2:3d5f4b1c7bdb | 116 | void read_accel(); |
fbob | 3:2f2b8e863991 | 117 | /** Read accelerometer output data */ |
fbob | 2:3d5f4b1c7bdb | 118 | void read_gyro(); |
fbob | 3:2f2b8e863991 | 119 | |
fbob | 3:2f2b8e863991 | 120 | /** Accelerometer resolution [m/s^2 / bit]*/ |
fbob | 3:2f2b8e863991 | 121 | float a_res; |
fbob | 3:2f2b8e863991 | 122 | /** Gyroscope resolution [rad/s / bit]*/ |
fbob | 3:2f2b8e863991 | 123 | float g_res; |
fbob | 2:3d5f4b1c7bdb | 124 | }; |
fbob | 2:3d5f4b1c7bdb | 125 | |
fbob | 2:3d5f4b1c7bdb | 126 | #endif |