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
Diff: MPU9250/MPU9250.h
- Revision:
- 2:3d5f4b1c7bdb
- Child:
- 3:2f2b8e863991
diff -r e34045b9cf93 -r 3d5f4b1c7bdb MPU9250/MPU9250.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPU9250/MPU9250.h Tue Apr 17 23:35:21 2018 +0000 @@ -0,0 +1,146 @@ +#ifndef MPU9250_h +#define MPU9250_h + +#include "mbed.h" + +// Physical constants +#define GRAVITY 9.80665 +#define PI 3.14159 + +// MPU9250 I2C address +#define MPU9250_ADDRESS 0b1101001 << 1 + +// 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 + +// Custom structure for storing multiple axis values +struct vector +{ + // Raw data provided by IMU (bits) + int16_t x_raw; + int16_t y_raw; + int16_t z_raw; + // SI data (accel: m/s^2 | mag: rad/s | mag: T) + float x; + float y; + float z; + // Resolution (accel: (m/s^2)/bit | mag: (rad/s)/bit | mag: T/bit) + float res; +}; + + +/** MPU9250 class + * + * Example code (print accelerometer and gyroscope readings every 1 second): + * @code + * #include "mbed.h" + * #include "USBSerial.h" + * #include "MPU9250.h" + * + * USBSerial pc; + * MPU9250 imu(PC_9,PA_8); + * + * int main() + * { + * imu.setup(); + * while(1) + * { + * imu.read(); + * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.a.x, imu.a.y, imu.a.z); + * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.g.x, imu.g.y, imu.g.z); + * wait(1); + * } + * } + * @endcode + */ +class MPU9250 +{ + public: + //! Accelerometer scales + enum accel_scale + { + ACCEL_SCALE_2G = 0b00, // +/- 2g + ACCEL_SCALE_4G = 0b01, // +/- 4g + ACCEL_SCALE_8G = 0b10, // +/- 8g + ACCEL_SCALE_16G = 0b11 // +/- 16g + }; + //! Gyroscope scales + enum gyro_scale + { + GYRO_SCALE_250DPS = 0b00, // +/- 250dps + GYRO_SCALE_500DPS = 0b01, // +/- 500dps + GYRO_SCALE_1000DPS = 0b10, // +/- 1000dps + GYRO_SCALE_2000DPS = 0b11 // +/- 2000dps + }; + /** MPU9250 class constructor + * Used for printing "Hello World" on USB serial. + * + * Example: + * @code + * #include "mbed.h" + * #include "USBSerial.h" + * #include "MPU9250.h" + * + * USBSerial pc; + * MPU9250 imu(PC_9,PA_8); + * + * int main() + * { + * imu.setup(); + * while(1) + * { + * imu.read(); + * pc.printf("Accel [m/s^2]: %6.2f %6.2f %6.2f \n", imu.a.x, imu.a.y, imu.a.z); + * pc.printf("Gyro [rad/s]: %6.2f %6.2f %6.2f \n\n", imu.g.x, imu.g.y, imu.g.z); + * wait(1); + * } + * } + * @endcode + */ + MPU9250(PinName sda, PinName scl); + //! Setup accelerometer, gyroscope and magnetometer + void setup(accel_scale a_scale = ACCEL_SCALE_16G, gyro_scale g_scale = GYRO_SCALE_500DPS); + //! Setup accelerometer + void setup_accel(accel_scale a_scale = ACCEL_SCALE_16G); + //! Setup gyroscope + void setup_gyro(gyro_scale g_scale = GYRO_SCALE_500DPS); + //! Setup magnetometer + void setup_mag(); + //! Read accelerometer, gyroscope and magnetometer output data + void read(); + //! Read accelerometer output data + void read_accel(); + //! Read accelerometer output data + void read_gyro(); + //! Read accelerometer output data + void read_mag(); + //! Accelerometer vector data + vector a; + //! Gyroscope vector data + vector g; + //! Magnetometer vector data + vector m; + private: + //! I2C bus + I2C i2c; +}; + +#endif \ No newline at end of file