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@5:1ef8b91a0318, 2018-05-04 (annotated)
- Committer:
- fbob
- Date:
- Fri May 04 23:03:00 2018 +0000
- Revision:
- 5:1ef8b91a0318
- Parent:
- 3:2f2b8e863991
Started building PMW3901 library
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 | 5:1ef8b91a0318 | 7 | #define GRAVITY 9.80665f |
fbob | 5:1ef8b91a0318 | 8 | #define PI 3.14159f |
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 | 3:2f2b8e863991 | 55 | /** MPU9250 (IMU sensor) class |
fbob | 2:3d5f4b1c7bdb | 56 | * |
fbob | 3:2f2b8e863991 | 57 | * Example code (print accelerometer and gyroscope data on serial port every 1 second): |
fbob | 2:3d5f4b1c7bdb | 58 | * @code |
fbob | 2:3d5f4b1c7bdb | 59 | * #include "mbed.h" |
fbob | 2:3d5f4b1c7bdb | 60 | * #include "USBSerial.h" |
fbob | 2:3d5f4b1c7bdb | 61 | * #include "MPU9250.h" |
fbob | 2:3d5f4b1c7bdb | 62 | * |
fbob | 2:3d5f4b1c7bdb | 63 | * USBSerial pc; |
fbob | 2:3d5f4b1c7bdb | 64 | * MPU9250 imu(PC_9,PA_8); |
fbob | 2:3d5f4b1c7bdb | 65 | * |
fbob | 2:3d5f4b1c7bdb | 66 | * int main() |
fbob | 2:3d5f4b1c7bdb | 67 | * { |
fbob | 3:2f2b8e863991 | 68 | * imu.init(); |
fbob | 2:3d5f4b1c7bdb | 69 | * while(1) |
fbob | 2:3d5f4b1c7bdb | 70 | * { |
fbob | 2:3d5f4b1c7bdb | 71 | * imu.read(); |
fbob | 3:2f2b8e863991 | 72 | * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.ax, imu.ay, imu.az); |
fbob | 3:2f2b8e863991 | 73 | * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.gx, imu.gy, imu.gz); |
fbob | 2:3d5f4b1c7bdb | 74 | * wait(1); |
fbob | 2:3d5f4b1c7bdb | 75 | * } |
fbob | 2:3d5f4b1c7bdb | 76 | * } |
fbob | 2:3d5f4b1c7bdb | 77 | * @endcode |
fbob | 3:2f2b8e863991 | 78 | * (Need to target to NUCLEO-F401RE board platform) |
fbob | 2:3d5f4b1c7bdb | 79 | */ |
fbob | 2:3d5f4b1c7bdb | 80 | class MPU9250 |
fbob | 2:3d5f4b1c7bdb | 81 | { |
fbob | 2:3d5f4b1c7bdb | 82 | public: |
fbob | 3:2f2b8e863991 | 83 | /** Class constructor */ |
fbob | 2:3d5f4b1c7bdb | 84 | MPU9250(PinName sda, PinName scl); |
fbob | 3:2f2b8e863991 | 85 | |
fbob | 3:2f2b8e863991 | 86 | /** Initialize accelerometer and gyroscope */ |
fbob | 3:2f2b8e863991 | 87 | void init(); |
fbob | 3:2f2b8e863991 | 88 | /** Read accelerometer and gyroscope */ |
fbob | 3:2f2b8e863991 | 89 | void read(); |
fbob | 3:2f2b8e863991 | 90 | |
fbob | 3:2f2b8e863991 | 91 | /** Accelerometer data in x-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 92 | float ax; |
fbob | 3:2f2b8e863991 | 93 | /** Accelerometer data in y-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 94 | float ay; |
fbob | 3:2f2b8e863991 | 95 | /** Accelerometer data in z-axis [m/s^2]*/ |
fbob | 3:2f2b8e863991 | 96 | float az; |
fbob | 3:2f2b8e863991 | 97 | /** Gyroscope data in x-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 98 | float gx; |
fbob | 3:2f2b8e863991 | 99 | /** Gyroscope data in y-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 100 | float gy; |
fbob | 3:2f2b8e863991 | 101 | /** Gyroscope data in z-axis [rad/s]*/ |
fbob | 3:2f2b8e863991 | 102 | float gz; |
fbob | 3:2f2b8e863991 | 103 | private: |
fbob | 3:2f2b8e863991 | 104 | /** I2C bus */ |
fbob | 3:2f2b8e863991 | 105 | I2C i2c; |
fbob | 3:2f2b8e863991 | 106 | |
fbob | 3:2f2b8e863991 | 107 | /** Setup auxiliary I2C */ |
fbob | 3:2f2b8e863991 | 108 | void setup_aux_i2c(); |
fbob | 3:2f2b8e863991 | 109 | |
fbob | 3:2f2b8e863991 | 110 | /** Setup accelerometer with given output data rate and full-scale range*/ |
fbob | 2:3d5f4b1c7bdb | 111 | void setup_accel(accel_scale a_scale = ACCEL_SCALE_16G); |
fbob | 3:2f2b8e863991 | 112 | /** Setup gyroscope with given output data rate and full-scale range*/ |
fbob | 2:3d5f4b1c7bdb | 113 | void setup_gyro(gyro_scale g_scale = GYRO_SCALE_500DPS); |
fbob | 3:2f2b8e863991 | 114 | /** Read accelerometer output data */ |
fbob | 2:3d5f4b1c7bdb | 115 | void read_accel(); |
fbob | 3:2f2b8e863991 | 116 | /** Read accelerometer output data */ |
fbob | 2:3d5f4b1c7bdb | 117 | void read_gyro(); |
fbob | 3:2f2b8e863991 | 118 | |
fbob | 3:2f2b8e863991 | 119 | /** Accelerometer resolution [m/s^2 / bit]*/ |
fbob | 3:2f2b8e863991 | 120 | float a_res; |
fbob | 3:2f2b8e863991 | 121 | /** Gyroscope resolution [rad/s / bit]*/ |
fbob | 3:2f2b8e863991 | 122 | float g_res; |
fbob | 2:3d5f4b1c7bdb | 123 | }; |
fbob | 2:3d5f4b1c7bdb | 124 | |
fbob | 2:3d5f4b1c7bdb | 125 | #endif |