mpu9250のライブラリ、I2Cを利用。
Dependents: Hybrid_AttitudeEstimation Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more
Fork of mpu9250_i2c by
Diff: mpu9250_i2c.h
- Revision:
- 1:6a4c2f84180b
- Parent:
- 0:d36bfb8300a2
- Child:
- 2:4c7bc164cc4d
--- a/mpu9250_i2c.h Mon Jan 09 06:28:04 2017 +0000 +++ b/mpu9250_i2c.h Sat Jan 28 19:52:32 2017 +0000 @@ -1,6 +1,14 @@ #ifndef _MPU9250_I2C_H_ #define _MPU9250_I2C_H_ +/** + @file mpu9250.h + @bref mpu9250を比較的簡単に利用できるようにしたライブラリ + @note ローパスフィルタまわりの実装がまだです.外部でよろです! + @author Gaku MATSUMOTO +*/ + + #define SLAVE_ADDR_LOW (0b1101000 << 1)//AD0 == LOW #define SLAVE_ADDR_HIGH (0b1101001 << 1)//AD0 == HIGH #define MAG_ADDR (0b0001100 << 1) @@ -27,7 +35,7 @@ #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48 -#define WHO_AM_I 0x75 //0x71ならおk +#define WHO_AM_I_MPU9250 0x75 //0x71ならおk #define XG_OFFSET_H 0x13 #define XG_OFFSET_L 0x14 #define YG_OFFSET_H 0x15 @@ -96,36 +104,130 @@ class mpu9250{ public: - mpu9250(I2C &_i2c, AD0 celect); + + /** + @bref mpu9250インスタンスを生成する + @param _i2c メインプログラムで宣言したI2Cインスタンスのアドレス + @param celect AD0ピンがHIGHならAD0_HIGH,LOWならAD0_LOW + @note 第二引数なしだとAD0_HIGHになります. + */ + mpu9250(I2C &_i2c, AD0 celect = AD0_HIGH); 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); + + /** + @bref 慣性センサと通信ができているか確認する + @return trueが返ってきたら成功,falseなら... + */ + bool senserTest(); + /** + @bref 地磁気センサと通信ができているか確認する + @return trueが返ってきたら成功,falseなら... + */ bool mag_senserTest(); - void setAcc(ACC_RANGE a_range); - void setGyro(GYRO_RANGE g_range); - void setMag(MAG_RATE rate); + + /** + @bref 加速度センサのレンジを設定 + @param a_range _2G, _4G, _8G, _16Gの中から選択 + @note 引数無しで±4Gになる + */ + void setAcc(ACC_RANGE a_range = _4G); + + /** + @bref 角速度センサのレンジ設定 + @param g_range _250DPS, _500DPS, _1000DPS, _2000DPSの中から選択 + @note 引数無しで±500DPS + */ + void setGyro(GYRO_RANGE g_range = _500DPS); + + /** + @bref 地磁気センサのデータレート設定 + @param rate _8HZ か _100HZを選択 + @note あえて8Hzにする必要は無いと思います. + */ + void setMag(MAG_RATE rate = _100HZ); void init(); + + /** + @bref I2Cの通信速度を変更できます.余程のことがない限り使用しなくていいです・ + */ void frequency(int Hz); + + /** + @bref mpu9250のデジタルローパスフィルタの設定 + @param band NO_USE, _460HZ, _184HZ, _92HZ, _41HZ, _20HZ, _10HZ, _5HZから選択 + @note カットオフ周波数なのかサンプルレートなのかよく分かりません.正直効果が見られません + */ void setAccLPF(A_BAND_WIDTH band); + + /** + @bref ゼロ点のずれを補正するオフセット値を設定する + @param ax,ay,az 加速度のオフセット + @param gx,gy,gz 角速度のオフセット + @param mx,my,mz 地磁気のオフセット + @note とても重要です.地磁気は定期的にキャリブレーションをしてください.ちなみに,これらの値は測定値より引かれています. + */ 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); + /** + @bref 加速度を取得します. + @param ax x軸方向の加速度[G] + @param ay y軸方向の加速度[G] + @param az z軸方向の加速度[G] + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getAcc(T *ax, T *ay, T *az); + /** + @bref 加速度を取得します. + @param acc 各軸方向の加速度[G],x,y,zの順 + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getAcc(T *acc); - void getGyro(double *gx, double *gy, double *gz); - void getGyro(double *gyro); + /** + @bref 角速度を取得します. + @param gx x軸方向の角速度[degree/s] + @param gy y軸方向の角速度[degree/s] + @param gz z軸方向の角速度[degree/s] + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getGyro(T *gx, T *gy, T *gz); + /** + @bref 角速度を取得します. + @param gyro 各軸方向の角速度[degree/s], x,y,zの順 + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getGyro(T *gyro); - void getMag(double *mx, double *my, double *mz); - void getMag(double *mag); + /** + @bref 磁束密度を取得します. + @param mx x軸方向の磁束密度[uT] + @param my y軸方向の磁束密度[uT] + @param mz z軸方向の磁束密度[uT] + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getMag(T *mx, T *my, T *mz); + /** + @bref 磁束密度を取得します. + @param mag 各軸方向の磁束密度[uT],x,y,zの順 + @note 型はfloat でも doubleでも構いません. + */ + template<typename T>void getMag(T *mag); - void getGyroAcc(double *imu);//gx,gy,gz,ax,ay,az + /** + @bref 角速度と加速度を同時に取得します. + @param imu データを入れる配列,角速度[degree/s],加速度[G]の順 + @note 配列数は6以上で + */ + template<typename T>void getGyroAcc(T *imu);//gx,gy,gz,ax,ay,az +private: static char _addr; static double acc_coef;//coefficient static double gyro_coef;