mpu9250のライブラリ、I2Cを利用。開発段階のため微妙

Dependents:   library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mpu9250_i2c.h Source File

mpu9250_i2c.h

00001 #ifndef _MPU9250_I2C_H_
00002 #define _MPU9250_I2C_H_
00003 
00004 
00005 
00006 #define SLAVE_ADDR_LOW (0b1101000 << 1)//AD0 == LOW
00007 #define SLAVE_ADDR_HIGH (0b1101001 << 1)//AD0 == HIGH
00008 #define MAG_ADDR (0b0001100 << 1)
00009 
00010 #define WRITE_FLAG 0b00000000
00011 #define READ_FLAG  0b00000001
00012 #define CONFIG 0x1A
00013 #define GYRO_CONFIG 0x1B
00014 #define ACCEL_CONFIG 0x1C
00015 #define ACCEL_CONFIG2 0x1D
00016 #define LP_ACCEL_ODR 0x1E
00017 #define INT_PIN_CFG 0x37
00018 #define ACCEL_XOUT_H 0x3B
00019 #define ACCEL_XOUT_L 0x3C
00020 #define ACCEL_YOUT_H 0x3D
00021 #define ACCEL_YOUT_L 0x3E
00022 #define ACCLE_ZOUT_H 0x3F
00023 #define ACCEL_ZOUT_L 0x40
00024 #define TEMP_OUT_H 0x41
00025 #define TEMP_OUT_L 0x42
00026 #define GYRO_XOUT_H 0x43
00027 #define GYRO_XOUT_L 0x44
00028 #define GYRO_YOUT_H 0x45
00029 #define GYRO_YOUT_L 0x46
00030 #define GYRO_ZOUT_H 0x47
00031 #define GYRO_ZOUT_L 0x48
00032 #define WHO_AM_I_MPU9250 0x75 //0x71ならおk
00033 #define XG_OFFSET_H 0x13
00034 #define XG_OFFSET_L 0x14
00035 #define YG_OFFSET_H 0x15
00036 #define YG_OFFSET_L 0x16
00037 #define ZG_OFFSET_H 0x17
00038 #define ZG_OFFSET_L 0x18
00039 #define XA_OFFSET_H 0x77
00040 #define XA_OFFSET_L 0x78
00041 #define YA_OFFSET_H 0x79
00042 #define YA_OFFERT_L 0x80
00043 #define ZA_OFFSET_H 0x81
00044 #define ZA_OFFSET_L 0x82
00045 
00046 #define WIA 0x00 //device ID
00047 #define INFO 0x01
00048 #define ST1 0x02
00049 #define HXL 0x03//Low -> Highの順に注意
00050 #define HXH 0x04
00051 #define HYL 0x05
00052 #define HYH 0x06
00053 #define HZL 0x07
00054 #define HZH 0x08
00055 #define ST2 0x09
00056 #define CNTL1 0x0A
00057 #define CNTL2 0x0B
00058 
00059 #define ACC_LSB (0.0000610350)//[G / LSB]
00060 #define GYRO_LSB (0.007630) //[(degree / s) / LSB]
00061 #define MAG_LSB (0.150) //[uT / LSB]
00062 
00063 typedef enum AD0 {
00064     AD0_HIGH = 1,
00065     AD0_LOW  = 0
00066 } ad0;
00067 
00068 typedef enum ACC_RANGE {
00069     _2G = 1,
00070     _4G = 2,
00071     _8G = 4,
00072     _16G = 8
00073 } acc_range;
00074 
00075 typedef enum GYRO_RANGE {
00076     _250DPS = 1,
00077     _500DPS = 2,
00078     _1000DPS = 4,
00079     _2000DPS = 8
00080 } gyro_range;
00081 
00082 typedef enum MAG_RATE {
00083     _8HZ = 0,
00084     _100HZ = 1
00085 } mag_rate;
00086 
00087 typedef enum A_BAND_WIDTH {
00088     NO_USE = 0b00000000,
00089     _460HZ = 0b00001000,
00090     _184HZ = 0b00001001,
00091     _92HZ  = 0b00001010,
00092     _41HZ  = 0b00001011,
00093     _20HZ  = 0b00001100,
00094     _10HZ  = 0b00001101,
00095     _5HZ   = 0b00001110,
00096 } a_band_width;
00097 
00098 /**
00099 *  @bref  mpu9250を比較的簡単に利用できるようにしたライブラリ
00100 *  @note  ローパスフィルタまわりの実装がまだです.外部でよろです!
00101 *  @author  Gaku MATSUMOTO
00102 */
00103 class mpu9250
00104 {
00105 
00106 public:
00107 
00108 /**
00109 *  @bref  mpu9250インスタンスを生成する
00110 *  @param  _i2c  メインプログラムで宣言したI2Cインスタンスのアドレス
00111 *  @param  celect  AD0ピンがHIGHならAD0_HIGH,LOWならAD0_LOW
00112 *  @note  第二引数なしだとAD0_HIGHになります.
00113 */
00114     mpu9250(I2C &_i2c, AD0 celect = AD0_HIGH);
00115 
00116     I2C *_nine;
00117 public:
00118     void writeReg(char addr, char data);
00119     void writeReg(char addr, char reg, char data);
00120     char readReg(char addr, char reg);
00121     void readReg(char addr, char start_reg, char* buff, char num);
00122 
00123     /*!
00124      @bref  慣性センサと通信ができているか確認する
00125      @note  trueが返ってきたら成功,falseなら...
00126      */
00127     bool senserTest ();
00128 
00129 /**
00130 * @fn bool mpu9250::mag_senserTest()
00131 * @bref 地磁気センサと通信ができているか確認する
00132 * @note trueが返ってきたら成功,falseなら...
00133 */
00134     bool mag_senserTest();
00135 
00136     /**
00137      *    @bref  加速度センサのレンジを設定
00138      *    @param  a_range _2G, _4G, _8G, _16Gの中から選択
00139      *    @note  引数無しで±4Gになる
00140      */
00141     void setAcc(ACC_RANGE a_range = _4G);
00142 
00143     /**
00144      *    @bref  角速度センサのレンジ設定
00145      *    @param  g_range _250DPS, _500DPS, _1000DPS, _2000DPSの中から選択
00146      *    @note  引数無しで±500DPS
00147      */
00148     void setGyro(GYRO_RANGE g_range = _500DPS);
00149 
00150     /**
00151      *    @bref  地磁気センサのデータレート設定
00152      *    @param  rate  _8HZ か _100HZを選択
00153      *    @note  あえて8Hzにする必要は無いと思います.
00154      */
00155     void setMag(MAG_RATE rate = _100HZ);
00156 
00157     void init();
00158 
00159 
00160     /**
00161      *    @bref   I2Cの通信速度を変更できます.余程のことがない限り使用しなくていいです・
00162      */
00163     void frequency(int Hz);
00164 
00165     /**
00166      *    @bref  mpu9250のデジタルローパスフィルタの設定
00167      *    @param  band  NO_USE, _460HZ, _184HZ, _92HZ, _41HZ, _20HZ, _10HZ, _5HZから選択
00168      *    @note  カットオフ周波数なのかサンプルレートなのかよく分かりません.正直効果が見られません
00169      */
00170     void setAccLPF(A_BAND_WIDTH band);
00171 
00172     /**
00173      *    @bref  ゼロ点のずれを補正するオフセット値を設定する
00174      *    @param  ax,ay,az    加速度のオフセット
00175      *    @param  gx,gy,gz    角速度のオフセット
00176      *    @param  mx,my,mz    地磁気のオフセット
00177      *    @note  とても重要です.地磁気は定期的にキャリブレーションをしてください.ちなみに,これらの値は測定値より引かれています.
00178      */
00179     void setOffset(double ax, double ay, double az,
00180                    double gx, double gy, double gz,
00181                    double mx, double my, double mz);
00182 
00183     /**
00184      *    @bref  加速度を取得します.
00185      *    @param  ax  x軸方向の加速度[G]
00186      *    @param  ay  y軸方向の加速度[G]
00187      *    @param  az  z軸方向の加速度[G]
00188      *    @note  型はfloat でも doubleでも構いません.
00189      */
00190     template<typename T>void getAcc(T *ax, T *ay, T *az);
00191 
00192     /**
00193      *    @bref  加速度を取得します.
00194      *    @param  acc  各軸方向の加速度[G],x,y,zの順
00195      *    @note  型はfloat でも doubleでも構いません.
00196      */
00197     template<typename T>void getAcc(T *acc);
00198 
00199     /**
00200      *    @bref  角速度を取得します.
00201      *    @param  gx  x軸方向の角速度[degree/s]
00202      *    @param  gy  y軸方向の角速度[degree/s]
00203      *    @param  gz  z軸方向の角速度[degree/s]
00204      *    @note  型はfloat でも doubleでも構いません.
00205      */
00206     template<typename T>void getGyro(T *gx, T *gy, T *gz);
00207 
00208     /**
00209      *    @bref  角速度を取得します.
00210      *    @param  gyro  各軸方向の角速度[degree/s], x,y,zの順
00211      *    @note  型はfloat でも doubleでも構いません.
00212      */
00213     template<typename T>void getGyro(T *gyro);
00214 
00215     /**
00216      *    @bref  磁束密度を取得します.
00217      *    @param  mx  x軸方向の磁束密度[uT]
00218      *    @param  my  y軸方向の磁束密度[uT]
00219      *    @param  mz  z軸方向の磁束密度[uT]
00220      *    @note  型はfloat でも doubleでも構いません.
00221      */
00222     template<typename T>void getMag(T *mx, T *my, T *mz);
00223 
00224 
00225     /**
00226      *    @bref  磁束密度を取得します.
00227      *    @param  mag  各軸方向の磁束密度[uT],x,y,zの順
00228      *    @note  型はfloat でも doubleでも構いません.
00229      */
00230     template<typename T>void getMag(T *mag);
00231 
00232     /**
00233      *    @bref  角速度と加速度を同時に取得します.
00234      *    @param  imu データを入れる配列,角速度[degree/s],加速度[G]の順
00235      *    @note  配列数は6以上で
00236      */
00237     template<typename T>void getGyroAcc(T *imu);//gx,gy,gz,ax,ay,az
00238 
00239 private:
00240     static char _addr;
00241     static double acc_coef;//coefficient
00242     static double gyro_coef;
00243     static double mag_coef;
00244     static double acc_offset[3];
00245     static double gyro_offset[3];
00246     static double mag_offset[3];
00247 };
00248 
00249 
00250 
00251 inline void mpu9250::writeReg(char addr, char data)
00252 {
00253     _nine->write( addr | WRITE_FLAG, &data, 1, false);
00254 }
00255 inline void mpu9250::writeReg(char addr, char reg, char data)
00256 {
00257     char temp[2] = { reg, data};
00258     _nine->write(addr | WRITE_FLAG, temp, 2, false);
00259 }
00260 inline char mpu9250::readReg(char addr, char reg)
00261 {
00262     char buff[1];
00263     writeReg(addr, reg);
00264     _nine->read(addr | READ_FLAG, buff, 1, true);
00265     return buff[0];
00266 }
00267 inline void mpu9250::readReg(char addr, char start_reg, char* buff, char num)
00268 {
00269     writeReg(addr, start_reg);
00270     _nine->read(addr | READ_FLAG, buff, num, true);
00271 }
00272 
00273 #endif