-
-
Save anonymous/7d8aea9a0834b630a91feded3e1f9bbf to your computer and use it in GitHub Desktop.
MPU9250.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef MPU9250_h | |
#define MPU9250_h | |
#include "Arduino.h" | |
#include "SPI.h" // SPI library | |
enum mpu9250_gyro_range | |
{ | |
GYRO_RANGE_250DPS, | |
GYRO_RANGE_500DPS, | |
GYRO_RANGE_1000DPS, | |
GYRO_RANGE_2000DPS | |
}; | |
enum mpu9250_accel_range | |
{ | |
ACCEL_RANGE_2G, | |
ACCEL_RANGE_4G, | |
ACCEL_RANGE_8G, | |
ACCEL_RANGE_16G | |
}; | |
enum mpu9250_dlpf_bandwidth | |
{ | |
DLPF_BANDWIDTH_184HZ, | |
DLPF_BANDWIDTH_92HZ, | |
DLPF_BANDWIDTH_41HZ, | |
DLPF_BANDWIDTH_20HZ, | |
DLPF_BANDWIDTH_10HZ, | |
DLPF_BANDWIDTH_5HZ | |
}; | |
class MPU9250{ | |
public: | |
MPU9250(uint8_t csPin); | |
MPU9250(uint8_t csPin, SPIClass *Spi); | |
int begin(mpu9250_accel_range accelRange, mpu9250_gyro_range gyroRange); | |
int setFilt(mpu9250_dlpf_bandwidth bandwidth, uint8_t SRD); | |
int enableInt(bool enable); | |
void getAccel(float* ax, float* ay, float* az); | |
void getGyro(float* gx, float* gy, float* gz); | |
void getMag(float* hx, float* hy, float* hz); | |
void getTemp(float *t); | |
void getMotion6(float* ax, float* ay, float* az, float* gx, float* gy, float* gz); | |
void getMotion7(float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* t); | |
void getMotion9(float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* hx, float* hy, float* hz); | |
void getMotion10(float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* hx, float* hy, float* hz, float* t); | |
void getAccelCounts(int16_t* ax, int16_t* ay, int16_t* az); | |
void getGyroCounts(int16_t* gx, int16_t* gy, int16_t* gz); | |
void getMagCounts(int16_t* hx, int16_t* hy, int16_t* hz); | |
void getTempCounts(int16_t* t); | |
void getMotion6Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz); | |
void getMotion7Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* t); | |
void getMotion9Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* hx, int16_t* hy, int16_t* hz); | |
void getMotion10Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* hx, int16_t* hy, int16_t* hz, int16_t* t); | |
private: | |
uint8_t _csPin; | |
SPIClass *_spi; | |
bool _useSPIHS; | |
float _accelScale; | |
float _gyroScale; | |
float _magScaleX, _magScaleY, _magScaleZ; | |
const float _tempScale = 333.87f; | |
const float _tempOffset = 21.0f; | |
const uint8_t SPI_READ = 0x80; | |
const uint32_t SPI_LS_CLOCK = 1000000; // 1 MHz | |
const uint32_t SPI_HS_CLOCK = 20000000; // 20 MHz | |
// constants | |
const float G = 9.807f; | |
const float _d2r = 3.14159265359f/180.0f; | |
// MPU9250 registers | |
const uint8_t ACCEL_OUT = 0x3B; | |
const uint8_t GYRO_OUT = 0x43; | |
const uint8_t TEMP_OUT = 0x41; | |
const uint8_t EXT_SENS_DATA_00 = 0x49; | |
const uint8_t ACCEL_CONFIG = 0x1C; | |
const uint8_t ACCEL_FS_SEL_2G = 0x00; | |
const uint8_t ACCEL_FS_SEL_4G = 0x08; | |
const uint8_t ACCEL_FS_SEL_8G = 0x10; | |
const uint8_t ACCEL_FS_SEL_16G = 0x18; | |
const uint8_t GYRO_CONFIG = 0x1B; | |
const uint8_t GYRO_FS_SEL_250DPS = 0x00; | |
const uint8_t GYRO_FS_SEL_500DPS = 0x08; | |
const uint8_t GYRO_FS_SEL_1000DPS = 0x10; | |
const uint8_t GYRO_FS_SEL_2000DPS = 0x18; | |
const uint8_t ACCEL_CONFIG2 = 0x1D; | |
const uint8_t ACCEL_DLPF_184 = 0x01; | |
const uint8_t ACCEL_DLPF_92 = 0x02; | |
const uint8_t ACCEL_DLPF_41 = 0x03; | |
const uint8_t ACCEL_DLPF_20 = 0x04; | |
const uint8_t ACCEL_DLPF_10 = 0x05; | |
const uint8_t ACCEL_DLPF_5 = 0x06; | |
const uint8_t CONFIG = 0x1A; | |
const uint8_t GYRO_DLPF_184 = 0x01; | |
const uint8_t GYRO_DLPF_92 = 0x02; | |
const uint8_t GYRO_DLPF_41 = 0x03; | |
const uint8_t GYRO_DLPF_20 = 0x04; | |
const uint8_t GYRO_DLPF_10 = 0x05; | |
const uint8_t GYRO_DLPF_5 = 0x06; | |
const uint8_t SMPDIV = 0x19; | |
const uint8_t INT_PIN_CFG = 0x37; | |
const uint8_t INT_ENABLE = 0x38; | |
const uint8_t INT_DISABLE = 0x00; | |
const uint8_t INT_PULSE_50US = 0x00; | |
const uint8_t INT_RAW_RDY_EN = 0x01; | |
const uint8_t PWR_MGMNT_1 = 0x6B; | |
const uint8_t PWR_RESET = 0x80; | |
const uint8_t CLOCK_SEL_PLL = 0x01; | |
const uint8_t PWR_MGMNT_2 = 0x6C; | |
const uint8_t SEN_ENABLE = 0x00; | |
const uint8_t USER_CTRL = 0x6A; | |
const uint8_t WHO_AM_I = 0x75; | |
// transformation matrix | |
/* transform the accel and gyro axes to match the magnetometer axes */ | |
const int16_t tX[3] = {0, 1, 0}; | |
const int16_t tY[3] = {1, 0, 0}; | |
const int16_t tZ[3] = {0, 0, -1}; | |
bool writeRegister(uint8_t subAddress, uint8_t data); | |
void readRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest); | |
uint8_t whoAmI(); | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment