mpu9250のライブラリ、I2Cを利用。開発段階のため微妙
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Sun Jul 17 2022 02:56:29 by 1.7.2