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:
Wed Dec 06 13:11:39 2017 +0000
Revision:
16:bea48f4ac712
Parent:
15:d8b263a8138e
setOffset?????

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