mpu9250のライブラリ、I2Cを利用。開発段階のため微妙
Diff: mpu9250_i2c.h
- Revision:
- 0:d36bfb8300a2
- Child:
- 1:6a4c2f84180b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpu9250_i2c.h Mon Jan 09 06:28:04 2017 +0000 @@ -0,0 +1,158 @@ +#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 \ No newline at end of file