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

Dependents:   Hybrid_AttitudeEstimation Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more

Fork of mpu9250_i2c by Gaku Matsumoto

Committer:
Gaku0606
Date:
Sat Jan 28 20:13:43 2017 +0000
Revision:
2:4c7bc164cc4d
Parent:
1:6a4c2f84180b
Child:
3:1dcc2a9ff958
doxygen????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gaku0606 0:d36bfb8300a2 1 #ifndef _MPU9250_I2C_H_
Gaku0606 0:d36bfb8300a2 2 #define _MPU9250_I2C_H_
Gaku0606 0:d36bfb8300a2 3
Gaku0606 1:6a4c2f84180b 4 /**
Gaku0606 2:4c7bc164cc4d 5 * @note mpu9250を比較的簡単に利用できるようにしたライブラリ
Gaku0606 2:4c7bc164cc4d 6 * @note ローパスフィルタまわりの実装がまだです.外部でよろです!
Gaku0606 2:4c7bc164cc4d 7 * @author Gaku MATSUMOTO
Gaku0606 1:6a4c2f84180b 8 */
Gaku0606 1:6a4c2f84180b 9
Gaku0606 1:6a4c2f84180b 10
Gaku0606 0:d36bfb8300a2 11 #define SLAVE_ADDR_LOW (0b1101000 << 1)//AD0 == LOW
Gaku0606 0:d36bfb8300a2 12 #define SLAVE_ADDR_HIGH (0b1101001 << 1)//AD0 == HIGH
Gaku0606 0:d36bfb8300a2 13 #define MAG_ADDR (0b0001100 << 1)
Gaku0606 0:d36bfb8300a2 14
Gaku0606 0:d36bfb8300a2 15 #define WRITE_FLAG 0b00000000
Gaku0606 0:d36bfb8300a2 16 #define READ_FLAG 0b00000001
Gaku0606 0:d36bfb8300a2 17 #define CONFIG 0x1A
Gaku0606 0:d36bfb8300a2 18 #define GYRO_CONFIG 0x1B
Gaku0606 0:d36bfb8300a2 19 #define ACCEL_CONFIG 0x1C
Gaku0606 0:d36bfb8300a2 20 #define ACCEL_CONFIG2 0x1D
Gaku0606 0:d36bfb8300a2 21 #define LP_ACCEL_ODR 0x1E
Gaku0606 0:d36bfb8300a2 22 #define INT_PIN_CFG 0x37
Gaku0606 0:d36bfb8300a2 23 #define ACCEL_XOUT_H 0x3B
Gaku0606 0:d36bfb8300a2 24 #define ACCEL_XOUT_L 0x3C
Gaku0606 0:d36bfb8300a2 25 #define ACCEL_YOUT_H 0x3D
Gaku0606 0:d36bfb8300a2 26 #define ACCEL_YOUT_L 0x3E
Gaku0606 0:d36bfb8300a2 27 #define ACCLE_ZOUT_H 0x3F
Gaku0606 0:d36bfb8300a2 28 #define ACCEL_ZOUT_L 0x40
Gaku0606 0:d36bfb8300a2 29 #define TEMP_OUT_H 0x41
Gaku0606 0:d36bfb8300a2 30 #define TEMP_OUT_L 0x42
Gaku0606 0:d36bfb8300a2 31 #define GYRO_XOUT_H 0x43
Gaku0606 0:d36bfb8300a2 32 #define GYRO_XOUT_L 0x44
Gaku0606 0:d36bfb8300a2 33 #define GYRO_YOUT_H 0x45
Gaku0606 0:d36bfb8300a2 34 #define GYRO_YOUT_L 0x46
Gaku0606 0:d36bfb8300a2 35 #define GYRO_ZOUT_H 0x47
Gaku0606 0:d36bfb8300a2 36 #define GYRO_ZOUT_L 0x48
Gaku0606 1:6a4c2f84180b 37 #define WHO_AM_I_MPU9250 0x75 //0x71ならおk
Gaku0606 0:d36bfb8300a2 38 #define XG_OFFSET_H 0x13
Gaku0606 0:d36bfb8300a2 39 #define XG_OFFSET_L 0x14
Gaku0606 0:d36bfb8300a2 40 #define YG_OFFSET_H 0x15
Gaku0606 0:d36bfb8300a2 41 #define YG_OFFSET_L 0x16
Gaku0606 0:d36bfb8300a2 42 #define ZG_OFFSET_H 0x17
Gaku0606 0:d36bfb8300a2 43 #define ZG_OFFSET_L 0x18
Gaku0606 0:d36bfb8300a2 44 #define XA_OFFSET_H 0x77
Gaku0606 0:d36bfb8300a2 45 #define XA_OFFSET_L 0x78
Gaku0606 0:d36bfb8300a2 46 #define YA_OFFSET_H 0x79
Gaku0606 0:d36bfb8300a2 47 #define YA_OFFERT_L 0x80
Gaku0606 0:d36bfb8300a2 48 #define ZA_OFFSET_H 0x81
Gaku0606 0:d36bfb8300a2 49 #define ZA_OFFSET_L 0x82
Gaku0606 0:d36bfb8300a2 50
Gaku0606 0:d36bfb8300a2 51 #define WIA 0x00 //device ID
Gaku0606 0:d36bfb8300a2 52 #define INFO 0x01
Gaku0606 0:d36bfb8300a2 53 #define ST1 0x02
Gaku0606 0:d36bfb8300a2 54 #define HXL 0x03//Low -> Highの順に注意
Gaku0606 0:d36bfb8300a2 55 #define HXH 0x04
Gaku0606 0:d36bfb8300a2 56 #define HYL 0x05
Gaku0606 0:d36bfb8300a2 57 #define HYH 0x06
Gaku0606 0:d36bfb8300a2 58 #define HZL 0x07
Gaku0606 0:d36bfb8300a2 59 #define HZH 0x08
Gaku0606 0:d36bfb8300a2 60 #define ST2 0x09
Gaku0606 0:d36bfb8300a2 61 #define CNTL1 0x0A
Gaku0606 0:d36bfb8300a2 62 #define CNTL2 0x0B
Gaku0606 0:d36bfb8300a2 63
Gaku0606 0:d36bfb8300a2 64 #define ACC_LSB (0.0000610350)//[G / LSB]
Gaku0606 0:d36bfb8300a2 65 #define GYRO_LSB (0.007630) //[(degree / s) / LSB]
Gaku0606 0:d36bfb8300a2 66 #define MAG_LSB (0.150) //[uT / LSB]
Gaku0606 0:d36bfb8300a2 67
Gaku0606 0:d36bfb8300a2 68 typedef enum AD0{
Gaku0606 0:d36bfb8300a2 69 AD0_HIGH = 1,
Gaku0606 0:d36bfb8300a2 70 AD0_LOW = 0
Gaku0606 0:d36bfb8300a2 71 }ad0;
Gaku0606 0:d36bfb8300a2 72
Gaku0606 0:d36bfb8300a2 73 typedef enum ACC_RANGE{
Gaku0606 0:d36bfb8300a2 74 _2G = 1,
Gaku0606 0:d36bfb8300a2 75 _4G = 2,
Gaku0606 0:d36bfb8300a2 76 _8G = 4,
Gaku0606 0:d36bfb8300a2 77 _16G = 8
Gaku0606 0:d36bfb8300a2 78 }acc_range;
Gaku0606 0:d36bfb8300a2 79
Gaku0606 0:d36bfb8300a2 80 typedef enum GYRO_RANGE{
Gaku0606 0:d36bfb8300a2 81 _250DPS = 1,
Gaku0606 0:d36bfb8300a2 82 _500DPS = 2,
Gaku0606 0:d36bfb8300a2 83 _1000DPS = 4,
Gaku0606 0:d36bfb8300a2 84 _2000DPS = 8
Gaku0606 0:d36bfb8300a2 85 }gyro_range;
Gaku0606 0:d36bfb8300a2 86
Gaku0606 0:d36bfb8300a2 87 typedef enum MAG_RATE{
Gaku0606 0:d36bfb8300a2 88 _8HZ = 0,
Gaku0606 0:d36bfb8300a2 89 _100HZ = 1
Gaku0606 0:d36bfb8300a2 90 }mag_rate;
Gaku0606 0:d36bfb8300a2 91
Gaku0606 0:d36bfb8300a2 92 typedef enum A_BAND_WIDTH{
Gaku0606 0:d36bfb8300a2 93 NO_USE = 0b00000000,
Gaku0606 0:d36bfb8300a2 94 _460HZ = 0b00001000,
Gaku0606 0:d36bfb8300a2 95 _184HZ = 0b00001001,
Gaku0606 0:d36bfb8300a2 96 _92HZ = 0b00001010,
Gaku0606 0:d36bfb8300a2 97 _41HZ = 0b00001011,
Gaku0606 0:d36bfb8300a2 98 _20HZ = 0b00001100,
Gaku0606 0:d36bfb8300a2 99 _10HZ = 0b00001101,
Gaku0606 0:d36bfb8300a2 100 _5HZ = 0b00001110,
Gaku0606 0:d36bfb8300a2 101 }a_band_width;
Gaku0606 0:d36bfb8300a2 102
Gaku0606 0:d36bfb8300a2 103 class mpu9250{
Gaku0606 0:d36bfb8300a2 104
Gaku0606 0:d36bfb8300a2 105 public:
Gaku0606 1:6a4c2f84180b 106
Gaku0606 1:6a4c2f84180b 107 /**
Gaku0606 2:4c7bc164cc4d 108 @bref mpu9250インスタンスを生成する
Gaku0606 2:4c7bc164cc4d 109 @param _i2c メインプログラムで宣言したI2Cインスタンスのアドレス
Gaku0606 1:6a4c2f84180b 110 @param celect AD0ピンがHIGHならAD0_HIGH,LOWならAD0_LOW
Gaku0606 2:4c7bc164cc4d 111 @note 第二引数なしだとAD0_HIGHになります.
Gaku0606 1:6a4c2f84180b 112 */
Gaku0606 1:6a4c2f84180b 113 mpu9250(I2C &_i2c, AD0 celect = AD0_HIGH);
Gaku0606 2:4c7bc164cc4d 114
Gaku0606 0:d36bfb8300a2 115 I2C *_nine;
Gaku0606 0:d36bfb8300a2 116 public:
Gaku0606 0:d36bfb8300a2 117 void writeReg(char addr, char data);
Gaku0606 0:d36bfb8300a2 118 void writeReg(char addr, char reg, char data);
Gaku0606 0:d36bfb8300a2 119 char readReg(char addr, char reg);
Gaku0606 0:d36bfb8300a2 120 void readReg(char addr, char start_reg, char* buff, char num);
Gaku0606 1:6a4c2f84180b 121
Gaku0606 1:6a4c2f84180b 122 /**
Gaku0606 2:4c7bc164cc4d 123 @bref 慣性センサと通信ができているか確認する
Gaku0606 2:4c7bc164cc4d 124 @note trueが返ってきたら成功,falseなら...
Gaku0606 1:6a4c2f84180b 125 */
Gaku0606 2:4c7bc164cc4d 126 bool senserTest();
Gaku0606 1:6a4c2f84180b 127
Gaku0606 1:6a4c2f84180b 128 /**
Gaku0606 2:4c7bc164cc4d 129 @bref 地磁気センサと通信ができているか確認する
Gaku0606 2:4c7bc164cc4d 130 @note trueが返ってきたら成功,falseなら...
Gaku0606 1:6a4c2f84180b 131 */
Gaku0606 0:d36bfb8300a2 132 bool mag_senserTest();
Gaku0606 1:6a4c2f84180b 133
Gaku0606 1:6a4c2f84180b 134 /**
Gaku0606 2:4c7bc164cc4d 135 @bref 加速度センサのレンジを設定
Gaku0606 1:6a4c2f84180b 136 @param a_range _2G, _4G, _8G, _16Gの中から選択
Gaku0606 2:4c7bc164cc4d 137 @note 引数無しで±4Gになる
Gaku0606 1:6a4c2f84180b 138 */
Gaku0606 1:6a4c2f84180b 139 void setAcc(ACC_RANGE a_range = _4G);
Gaku0606 1:6a4c2f84180b 140
Gaku0606 1:6a4c2f84180b 141 /**
Gaku0606 2:4c7bc164cc4d 142 @bref 角速度センサのレンジ設定
Gaku0606 1:6a4c2f84180b 143 @param g_range _250DPS, _500DPS, _1000DPS, _2000DPSの中から選択
Gaku0606 2:4c7bc164cc4d 144 @note 引数無しで±500DPS
Gaku0606 1:6a4c2f84180b 145 */
Gaku0606 1:6a4c2f84180b 146 void setGyro(GYRO_RANGE g_range = _500DPS);
Gaku0606 1:6a4c2f84180b 147
Gaku0606 1:6a4c2f84180b 148 /**
Gaku0606 2:4c7bc164cc4d 149 @bref 地磁気センサのデータレート設定
Gaku0606 2:4c7bc164cc4d 150 @param rate _8HZ か _100HZを選択
Gaku0606 2:4c7bc164cc4d 151 @note あえて8Hzにする必要は無いと思います.
Gaku0606 1:6a4c2f84180b 152 */
Gaku0606 1:6a4c2f84180b 153 void setMag(MAG_RATE rate = _100HZ);
Gaku0606 2:4c7bc164cc4d 154
Gaku0606 0:d36bfb8300a2 155 void init();
Gaku0606 1:6a4c2f84180b 156
Gaku0606 1:6a4c2f84180b 157 /**
Gaku0606 1:6a4c2f84180b 158 @bref I2Cの通信速度を変更できます.余程のことがない限り使用しなくていいです・
Gaku0606 1:6a4c2f84180b 159 */
Gaku0606 0:d36bfb8300a2 160 void frequency(int Hz);
Gaku0606 1:6a4c2f84180b 161
Gaku0606 1:6a4c2f84180b 162 /**
Gaku0606 2:4c7bc164cc4d 163 @bref mpu9250のデジタルローパスフィルタの設定
Gaku0606 2:4c7bc164cc4d 164 @param band NO_USE, _460HZ, _184HZ, _92HZ, _41HZ, _20HZ, _10HZ, _5HZから選択
Gaku0606 2:4c7bc164cc4d 165 @note カットオフ周波数なのかサンプルレートなのかよく分かりません.正直効果が見られません
Gaku0606 1:6a4c2f84180b 166 */
Gaku0606 0:d36bfb8300a2 167 void setAccLPF(A_BAND_WIDTH band);
Gaku0606 1:6a4c2f84180b 168
Gaku0606 1:6a4c2f84180b 169 /**
Gaku0606 2:4c7bc164cc4d 170 @bref ゼロ点のずれを補正するオフセット値を設定する
Gaku0606 1:6a4c2f84180b 171 @param ax,ay,az 加速度のオフセット
Gaku0606 1:6a4c2f84180b 172 @param gx,gy,gz 角速度のオフセット
Gaku0606 1:6a4c2f84180b 173 @param mx,my,mz 地磁気のオフセット
Gaku0606 2:4c7bc164cc4d 174 @note とても重要です.地磁気は定期的にキャリブレーションをしてください.ちなみに,これらの値は測定値より引かれています.
Gaku0606 1:6a4c2f84180b 175 */
Gaku0606 0:d36bfb8300a2 176 void setOffset(double ax, double ay, double az,
Gaku0606 0:d36bfb8300a2 177 double gx, double gy, double gz,
Gaku0606 0:d36bfb8300a2 178 double mx, double my, double mz);
Gaku0606 2:4c7bc164cc4d 179
Gaku0606 1:6a4c2f84180b 180 /**
Gaku0606 2:4c7bc164cc4d 181 @bref 加速度を取得します.
Gaku0606 1:6a4c2f84180b 182 @param ax x軸方向の加速度[G]
Gaku0606 1:6a4c2f84180b 183 @param ay y軸方向の加速度[G]
Gaku0606 1:6a4c2f84180b 184 @param az z軸方向の加速度[G]
Gaku0606 2:4c7bc164cc4d 185 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 186 */
Gaku0606 1:6a4c2f84180b 187 template<typename T>void getAcc(T *ax, T *ay, T *az);
Gaku0606 2:4c7bc164cc4d 188
Gaku0606 1:6a4c2f84180b 189 /**
Gaku0606 2:4c7bc164cc4d 190 @bref 加速度を取得します.
Gaku0606 1:6a4c2f84180b 191 @param acc 各軸方向の加速度[G],x,y,zの順
Gaku0606 2:4c7bc164cc4d 192 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 193 */
Gaku0606 1:6a4c2f84180b 194 template<typename T>void getAcc(T *acc);
Gaku0606 0:d36bfb8300a2 195
Gaku0606 1:6a4c2f84180b 196 /**
Gaku0606 2:4c7bc164cc4d 197 @bref 角速度を取得します.
Gaku0606 1:6a4c2f84180b 198 @param gx x軸方向の角速度[degree/s]
Gaku0606 1:6a4c2f84180b 199 @param gy y軸方向の角速度[degree/s]
Gaku0606 1:6a4c2f84180b 200 @param gz z軸方向の角速度[degree/s]
Gaku0606 2:4c7bc164cc4d 201 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 202 */
Gaku0606 1:6a4c2f84180b 203 template<typename T>void getGyro(T *gx, T *gy, T *gz);
Gaku0606 2:4c7bc164cc4d 204
Gaku0606 1:6a4c2f84180b 205 /**
Gaku0606 2:4c7bc164cc4d 206 @bref 角速度を取得します.
Gaku0606 2:4c7bc164cc4d 207 @param gyro 各軸方向の角速度[degree/s], x,y,zの順
Gaku0606 2:4c7bc164cc4d 208 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 209 */
Gaku0606 1:6a4c2f84180b 210 template<typename T>void getGyro(T *gyro);
Gaku0606 0:d36bfb8300a2 211
Gaku0606 1:6a4c2f84180b 212 /**
Gaku0606 2:4c7bc164cc4d 213 @bref 磁束密度を取得します.
Gaku0606 1:6a4c2f84180b 214 @param mx x軸方向の磁束密度[uT]
Gaku0606 1:6a4c2f84180b 215 @param my y軸方向の磁束密度[uT]
Gaku0606 1:6a4c2f84180b 216 @param mz z軸方向の磁束密度[uT]
Gaku0606 2:4c7bc164cc4d 217 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 218 */
Gaku0606 1:6a4c2f84180b 219 template<typename T>void getMag(T *mx, T *my, T *mz);
Gaku0606 2:4c7bc164cc4d 220
Gaku0606 1:6a4c2f84180b 221 /**
Gaku0606 2:4c7bc164cc4d 222 @bref 磁束密度を取得します.
Gaku0606 1:6a4c2f84180b 223 @param mag 各軸方向の磁束密度[uT],x,y,zの順
Gaku0606 2:4c7bc164cc4d 224 @note 型はfloat でも doubleでも構いません.
Gaku0606 1:6a4c2f84180b 225 */
Gaku0606 1:6a4c2f84180b 226 template<typename T>void getMag(T *mag);
Gaku0606 0:d36bfb8300a2 227
Gaku0606 1:6a4c2f84180b 228 /**
Gaku0606 2:4c7bc164cc4d 229 @bref 角速度と加速度を同時に取得します.
Gaku0606 1:6a4c2f84180b 230 @param imu データを入れる配列,角速度[degree/s],加速度[G]の順
Gaku0606 2:4c7bc164cc4d 231 @note 配列数は6以上で
Gaku0606 1:6a4c2f84180b 232 */
Gaku0606 1:6a4c2f84180b 233 template<typename T>void getGyroAcc(T *imu);//gx,gy,gz,ax,ay,az
Gaku0606 0:d36bfb8300a2 234
Gaku0606 1:6a4c2f84180b 235 private:
Gaku0606 0:d36bfb8300a2 236 static char _addr;
Gaku0606 0:d36bfb8300a2 237 static double acc_coef;//coefficient
Gaku0606 0:d36bfb8300a2 238 static double gyro_coef;
Gaku0606 0:d36bfb8300a2 239 static double mag_coef;
Gaku0606 0:d36bfb8300a2 240 static double acc_offset[3];
Gaku0606 0:d36bfb8300a2 241 static double gyro_offset[3];
Gaku0606 0:d36bfb8300a2 242 static double mag_offset[3];
Gaku0606 0:d36bfb8300a2 243 };
Gaku0606 0:d36bfb8300a2 244
Gaku0606 0:d36bfb8300a2 245
Gaku0606 0:d36bfb8300a2 246
Gaku0606 0:d36bfb8300a2 247 inline void mpu9250::writeReg(char addr, char data){
Gaku0606 0:d36bfb8300a2 248 _nine->write( addr | WRITE_FLAG, &data, 1, false);
Gaku0606 0:d36bfb8300a2 249 }
Gaku0606 0:d36bfb8300a2 250 inline void mpu9250::writeReg(char addr, char reg, char data){
Gaku0606 0:d36bfb8300a2 251 char temp[2] = { reg, data};
Gaku0606 0:d36bfb8300a2 252 _nine->write(addr | WRITE_FLAG, temp, 2, false);
Gaku0606 0:d36bfb8300a2 253 }
Gaku0606 0:d36bfb8300a2 254 inline char mpu9250::readReg(char addr, char reg){
Gaku0606 0:d36bfb8300a2 255 char buff[1];
Gaku0606 0:d36bfb8300a2 256 writeReg(addr, reg);
Gaku0606 0:d36bfb8300a2 257 _nine->read(addr | READ_FLAG, buff, 1, true);
Gaku0606 0:d36bfb8300a2 258 return buff[0];
Gaku0606 0:d36bfb8300a2 259 }
Gaku0606 0:d36bfb8300a2 260 inline void mpu9250::readReg(char addr, char start_reg, char* buff, char num){
Gaku0606 0:d36bfb8300a2 261 writeReg(addr, start_reg);
Gaku0606 0:d36bfb8300a2 262 _nine->read(addr | READ_FLAG, buff, num, true);
Gaku0606 0:d36bfb8300a2 263 }
Gaku0606 0:d36bfb8300a2 264
Gaku0606 0:d36bfb8300a2 265 #endif