mpu9250のライブラリ、I2Cを利用。

Dependents:   Hybrid_AttitudeEstimation Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more

Fork of mpu9250_i2c by Gaku Matsumoto

mpu9250_i2c.h

Committer:
Gaku0606
Date:
2017-01-09
Revision:
0:d36bfb8300a2
Child:
1:6a4c2f84180b

File content as of revision 0:d36bfb8300a2:

#ifndef _MPU9250_I2C_H_
#define _MPU9250_I2C_H_

#define SLAVE_ADDR_LOW (0b1101000 << 1)//AD0 == LOW
#define SLAVE_ADDR_HIGH (0b1101001 << 1)//AD0 == HIGH
#define MAG_ADDR (0b0001100 << 1)

#define WRITE_FLAG 0b00000000
#define READ_FLAG  0b00000001
#define CONFIG 0x1A
#define GYRO_CONFIG 0x1B
#define ACCEL_CONFIG 0x1C
#define ACCEL_CONFIG2 0x1D
#define LP_ACCEL_ODR 0x1E
#define INT_PIN_CFG 0x37
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCLE_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#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
#define WHO_AM_I 0x75 //0x71ならおk
#define XG_OFFSET_H 0x13
#define XG_OFFSET_L 0x14
#define YG_OFFSET_H 0x15
#define YG_OFFSET_L 0x16
#define ZG_OFFSET_H 0x17
#define ZG_OFFSET_L 0x18
#define XA_OFFSET_H 0x77
#define XA_OFFSET_L 0x78
#define YA_OFFSET_H 0x79
#define YA_OFFERT_L 0x80
#define ZA_OFFSET_H 0x81
#define ZA_OFFSET_L 0x82

#define WIA 0x00 //device ID
#define INFO 0x01
#define ST1 0x02
#define HXL 0x03//Low -> Highの順に注意
#define HXH 0x04
#define HYL 0x05
#define HYH 0x06
#define HZL 0x07
#define HZH 0x08
#define ST2 0x09
#define CNTL1 0x0A
#define CNTL2 0x0B

#define ACC_LSB (0.0000610350)//[G / LSB]
#define GYRO_LSB (0.007630) //[(degree / s) / LSB]
#define MAG_LSB (0.150) //[uT / LSB]

typedef enum AD0{
    AD0_HIGH = 1,
    AD0_LOW  = 0  
}ad0;

typedef enum ACC_RANGE{
    _2G = 1,
    _4G = 2,
    _8G = 4,
    _16G = 8
}acc_range;

typedef enum GYRO_RANGE{
    _250DPS = 1,
    _500DPS = 2,
    _1000DPS = 4,
    _2000DPS = 8
}gyro_range;

typedef enum MAG_RATE{
    _8HZ = 0,
    _100HZ = 1
}mag_rate;

typedef enum A_BAND_WIDTH{
    NO_USE = 0b00000000,
    _460HZ = 0b00001000,
    _184HZ = 0b00001001,
    _92HZ  = 0b00001010,
    _41HZ  = 0b00001011,
    _20HZ  = 0b00001100,
    _10HZ  = 0b00001101,
    _5HZ   = 0b00001110,
}a_band_width;

class mpu9250{

public:
    mpu9250(I2C &_i2c, AD0 celect);
    I2C *_nine;
public:
    void writeReg(char addr, char data);
    void writeReg(char addr, char reg, char data);
    char readReg(char addr, char reg);
    void readReg(char addr, char start_reg, char* buff, char num);
    bool senserTest();
    bool mag_senserTest();
    void setAcc(ACC_RANGE a_range);
    void setGyro(GYRO_RANGE g_range);
    void setMag(MAG_RATE rate);
    void init();
    void frequency(int Hz);
    void setAccLPF(A_BAND_WIDTH band);
    void setOffset(double ax, double ay, double az,
                   double gx, double gy, double gz,
                   double mx, double my, double mz);
    
    void getAcc(double *ax, double *ay, double *az);
    void getAcc(double *acc);
    
    void getGyro(double *gx, double *gy, double *gz);
    void getGyro(double *gyro);
    
    void getMag(double *mx, double *my, double *mz);
    void getMag(double *mag);  

    void getGyroAcc(double *imu);//gx,gy,gz,ax,ay,az

    static char _addr;
    static double acc_coef;//coefficient
    static double gyro_coef;
    static double mag_coef;
    static double acc_offset[3];
    static double gyro_offset[3];
    static double mag_offset[3];
};



inline void mpu9250::writeReg(char addr, char data){
    _nine->write( addr | WRITE_FLAG, &data, 1, false);
}
inline void mpu9250::writeReg(char addr, char reg, char data){
    char temp[2] = { reg, data};
    _nine->write(addr | WRITE_FLAG, temp, 2, false);
}
inline char mpu9250::readReg(char addr, char reg){
    char buff[1];
    writeReg(addr, reg);
    _nine->read(addr | READ_FLAG, buff, 1, true);
    return buff[0];   
}
inline void mpu9250::readReg(char addr, char start_reg, char* buff, char num){
    writeReg(addr, start_reg);
    _nine->read(addr | READ_FLAG, buff, num, true);   
}

#endif