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.cpp
- Committer:
- fbob
- Date:
- 2018-04-17
- Revision:
- 2:3d5f4b1c7bdb
- Parent:
- MPU9250.cpp@ 0:3d8a882699ef
- Child:
- 3:2f2b8e863991
File content as of revision 2:3d5f4b1c7bdb:
#include "MPU9250.h" // Class constructor MPU9250::MPU9250(PinName sda, PinName scl) : i2c(sda, scl) { // } // Setup accelerometer, gyroscope and magnetometer void MPU9250::setup(accel_scale a_scale, gyro_scale g_scale) { setup_accel(a_scale); setup_gyro(g_scale); } // Setup accelerometer void MPU9250::setup_accel(accel_scale a_scale) { // MPU9250 I2C address char address = MPU9250_ADDRESS; // Register address and data that we're going to write char reg_data[2] = {ACCEL_CONFIG_1, 0b000 | a_scale << 3 | 0b000}; // Point to register address and write data into this address i2c.write(address, reg_data, 2); // Adjust resolution (m/s^2) accordingly to chosed scale (g) switch (a_scale) { case ACCEL_SCALE_2G: a.res = (2.0/32768.0)*GRAVITY; break; case ACCEL_SCALE_4G: a.res = (4.0/32768.0)*GRAVITY; break; case ACCEL_SCALE_8G: a.res = (8.0/32768.0)*GRAVITY; break; case ACCEL_SCALE_16G: a.res = (16.0/32768.0)*GRAVITY; break; } } // Setup gyroscope void MPU9250::setup_gyro(gyro_scale g_scale) { // MPU9250 I2C address char address = MPU9250_ADDRESS; // Register address and data that we're going to write char reg_data[2] = {GYRO_CONFIG, 0b000 | g_scale << 3 | 0b000}; // Point to register address and write data into this address i2c.write(address, reg_data, 2); // Adjust resolution (rad/s) accordingly to chosed scale (º/s) switch (g_scale) { case GYRO_SCALE_250DPS: g.res = (250.0/32768.0)*(PI/180); break; case GYRO_SCALE_500DPS: g.res = (500.0/32768.0)*(PI/180); break; case GYRO_SCALE_1000DPS: g.res = (1000.0/32768.0)*(PI/180); break; case GYRO_SCALE_2000DPS: g.res = (2000.0/32768.0)*(PI/180); break; } } // Read accelerometer, gyroscope and magnetometer output data void MPU9250::read() { read_accel(); read_gyro(); } // Read accelerometer output data void MPU9250::read_accel() { // MPU9250 I2C address char address = MPU9250_ADDRESS; // Register address char reg[1] = {ACCEL_XOUT_H}; // Data that we're going to read char data[6]; // Point to register address i2c.write(address, reg, 1); // Read data from this address (register address will auto-increment and all three axis information (two 8 bit data each) will be read) i2c.read(address, data, 6); // Reassemble the data (two 8 bit data into one 16 bit data) a.x_raw = (data[0] << 8 ) | data[1]; a.y_raw = (data[2] << 8 ) | data[3]; a.z_raw = (data[4] << 8 ) | data[5]; // Convert to SI units a.x = a.x_raw * a.res; a.y = a.y_raw * a.res; a.z = a.z_raw * a.res; } // Read gyroscope output data void MPU9250::read_gyro() { // MPU9250 I2C address char address = MPU9250_ADDRESS; // Register address char reg[1] = {GYRO_XOUT_H}; // Data that we're going to read char data[6]; // Point to register address i2c.write(address, reg, 1); // Read data from this address (register address will auto-increment and all three axis information (two 8 bit data each) will be read) i2c.read(address, data, 6); // Reassemble the data (two 8 bit data into one 16 bit data) g.x_raw = (data[0] << 8 ) | data[1]; g.y_raw = (data[2] << 8 ) | data[3]; g.z_raw = (data[4] << 8 ) | data[5]; // Convert to SI units g.x = g.x_raw * g.res; g.y = g.y_raw * g.res; g.z = g.z_raw * g.res; }