Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: QEI accelerator bit_test cyclic_io cyclic_var cylinder event_var limit mbed mecanum motor_drive pid pid_encoder rs422_put sbdbt servo
Fork of 17robo_fuzi by
bno055_lib.h
00001 #ifndef BNO055_H 00002 #define BNO055_H 00003 00004 //UART通信に使用するバッファの最大サイズ 00005 #define BNO055_UART_BUF_MAXLEN 24 //[byte] 00006 //I2Cデフォルトスレーブアドレス 00007 #define BNO055_I2C_DEFADDR 0x28 00008 00009 #define BNO055_PAGE_ID 0x07 00010 00011 #define BNO055P0_CHIP_ID 0x00 00012 #define BNO055P0_ACC_ID 0x01 00013 #define BNO055P0_MAG_ID 0x02 00014 #define BNO055P0_GYR_ID 0x03 00015 #define BNO055P0_SW_REV_ID_LSB 0x04 00016 #define BNO055P0_SW_REV_ID_MSB 0x05 00017 #define BNO055P0_BL_REV_ID 0x06 00018 #define BNO055P0_ACC_DATA_X_LSB 0x08 00019 #define BNO055P0_ACC_DATA_X_MSB 0x09 00020 #define BNO055P0_ACC_DATA_Y_LSB 0x0A 00021 #define BNO055P0_ACC_DATA_Y_MSB 0x0B 00022 #define BNO055P0_ACC_DATA_Z_LSB 0x0C 00023 #define BNO055P0_ACC_DATA_Z_MSB 0x0D 00024 #define BNO055P0_MAG_DATA_X_LSB 0x0E 00025 #define BNO055P0_MAG_DATA_X_MSB 0x0F 00026 #define BNO055P0_MAG_DATA_Y_LSB 0x10 00027 #define BNO055P0_MAG_DATA_Y_MSB 0x11 00028 #define BNO055P0_MAG_DATA_Z_LSB 0x12 00029 #define BNO055P0_MAG_DATA_Z_MSB 0x13 00030 #define BNO055P0_GYR_DATA_X_LSB 0x14 00031 #define BNO055P0_GYR_DATA_X_MSB 0x15 00032 #define BNO055P0_GYR_DATA_Y_LSB 0x16 00033 #define BNO055P0_GYR_DATA_Y_MSB 0x17 00034 #define BNO055P0_GYR_DATA_Z_LSB 0x18 00035 #define BNO055P0_GYR_DATA_Z_MSB 0x19 00036 #define BNO055P0_EUL_HEADING_LSB 0x1A 00037 #define BNO055P0_EUL_HEADING_MSB 0x1B 00038 #define BNO055P0_EUL_ROLL_LSB 0x1C 00039 #define BNO055P0_EUL_ROLL_MSB 0x1D 00040 #define BNO055P0_EUL_PITCH_LSB 0x1E 00041 #define BNO055P0_EUL_PITCH_MSB 0x1F 00042 #define BNO055P0_QUA_DATA_W_LSB 0x20 00043 #define BNO055P0_QUA_DATA_W_MSB 0x21 00044 #define BNO055P0_QUA_DATA_X_LSB 0x22 00045 #define BNO055P0_QUA_DATA_X_MSB 0x23 00046 #define BNO055P0_QUA_DATA_Y_LSB 0x24 00047 #define BNO055P0_QUA_DATA_Y_MSB 0x25 00048 #define BNO055P0_QUA_DATA_Z_LSB 0x26 00049 #define BNO055P0_QUA_DATA_Z_MSB 0x27 00050 #define BNO055P0_LIA_DATA_X_LSB 0x28 00051 #define BNO055P0_LIA_DATA_X_MBS 0x29 00052 #define BNO055P0_LIA_DATA_Y_LSB 0x2A 00053 #define BNO055P0_LIA_DATA_Y_MBS 0x2B 00054 #define BNO055P0_LIA_DATA_Z_LSB 0x2C 00055 #define BNO055P0_LIA_DATA_Z_MBS 0x2D 00056 #define BNO055P0_GRV_DATA_X_LSB 0x2E 00057 #define BNO055P0_GRV_DATA_X_MSB 0x2F 00058 #define BNO055P0_GRV_DATA_Y_LSB 0x30 00059 #define BNO055P0_GRV_DATA_Y_MSB 0x31 00060 #define BNO055P0_GRV_DATA_Z_LSB 0x32 00061 #define BNO055P0_GRV_DATA_Z_MSB 0x33 00062 #define BNO055P0_TEMP 0x34 00063 #define BNO055P0_CALIB_STAT 0x35 00064 #define BNO055P0_ST_RESULT 0x36 00065 #define BNO055P0_INT_STA 0x37 00066 #define BNO055P0_SYS_CLK_STATUS 0x38 00067 #define BNO055P0_SYS_STATUS 0x39 00068 #define BNO055P0_SYS_ERR 0x3A 00069 #define BNO055P0_UNIT_SEL 0x3B 00070 #define BNO055P0_OPR_MODE 0x3D 00071 #define BNO055P0_PWR_MODE 0x3E 00072 #define BNO055P0_SYS_TRIGGER 0x3F 00073 #define BNO055P0_TEMP_SOURCE 0x40 00074 #define BNO055P0_AXIS_MAP_CONFIG 0x41 00075 #define BNO055P0_AXIS_MAP_SIGN 0x42 00076 #define BNO055P0_ACC_OFFSET_X_LSB 0x55 00077 #define BNO055P0_ACC_OFFSET_X_MSB 0x56 00078 #define BNO055P0_ACC_OFFSET_Y_LSB 0x57 00079 #define BNO055P0_ACC_OFFSET_Y_MSB 0x58 00080 #define BNO055P0_ACC_OFFSET_Z_LSB 0x59 00081 #define BNO055P0_ACC_OFFSET_Z_MSB 0x5A 00082 #define BNO055P0_MAG_OFFSET_X_LSB 0x5B 00083 #define BNO055P0_MAG_OFFSET_X_MSB 0x5C 00084 #define BNO055P0_MAG_OFFSET_Y_LSB 0x5D 00085 #define BNO055P0_MAG_OFFSET_Y_MSB 0x5E 00086 #define BNO055P0_MAG_OFFSET_Z_LSB 0x5F 00087 #define BNO055P0_MAG_OFFSET_Z_MSB 0x60 00088 #define BNO055P0_GYR_OFFSET_X_LSB 0x61 00089 #define BNO055P0_GYR_OFFSET_X_MSB 0x62 00090 #define BNO055P0_GYR_OFFSET_Y_LSB 0x63 00091 #define BNO055P0_GYR_OFFSET_Y_MSB 0x64 00092 #define BNO055P0_GYR_OFFSET_Z_LSB 0x65 00093 #define BNO055P0_GYR_OFFSET_Z_MSB 0x66 00094 #define BNO055P0_ACC_RADIUS_LSB 0x67 00095 #define BNO055P0_ACC_RADIUS_MSB 0x68 00096 #define BNO055P0_MAG_RADIUS_LSB 0x69 00097 #define BNO055P0_MAG_RADIUS_MSB 0x6A 00098 00099 #define BNO055P1_ACC_CONFIG 0x08 00100 #define BNO055P1_MAG_CONFIG 0x09 00101 #define BNO055P1_GYR_CONFIG_0 0x0A 00102 #define BNO055P1_GYR_CONFIG_1 0x0B 00103 #define BNO055P1_ACC_SLEEP_CONFIG 0x0C 00104 #define BNO055P1_GYR_SLEEP_CONFIG 0x0D 00105 #define BNO055P1_INT_MSK 0x0F 00106 #define BNO055P1_INT_EN 0x10 00107 #define BNO055P1_ACC_AM_THRES 0x11 00108 #define BNO055P1_ACC_INT_SETTINGS 0x12 00109 #define BNO055P1_ACC_HG_DURATION 0x13 00110 #define BNO055P1_ACC_HG_THRES 0x14 00111 #define BNO055P1_ACC_NM_THRES 0x15 00112 #define BNO055P1_ACC_NM_SET 0x16 00113 #define BNO055P1_GYR_INT_SETING 0x17 00114 #define BNO055P1_GYR_HR_X_SET 0x18 00115 #define BNO055P1_GYR_DUR_X 0x19 00116 #define BNO055P1_GYR_HR_Y_SET 0x1A 00117 #define BNO055P1_GYR_DUR_Y 0x1B 00118 #define BNO055P1_GYR_HR_Z_SET 0x1C 00119 #define BNO055P1_GYR_DUR_Z 0x1D 00120 #define BNO055P1_GYR_AM_THRES 0x1E 00121 #define BNO055P1_GYR_AM_SET 0x1F 00122 00123 class BNO055_CTRL{ 00124 public: 00125 BNO055_CTRL(); 00126 virtual ~BNO055_CTRL(); 00127 protected: 00128 bool page1; 00129 char *ary; 00130 char lastError; 00131 char lastLength; 00132 public: 00133 char getNowPage(); 00134 char getLastError(); 00135 char getLastLength(); 00136 virtual void init(); 00137 virtual char rr(bool isPage1, char regAddr); 00138 virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length); 00139 virtual char wr(bool isPage1, char regAddr, char wBytes); 00140 virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length); 00141 }; 00142 00143 class BNO055_UART_CTRL : public BNO055_CTRL{ 00144 public: 00145 BNO055_UART_CTRL(RawSerial *uart); 00146 virtual ~BNO055_UART_CTRL(); 00147 private: 00148 RawSerial *iface; 00149 short rxd; 00150 bool read_mark; 00151 00152 void rxInterrupt(); 00153 public: 00154 virtual void init(); 00155 virtual char rr(bool isPage1, char regAddr); 00156 virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length); 00157 virtual char wr(bool isPage1, char regAddr, char wBytes); 00158 virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length); 00159 }; 00160 00161 class BNO055_I2C_CTRL : public BNO055_CTRL{ 00162 public: 00163 BNO055_I2C_CTRL(I2C *iic, char addr, unsigned int freq); 00164 virtual ~BNO055_I2C_CTRL(); 00165 private: 00166 I2C *iface; 00167 char i2c_writeAddr; 00168 char i2c_readAddr; 00169 unsigned int i2c_freq; 00170 public: 00171 virtual void init(); 00172 virtual char rr(bool isPage1, char regAddr); 00173 virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length); 00174 virtual char wr(bool isPage1, char regAddr, char wBytes); 00175 virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length); 00176 }; 00177 00178 class BOARDC_BNO055{ 00179 public: 00180 BOARDC_BNO055(PinName tx, PinName rx); 00181 BOARDC_BNO055(RawSerial *uart); 00182 BOARDC_BNO055(PinName scl, PinName sda, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000); 00183 BOARDC_BNO055(I2C *iic, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000); 00184 ~BOARDC_BNO055(); 00185 00186 private: 00187 BNO055_CTRL *ctrl; 00188 float scaleACC; 00189 float scaleMAG; //fixed 00190 float scaleGYRO; 00191 float scaleTEMP; 00192 float scaleEuler; 00193 float scaleLIA; //=scaleACC 00194 float scaleGV; //=scaleACC 00195 double scaleQuaternion; //fixed 00196 unsigned char axisRemap; 00197 unsigned char axisSign; 00198 bool clkExt; 00199 00200 public: 00201 char initialize(bool resetIface=true); 00202 char getIfaceLastError(); 00203 char getIfaceLastLength(); 00204 00205 char customRead(bool isPage1, char regAddr); 00206 char customReadC(bool isPage1, char startRegAddr, char *receiveBytes, unsigned char length); 00207 char customWrite(bool isPage1, char regAddr, char wBytes); 00208 char customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length); 00209 00210 char getPage(); 00211 void setPage(unsigned char pageNo); 00212 00213 char getChipID(); 00214 char getAccChipID(); 00215 char getMagChipID(); 00216 char getGyroChipID(); 00217 00218 short getRevision(); 00219 char getBootRevision(); 00220 00221 float getAccScale(); 00222 float getMagScale(); 00223 float getGyroScale(); 00224 float getTempScale(); 00225 float getEulerScale(); 00226 float getLinearScale(); 00227 float getGVScale(); 00228 double getQuaternionScale(); 00229 00230 void getAccDataAll(short &accX, short &accY, short &accZ); 00231 short getAccDataX(); 00232 short getAccDataY(); 00233 short getAccDataZ(); 00234 00235 void getMagDataAll(short &magX, short &magY, short &magZ); 00236 short getMagDataX(); 00237 short getMagDataY(); 00238 short getMagDataZ(); 00239 00240 void getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ); 00241 short getGyroDataX(); 00242 short getGyroDataY(); 00243 short getGyroDataZ(); 00244 00245 void getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch); 00246 short getEulerDataHeading(); 00247 short getEulerDataYaw(); 00248 short getEulerDataRoll(); 00249 short getEulerDataPitch(); 00250 00251 void get9Axis(short *box); 00252 void get9AxisAndEUL(short *box); 00253 00254 void getQuaternion(short &q1, short &q2, short &q3, short &q4); 00255 00256 void getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ); 00257 short getLinearAccDataX(); 00258 short getLinearAccDataY(); 00259 short getLinearAccDataZ(); 00260 00261 void getGVectorDataAll(short &gvX, short &gvY, short &gvZ); 00262 short getGVectorDataX(); 00263 short getGVectorDataY(); 00264 short getGVectorDataZ(); 00265 00266 char getTemperature(); 00267 00268 void getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro); 00269 char getCalibStatusSys(); 00270 char getCalibStatusAcc(); 00271 char getCalibStatusMag(); 00272 char getCalibStatusGyro(); 00273 00274 char getSelfTestResultAll(); 00275 bool getSelfTestResultMCU(); 00276 bool getSelfTestResultAcc(); 00277 bool getSelfTestResultMag(); 00278 bool getSelfTestResultGyro(); 00279 00280 char triggeredIntALL(); 00281 bool triggeredACC_NM(); 00282 bool triggeredACC_AM(); 00283 bool triggeredACC_HIGH_G(); 00284 bool triggeredGYR_HIGH_RATE(); 00285 bool triggeredGYRO_AM(); 00286 00287 bool isSystemClockFixed(); 00288 00289 char getSystemStatus(); 00290 char getSystemError(); 00291 00292 char getUNIT_SEL(); 00293 char setUNIT_SEL(char selectValue); 00294 char setUNIT_AccUnit(bool isMeterPerSec2=true); 00295 char setUNIT_GyroUnit(bool isDps=true); 00296 char setUNIT_EulerUnit(bool isDegrees=true); 00297 char setUNIT_Temperature(bool isCelsius=true); 00298 char setUNIT_OrientationMode(bool ori_Android=true); 00299 00300 char getOperationMode(); 00301 char setOperationMode(char modeValue); 00302 char setOperation_CONFIG(); 00303 char setOperation_ACCONRY(); 00304 char setOperation_MAGONRY(); 00305 char setOperation_GYROONRY(); 00306 char setOperation_ACCMAG(); 00307 char setOperation_ACCGYRO(); 00308 char setOperation_MAGGYRO(); 00309 char setOperation_AMG(); 00310 char setOperation_Fusion_IMU(); 00311 char setOperation_Fusion_COMPASS(); 00312 char setOperation_Fusion_M4G(); 00313 char setOperation_Fusion_NDOF_FMC_OFF(); 00314 char setOperation_Fusion_NDOF(); 00315 00316 char getPowerMode(); 00317 char setPowerMode(unsigned char modeValue); 00318 char setPowerMode_Normal(); 00319 char setPowerMode_LowPower(); 00320 char setPowerMode_Suspend(); 00321 00322 char setSysTrigger(char regVal); 00323 char setSys_ExternalCrystal(bool isExternal=true); 00324 char resetInterrupt(); 00325 char soft_reset(); 00326 char execSelfTest(); 00327 00328 char getTempSource(); 00329 char setTempSource(bool Accelerometer=true); 00330 00331 char getAxisMapConfig(); 00332 char setAxisMapConfig(char val); 00333 char getAxisMapSign(); 00334 char setAxisMapSign(char val); 00335 char setAxisRemap_topview_topleft(); 00336 char setAxisRemap_topview_topright(); 00337 char setAxisRemap_topview_bottomleft(); 00338 char setAxisRemap_topview_bottomright(); 00339 char setAxisRemap_bottomview_topleft(); 00340 char setAxisRemap_bottomview_topright(); 00341 char setAxisRemap_bottomview_bottomleft(); 00342 char setAxisRemap_bottomview_bottomright(); 00343 char getAxisRemap_type(); 00344 00345 void getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ); 00346 float getAccOffsetX(); 00347 float getAccOffsetY(); 00348 float getAccOffsetZ(); 00349 char setAccOffsetAll(float offsetX, float offsetY, float offsetZ); 00350 char setAccOffsetX(float offset); 00351 char setAccOffsetY(float offset); 00352 char setAccOffsetZ(float offset); 00353 00354 void getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ); 00355 float getMagOffsetX(); 00356 float getMagOffsetY(); 00357 float getMagOffsetZ(); 00358 char setMagOffsetAll(float offsetX, float offsetY, float offsetZ); 00359 char setMagOffsetX(float offset); 00360 char setMagOffsetY(float offset); 00361 char setMagOffsetZ(float offset); 00362 00363 void getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ); 00364 float getGyroOffsetX(); 00365 float getGyroOffsetY(); 00366 float getGyroOffsetZ(); 00367 char setGyroOffsetAll(float offsetX, float offsetY, float offsetZ); 00368 char setGyroOffsetX(float offset); 00369 char setGyroOffsetY(float offset); 00370 char setGyroOffsetZ(float offset); 00371 00372 short getAccRadius(); 00373 char setAccRadius(short LSB); 00374 00375 short getMagRadius(); 00376 char setMagRadius(short LSB); 00377 00378 char getAccConfig(); 00379 char setAccConfig(char regVal); 00380 char setAccConfig(char gRange, char bandWidth, char powMode); 00381 char setAccRange(unsigned char G); 00382 00383 char getMagConfig(); 00384 char setMagConfig(char regVal); 00385 char setMagConfig(char rate, char oprMode, char powMode); 00386 00387 char getGyroConfig_0(); 00388 char setGyroConfig_0(char regVal); 00389 char setGyroConfig_0(char range, char bandWidth); 00390 char getGyroConfig_1(); 00391 char setGyroConfig_1(char powMode); 00392 char setGyroRange(unsigned short dps); 00393 00394 char getAccSleepConfig(); 00395 char setAccSleepConfig(char regVal); 00396 char setAccSleepConfig(char duration, char mode); 00397 00398 char getGyroSleepConfig(); 00399 char setGyroSleepConfig(char regVal); 00400 char setGyroSleepConfig(char autoSleepDuration, char duration); 00401 00402 char getInterruptMask(); 00403 char setInterruptMask(char mask); 00404 00405 char getInterruptEnable(); 00406 char setInterruptEnable(char mask); 00407 00408 float getAccAnyMotionThreashold(bool ismg=true); 00409 char setAccAnyMotionThreashold(bool ismg, float threashold); 00410 00411 char getAccInterruptSettings(); 00412 char setAccInterruptSettings(char settings); 00413 00414 unsigned short getAccHighGduration(); 00415 char setAccHighGduration(short ms); 00416 00417 float getAccHighGThreashold(bool ismg=true); 00418 char setAccHighGThreashold(bool ismg, float threashold); 00419 00420 float getAccNMThreashold(bool ismg=true); 00421 char setAccNMThreashold(bool ismg, float threashold); 00422 00423 char getAccNMsetting(); 00424 char setAccNMsetting(char setting); 00425 00426 char getGyroInterruptSettings(); 00427 char setGyroInterruptSettings(char settings); 00428 00429 char getGyroHighRateXsetting(); 00430 void getGyroHighRateXsetting_dps(float &hyst, float &thres); 00431 char setGyroHighRateXsetting(char setting); 00432 char setGyroHighRateXsetting_dps(float hystVal, float thresVal); 00433 float getGyroHighRateXduration(); 00434 char setGyroHighRateXduration(float duration); 00435 00436 char getGyroHighRateYsetting(); 00437 void getGyroHighRateYsetting_dps(float &hyst, float &thres); 00438 char setGyroHighRateYsetting(char setting); 00439 char setGyroHighRateYsetting_dps(float hystVal, float thresVal); 00440 float getGyroHighRateYduration(); 00441 char setGyroHighRateYduration(float duration); 00442 00443 char getGyroHighRateZsetting(); 00444 void getGyroHighRateZsetting_dps(float &hyst, float &thres); 00445 char setGyroHighRateZsetting(char setting); 00446 char setGyroHighRateZsetting_dps(float hystVal, float thresVal); 00447 float getGyroHighRateZduration(); 00448 char setGyroHighRateZduration(float duration); 00449 00450 float getGyroAnyMotionThreashold(); 00451 char setGyroAnyMotionThreashold(float threashold); 00452 00453 char getAccAnyMotionSetting(); 00454 char setAccAnyMotionSetting(char setting); 00455 }; 00456 00457 #endif 00458 00459 00460 //CLASS:BNO055_CTRL////////////////////////////////////////////////// 00461 /* ------------------------------------------------------------------ 00462 * BNO055_UART_CTRLクラスとBNO055_I2C_CTRLクラスの基底クラス(インターフェース) 00463 * UARTとI2Cをヘッダ書き換えなしで実現するために無理するとこうなった 00464 */ 00465 00466 /* ================================================================== 00467 * デフォルトコンストラクタ 00468 */ 00469 BNO055_CTRL::BNO055_CTRL(){ 00470 lastError = 0; 00471 lastLength = 0; 00472 } 00473 00474 /* ================================================================== 00475 * デフォルトデストラクタ 00476 */ 00477 BNO055_CTRL::~BNO055_CTRL(){} 00478 00479 /* ================================================================== 00480 * 現在のページIDを取得する 00481 */ 00482 char BNO055_CTRL::getNowPage(){ 00483 return page1 ? 1 : 0; 00484 } 00485 00486 /* ================================================================== 00487 * UARTまたはI2Cで取得した最後のエラーを取得する:通信がうまくいかないときの原因追及 00488 */ 00489 char BNO055_CTRL::getLastError(){ 00490 return lastError; 00491 } 00492 00493 /* ================================================================== 00494 * UARTまたはI2Cで通信した際の受信バイト数を取得する:通信がうまくいかないときの原因追及 00495 */ 00496 char BNO055_CTRL::getLastLength(){ 00497 return lastLength; 00498 } 00499 00500 /* ================================================================== 00501 * 未実装関数(子クラスで実装される) 00502 */ 00503 void BNO055_CTRL::init(){} 00504 char BNO055_CTRL::rr(bool isPage1, char regAddr){return 0;} 00505 char BNO055_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){return 0;} 00506 char BNO055_CTRL::wr(bool isPage1, char regAddr, char wBytes){return 0;} 00507 char BNO055_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){return 0;} 00508 00509 00510 00511 00512 00513 00514 00515 00516 00517 00518 //CLASS:BNO055_UART_CTRL///////////////////////////////////////////// 00519 /* ------------------------------------------------------------------ 00520 * BNO055_CTRLクラス(インターフェース)を継承(実装)したクラス 00521 * UARTで命令を送受信するためのコントロール用クラス 00522 */ 00523 00524 /* ================================================================== 00525 * BNO055をUARTでコントロールするためのクラス:コンストラクタ 00526 */ 00527 BNO055_UART_CTRL::BNO055_UART_CTRL(RawSerial *uart){ 00528 iface = uart; 00529 rxd = 0xFFFF; 00530 read_mark = true; 00531 00532 page1 = true; 00533 00534 ary = new char[BNO055_UART_BUF_MAXLEN + 5]; 00535 memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); 00536 lastError = 0; 00537 } 00538 00539 /* ================================================================== 00540 * BNO055をUARTでコントロールするためのクラス:デストラクタ 00541 */ 00542 BNO055_UART_CTRL::~BNO055_UART_CTRL(){ 00543 delete iface; 00544 } 00545 00546 /* ================================================================== 00547 * UART受信割り込み用関数 00548 * RX受信トリガがONになると、カウンタを加算する 00549 */ 00550 void BNO055_UART_CTRL::rxInterrupt(){ 00551 if(read_mark){ 00552 rxd = iface->getc(); 00553 read_mark = false; 00554 } 00555 } 00556 00557 /* ================================================================== 00558 * <UART> 00559 * レジスタの内容を読み取り(1byteのみ) 00560 * ------------------------------------------------------------------ 00561 * returns: 00562 * -1 失敗 00563 * それ以外 成功した際に取得したデータ 00564 */ 00565 char BNO055_UART_CTRL::rr(bool isPage1, char regAddr){ 00566 //ページが異なるならページ変更命令を発行 00567 if(page1 != isPage1){ 00568 wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0); 00569 page1 = isPage1; 00570 } 00571 00572 //送信可能になるまで待つ 00573 do{wait_ms(1);}while(!iface->writeable()); 00574 00575 //コマンドをセット 00576 ary[0] = 0xAA; //StartByte(固定) 00577 ary[1] = 0x01; //読み取り 00578 ary[2] = regAddr; //レジスタアドレス 00579 ary[3] = 1; //バイト長 00580 00581 //送信 00582 iface->putc(ary[0]); 00583 iface->putc(ary[1]); 00584 iface->putc(ary[2]); 00585 iface->putc(ary[3]); 00586 00587 //レスポンスを受信するまで待つ 00588 while(read_mark) wait_us(100); 00589 00590 lastError = 0; 00591 memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア 00592 00593 ary[0] = rxd & 0xFF; 00594 00595 //残りを受信 00596 int i = 1; 00597 int cnt = (ary[0] == 0xBB) ? 2 : 1; 00598 while(i < cnt && iface->readable()){ 00599 ary[i++] = iface->getc(); 00600 } 00601 00602 //レスポンスが0xBB以外:通信失敗 00603 if(ary[0] != 0xBB){ 00604 lastLength = 2; 00605 lastError = ary[1]; 00606 //受信用割り込みマークをリセット 00607 rxd = 0xFFFF; 00608 read_mark = true; 00609 return -1; 00610 } 00611 00612 lastLength = ary[1] + 2; 00613 00614 //受信用割り込みマークをリセット 00615 rxd = 0xFFFF; 00616 read_mark = true; 00617 00618 //通信成功時、取得データを返す 00619 return ary[2]; 00620 } 00621 00622 /* ================================================================== 00623 * <UART> 00624 * レジスタの内容を読み取り(複数可) 00625 * ------------------------------------------------------------------ 00626 * returns: 00627 * -1 失敗 00628 * -2 返答バイト不一致 00629 * -4 レスポンスエラー 00630 * それ以外 成功した際の戻り値バイト数 00631 */ 00632 char BNO055_UART_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){ 00633 //読み取りバイト数が1未満またはBNO055_UART_BUF_MAXLEN以上はバッファが足りないので読み取れない 00634 if(length < 1 || length > BNO055_UART_BUF_MAXLEN) return -1; 00635 00636 //ページが異なるならページ変更命令を発行 00637 if(page1 != isPage1){ 00638 wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0); 00639 page1 = isPage1; 00640 } 00641 00642 //送信可能になるまで待つ 00643 do{wait_ms(1);}while(!iface->writeable()); 00644 00645 //コマンドをセット 00646 ary[0] = 0xAA; //StartByte(固定) 00647 ary[1] = 0x01; //読み取り 00648 ary[2] = startRegAddr; //読み取り開始レジスタアドレス 00649 ary[3] = length; //バイト長 00650 00651 //送信 00652 iface->putc(ary[0]); 00653 iface->putc(ary[1]); 00654 iface->putc(ary[2]); 00655 iface->putc(ary[3]); 00656 00657 //レスポンスを受信するまで待つ 00658 while(read_mark) wait_us(100); 00659 00660 lastError = 0; 00661 memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア 00662 00663 ary[0] = rxd & 0xFF; 00664 00665 //残りを受信 00666 int i = 1; 00667 int cnt = (ary[0] == 0xBB) ? 2 : 1; 00668 while(i < cnt && iface->readable()){ 00669 ary[i++] = iface->getc(); 00670 } 00671 00672 //レスポンスが0xBB以外:通信失敗 00673 if(ary[0] != 0xBB){ 00674 lastLength = 2; 00675 lastError = ary[1]; 00676 rxd = 0xFFFF; 00677 read_mark = true; 00678 return -1; 00679 } 00680 00681 //返答バイト長がlengthと一致しない:通信失敗 00682 if(ary[1] != length){ 00683 lastLength = ary[1]; 00684 lastError = 0; 00685 //受信用割り込みマークをリセット 00686 rxd = 0xFFFF; 00687 read_mark = true; 00688 return -2; 00689 } 00690 00691 lastLength = ary[1] + 2; 00692 00693 memcpy(receiveBytes, ary+2, ary[1]); 00694 00695 //受信用割り込みマークをリセット 00696 rxd = 0xFFFF; 00697 read_mark = true; 00698 00699 return ary[1]; 00700 } 00701 00702 /* ================================================================== 00703 * <UART> 00704 * レジスタ書き込み(1byteのみ) 00705 * ------------------------------------------------------------------ 00706 * returns: 00707 * -1 失敗 00708 * 1 成功 00709 */ 00710 char BNO055_UART_CTRL::wr(bool isPage1, char regAddr, char wBytes){ 00711 //ページが異なるならページ変更命令を発行(再帰処理) 00712 if(page1 != isPage1){ 00713 wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0); 00714 page1 = isPage1; 00715 } 00716 00717 //送信可能になるまで待つ 00718 do{wait_ms(1);}while(!iface->writeable()); 00719 00720 //コマンドをセット 00721 ary[0] = 0xAA; //StartByte(固定) 00722 ary[1] = 0x00; //書き込み 00723 ary[2] = regAddr; //レジスタアドレス 00724 ary[3] = 1; //バイト長 00725 ary[4] = wBytes; //送信データ 00726 00727 //送信 00728 iface->putc(ary[0]); 00729 iface->putc(ary[1]); 00730 iface->putc(ary[2]); 00731 iface->putc(ary[3]); 00732 iface->putc(ary[4]); 00733 00734 //システムリブートが発生するレジスタの場合は1200ms待つ 00735 if(regAddr == 0x3F) wait_ms(1200); 00736 00737 //レスポンスを受信するまで待つ 00738 while(read_mark) wait_us(100); 00739 00740 lastError = 0; 00741 memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア 00742 00743 ary[0] = rxd & 0xFF; 00744 00745 //残りを受信 00746 while(iface->readable()){ 00747 ary[1] = iface->getc(); 00748 } 00749 00750 //レスポンスが0xEE以外もしくはステータスが0x01以外:書き込み失敗 00751 if(ary[0] != 0xEE || ary[1] != 0x01){ 00752 lastLength = 2; 00753 lastError = ary[1]; 00754 //受信用割り込みマークをリセット 00755 rxd = 0xFFFF; 00756 read_mark = true; 00757 return -1; 00758 } 00759 00760 //受信用割り込みマークをリセット 00761 rxd = 0xFFFF; 00762 read_mark = true; 00763 00764 return 1; 00765 } 00766 00767 /* ================================================================== 00768 * <UART> 00769 * レジスタ書き込み(複数可) 00770 * ------------------------------------------------------------------ 00771 * returns: 00772 * -1 失敗 00773 * -4 レスポンスエラー 00774 * 1 成功 00775 */ 00776 char BNO055_UART_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){ 00777 //書き込みバイト数が1未満またはBNO055_UART_BUF_MAXLEN以上はバッファが足りないので読み取れない 00778 if(length < 1 || length > BNO055_UART_BUF_MAXLEN) return -1; 00779 00780 //ページが異なるならページ変更命令を発行(再帰処理) 00781 if(page1 != isPage1){ 00782 wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0); 00783 page1 = isPage1; 00784 } 00785 00786 //送信可能になるまで待つ 00787 do{wait_ms(1);}while(!iface->writeable()); 00788 00789 //コマンドをセット 00790 ary[0] = 0xAA; //StartByte(固定) 00791 ary[1] = 0x00; //書き込み 00792 ary[2] = startRegAddr; //レジスタアドレス 00793 ary[3] = length; //バイト長 00794 00795 //前部分送信 00796 iface->putc(ary[0]); 00797 iface->putc(ary[1]); 00798 iface->putc(ary[2]); 00799 iface->putc(ary[3]); 00800 00801 //データ内容送信 00802 for(int cnt=0; cnt<length; cnt++){ 00803 iface->putc(Bytes[cnt]); 00804 } 00805 00806 //レスポンスを受信するまで待つ 00807 while(read_mark) wait_us(100); 00808 00809 lastError = 0; 00810 memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア 00811 00812 ary[0] = rxd & 0xFF; 00813 00814 //残りを受信 00815 while(iface->readable()){ 00816 ary[1] = iface->getc(); 00817 } 00818 00819 //レスポンスが0xEE以外もしくはステータスが0x01以外:書き込み失敗 00820 if(ary[0] != 0xEE || ary[1] != 0x01){ 00821 lastLength = 2; 00822 lastError = ary[1]; 00823 //受信用割り込みマークをリセット 00824 rxd = 0xFFFF; 00825 read_mark = true; 00826 return -1; 00827 } 00828 00829 //受信用割り込みマークをリセット 00830 rxd = 0xFFFF; 00831 read_mark = true; 00832 00833 return 1; 00834 } 00835 00836 /* ================================================================== 00837 * <UART> 00838 * インターフェース設定を初期化する 00839 */ 00840 void BNO055_UART_CTRL::init(){ 00841 iface->format(); //8N1 = default 00842 iface->baud(115200); 00843 wait_ms(5); 00844 iface->attach(this, &BNO055_UART_CTRL::rxInterrupt); 00845 00846 //送信可能になるまで待つ 00847 do{wait_ms(1);}while(!iface->writeable()); 00848 00849 //UARTリセット時に0xFFがつく現象および前回送信時の残りがあるため同期がとれない 00850 //複数回読み取りを行い、正しいレスポンス(0xBB)が返るまで送信 00851 iface->putc(0x01); //dummy 00852 iface->putc(0x01); //dummy 00853 iface->putc(0x01); //dummy 00854 iface->putc(0x01); //dummy 00855 00856 //レスポンスを受信するまで待つ 00857 while(read_mark) wait_us(100); 00858 00859 char rslt = rxd & 0xFF; //レスポンス 00860 00861 do{ 00862 //レスポンスが異常:残りの情報を無視 00863 if(rslt != 0xBB){ 00864 while(iface->readable()){ 00865 iface->getc(); 00866 } 00867 } 00868 00869 //受信用割り込みマークをリセット 00870 rxd = 0xFFFF; 00871 read_mark = true; 00872 00873 //送信可能になるまで待つ 00874 do{wait_ms(5);}while(!iface->writeable()); 00875 00876 iface->putc(0xAA); //START 00877 iface->putc(0x01); //読み取り 00878 iface->putc(0x07); //ページID 00879 iface->putc(0x01); //length 1byte 00880 00881 //レスポンスを受信するまで待つ 00882 while(read_mark) wait_us(100); 00883 00884 rslt = rxd & 0xFF; //レスポンス 00885 00886 }while(rslt != 0xBB); 00887 00888 //残りの情報を無視 00889 while(iface->readable()){ 00890 iface->getc(); 00891 } 00892 00893 //受信用割り込みマークをリセット 00894 rxd = 0xFFFF; 00895 read_mark = true; 00896 } 00897 00898 00899 00900 00901 00902 00903 00904 00905 //CLASS:BNO055_I2C_CTRL////////////////////////////////////////////// 00906 /* ------------------------------------------------------------------ 00907 * BNO055_CTRLクラス(インターフェース)を継承(実装)したクラス 00908 * I2Cで命令を送受信するためのコントロール用クラス 00909 */ 00910 00911 /* ================================================================== 00912 * BNO055をI2Cでコントロールするためのクラス:コンストラクタ 00913 */ 00914 BNO055_I2C_CTRL::BNO055_I2C_CTRL(I2C* iic, char addr, unsigned int freq){ 00915 iface = iic; 00916 i2c_writeAddr = addr << 1; 00917 i2c_readAddr = i2c_writeAddr + 1; 00918 i2c_freq = freq; 00919 page1 = true; 00920 ary = new char[2]; 00921 memset(ary, 0, 2); 00922 lastError = 0; 00923 } 00924 00925 /* ================================================================== 00926 * BNO055をI2Cでコントロールするためのクラス:デストラクタ 00927 */ 00928 BNO055_I2C_CTRL::~BNO055_I2C_CTRL(){ 00929 delete iface; 00930 delete[] ary; 00931 } 00932 00933 /* ================================================================== 00934 * <I2C> 00935 * レジスタの内容を読み取り(1byteのみ) 00936 */ 00937 char BNO055_I2C_CTRL::rr(bool isPage1, char regAddr){ 00938 //ページが異なるならページ変更命令を発行 00939 if(page1 != isPage1){ 00940 ary[0] = BNO055_PAGE_ID; 00941 ary[1] = (isPage1) ? 1 : 0; 00942 page1 = isPage1; 00943 iface->write(i2c_writeAddr, ary, 2); 00944 } 00945 00946 ary[0] = regAddr; 00947 iface->write(i2c_writeAddr, ary, 1, true); 00948 iface->read(i2c_readAddr, ary, 1, false); 00949 00950 return ary[0]; 00951 } 00952 00953 /* ================================================================== 00954 * <I2C> 00955 * レジスタの内容を読み取り(複数可) 00956 */ 00957 char BNO055_I2C_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){ 00958 //読み取りバイト数が1未満 00959 if(length < 1) return -1; 00960 00961 //ページが異なるならページ変更命令を発行 00962 if(page1 != isPage1){ 00963 ary[0] = BNO055_PAGE_ID; 00964 ary[1] = (isPage1) ? 1 : 0; 00965 page1 = isPage1; 00966 iface->write(i2c_writeAddr, ary, 2); 00967 } 00968 00969 ary[0] = startRegAddr; 00970 iface->write(i2c_writeAddr, ary, 1, true); 00971 iface->read(i2c_readAddr, receiveBytes, length, false); 00972 00973 return receiveBytes[0]; 00974 } 00975 00976 /* ================================================================== 00977 * <I2C> 00978 * レジスタ書き込み(1byteのみ) 00979 */ 00980 char BNO055_I2C_CTRL::wr(bool isPage1, char regAddr, char wBytes){ 00981 //ページが異なるならページ変更命令を発行 00982 if(page1 != isPage1){ 00983 ary[0] = BNO055_PAGE_ID; 00984 ary[1] = (isPage1) ? 1 : 0; 00985 page1 = isPage1; 00986 iface->write(i2c_writeAddr, ary, 2); 00987 } 00988 00989 ary[0] = regAddr; 00990 ary[1] = wBytes; 00991 00992 iface->write(i2c_writeAddr, ary, 2); 00993 00994 return ary[0]; 00995 } 00996 00997 /* ================================================================== 00998 * <I2C> 00999 * レジスタ書き込み(複数可) 01000 */ 01001 char BNO055_I2C_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){ 01002 //書き込みバイト数が1未満 01003 if(length < 1) return -1; 01004 01005 //ページが異なるならページ変更命令を発行 01006 if(page1 != isPage1){ 01007 ary[0] = BNO055_PAGE_ID; 01008 ary[1] = (isPage1) ? 1 : 0; 01009 page1 = isPage1; 01010 iface->write(i2c_writeAddr, ary, 2); 01011 } 01012 01013 ary[0] = startRegAddr; 01014 iface->write(i2c_writeAddr, ary, 1, true); 01015 iface->write(i2c_writeAddr, Bytes, length, false); 01016 01017 return Bytes[0]; 01018 } 01019 01020 /* ================================================================== 01021 * <I2C> 01022 * インターフェース設定を初期化する 01023 */ 01024 void BNO055_I2C_CTRL::init(){ 01025 iface->frequency(i2c_freq); 01026 wait_ms(5); 01027 } 01028 01029 01030 01031 01032 01033 01034 01035 01036 01037 //CLASS:BOARDC_BNO055//////////////////////////////////////////////// 01038 /* ------------------------------------------------------------------ 01039 * メインクラス 01040 * BNO055をUARTまたはI2Cで使用するための命令をまとめている 01041 * 内部にBNO055_CTRLクラスのインスタンスを持ち、コンストラクタの引数によって 01042 * UARTとI2Cのどちらを使用するか決定する 01043 */ 01044 01045 /* ================================================================== 01046 * コンストラクタ (オーバーロード+3) 01047 * UARTで使用する際のコンストラクタ:ピン別名を指定する 01048 */ 01049 BOARDC_BNO055::BOARDC_BNO055(PinName tx, PinName rx){ 01050 ctrl = new BNO055_UART_CTRL(new RawSerial(tx, rx)); 01051 01052 scaleACC = 0.01f; // = 1 / 100 01053 scaleMAG = 0.0625f; // = 1 / 16 01054 scaleGYRO = 0.0625f; // = 1 / 16 01055 scaleEuler = 0.0625f; // = 1 / 16 01056 scaleTEMP = 1.0f; 01057 scaleLIA = scaleACC; 01058 scaleGV = scaleACC; 01059 scaleQuaternion = 0.00006103515; // = 1 / (2^14) 01060 01061 clkExt = false; 01062 } 01063 01064 /* ================================================================== 01065 * コンストラクタ (オーバーロード+3) 01066 * UARTで使用する際のコンストラクタ:RawSerialクラスのインスタンスを指定する 01067 */ 01068 BOARDC_BNO055::BOARDC_BNO055(RawSerial *uart){ 01069 ctrl = new BNO055_UART_CTRL(uart); 01070 01071 scaleACC = 0.01f; // = 1 / 100 01072 scaleMAG = 0.0625f; // = 1 / 16 01073 scaleGYRO = 0.0625f; // = 1 / 16 01074 scaleEuler = 0.0625f; // = 1 / 16 01075 scaleTEMP = 1.0f; 01076 scaleLIA = scaleACC; 01077 scaleGV = scaleACC; 01078 scaleQuaternion = 0.00006103515; // = 1 / (2^14) 01079 01080 clkExt = false; 01081 } 01082 01083 /* ================================================================== 01084 * コンストラクタ (オーバーロード+3) 01085 * I2Cで使用する際のコンストラクタ:ピン別名を指定する 01086 */ 01087 BOARDC_BNO055::BOARDC_BNO055(PinName sda, PinName scl, char addr, unsigned int freq){ 01088 ctrl = new BNO055_I2C_CTRL(new I2C(sda, scl), addr, freq); 01089 01090 scaleACC = 0.01f; // = 1 / 100 01091 scaleMAG = 0.0625f; // = 1 / 16 01092 scaleGYRO = 0.0625f; // = 1 / 16 01093 scaleEuler = 0.0625f; // = 1 / 16 01094 scaleTEMP = 1.0f; 01095 scaleLIA = scaleACC; 01096 scaleGV = scaleACC; 01097 scaleQuaternion = 0.00006103515; // = 1 / (2^14) 01098 01099 clkExt = false; 01100 } 01101 01102 /* ================================================================== 01103 * コンストラクタ (オーバーロード+3) 01104 * I2Cで使用する際のコンストラクタ:I2Cクラスのインスタンスを指定する 01105 */ 01106 BOARDC_BNO055::BOARDC_BNO055(I2C* iic, char addr, unsigned int freq){ 01107 ctrl = new BNO055_I2C_CTRL(iic, addr, freq); 01108 01109 scaleACC = 0.01f; // = 1 / 100 01110 scaleMAG = 0.0625f; // = 1 / 16 01111 scaleGYRO = 0.0625f; // = 1 / 16 01112 scaleEuler = 0.0625f; // = 1 / 16 01113 scaleTEMP = 1.0f; 01114 scaleLIA = scaleACC; 01115 scaleGV = scaleACC; 01116 scaleQuaternion = 0.00006103515; // = 1 / (2^14) 01117 01118 clkExt = false; 01119 } 01120 01121 /* ================================================================== 01122 * デストラクタ 01123 */ 01124 BOARDC_BNO055::~BOARDC_BNO055(){ 01125 delete ctrl; 01126 } 01127 01128 /* ================================================================== 01129 * デフォルト設定での初期化 01130 */ 01131 char BOARDC_BNO055::initialize(bool resetIface){ 01132 if(resetIface) ctrl->init(); 01133 01134 //CONFIGモードに設定 01135 setOperation_CONFIG(); 01136 01137 //外部発振子設定,セルフテストの実行,セルフテスト完了まで待つ 01138 setSysTrigger(0x81); 01139 01140 //加速度センサーレンジ設定(+-8G) 01141 //地磁気や角速度センサーのレンジやバンドはFusionモードにより自動設定される 01142 if(!setAccRange(16)) return -1; 01143 01144 //各軸リマップ設定(BNO055の1pinマークが表側右下) 01145 if(!setAxisRemap_topview_bottomright()) return -2; 01146 01147 //単位系セット 01148 //ORI_Android_Windows : Windows 01149 //TEMP_Unit : Celcius 01150 //EUL_Unit : Degree 01151 //GYR_Unit : deg/s 01152 //ACC_Unit : m/s^2 01153 if(!setUNIT_SEL(0x00)) return -3; 01154 01155 //動作モード設定(9軸Fusionモード) 01156 if(!setOperation_Fusion_NDOF()) return -4; 01157 01158 return 0; 01159 } 01160 01161 /* ================================================================== 01162 * 通信で発生した最後のエラー番号を返す 01163 */ 01164 char BOARDC_BNO055::getIfaceLastError(){ 01165 return ctrl->getLastError(); 01166 } 01167 01168 /* ================================================================== 01169 * 通信で発生した最後のエラーの通信バイト数を返す 01170 */ 01171 char BOARDC_BNO055::getIfaceLastLength(){ 01172 return ctrl->getLastLength(); 01173 } 01174 01175 /* ================================================================== 01176 * ユーザー定義読み取り(1byte) 01177 * レジスタを指定して値を直接読み取る 01178 */ 01179 char BOARDC_BNO055::customRead(bool isPage1, char regAddr){ 01180 return ctrl->rr(isPage1, regAddr); 01181 } 01182 01183 /* ================================================================== 01184 * ユーザー定義読み取り(連続) 01185 * レジスタを指定して値を直接読み取る 01186 */ 01187 char BOARDC_BNO055::customReadC(bool isPage1, char startRegAddr, char *receiveBytes, unsigned char length){ 01188 return ctrl->rrc(isPage1, startRegAddr, receiveBytes, length); 01189 } 01190 01191 /* ================================================================== 01192 * ユーザー定義書き込み(1byte) 01193 * レジスタを指定して値を直接書き込む 01194 */ 01195 char BOARDC_BNO055::customWrite(bool isPage1, char regAddr, char wBytes){ 01196 return ctrl->wr(isPage1, regAddr, wBytes); 01197 } 01198 01199 /* ================================================================== 01200 * ユーザー定義書き込み(連続) 01201 * レジスタを指定して値を直接書き込む 01202 */ 01203 char BOARDC_BNO055::customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length){ 01204 return ctrl->wrc(isPage1, startRegAddr, Bytes, length); 01205 } 01206 01207 /* ================================================================== 01208 * レジスタ:ページIDの現在値を読む 01209 * 実際はコントロールクラスが保持している内部変数の値を返しているだけ 01210 */ 01211 char BOARDC_BNO055::getPage(){ 01212 return ctrl->getNowPage(); 01213 } 01214 01215 /* ================================================================== 01216 * レジスタ:ページIDを変更する 01217 * ページIDが現在値と同じであれば何もしない 01218 */ 01219 void BOARDC_BNO055::setPage(unsigned char pageNo){ 01220 pageNo = (pageNo == 0) ? 0 : 1; 01221 if(getPage() == pageNo) return; 01222 ctrl->wr((getPage() == 0) ? true : false, BNO055_PAGE_ID, pageNo); 01223 } 01224 01225 /* ================================================================== 01226 * レジスタ:チップIDの値を取得する 01227 */ 01228 char BOARDC_BNO055::getChipID(){ 01229 return ctrl->rr(0, BNO055P0_CHIP_ID); 01230 } 01231 01232 /* ================================================================== 01233 * レジスタ:加速度センサーIDの値を取得する 01234 */ 01235 char BOARDC_BNO055::getAccChipID(){ 01236 return ctrl->rr(0, BNO055P0_ACC_ID); 01237 } 01238 01239 /* ================================================================== 01240 * レジスタ:地磁気センサーIDの値を取得する 01241 */ 01242 char BOARDC_BNO055::getMagChipID(){ 01243 return ctrl->rr(0, BNO055P0_MAG_ID); 01244 } 01245 01246 /* ================================================================== 01247 * レジスタ:ジャイロセンサーIDの値を取得する 01248 */ 01249 char BOARDC_BNO055::getGyroChipID(){ 01250 return ctrl->rr(0, BNO055P0_GYR_ID); 01251 } 01252 01253 /* ================================================================== 01254 * レジスタ:内部ソフトウェアリビジョンの値を取得する 01255 */ 01256 short BOARDC_BNO055::getRevision(){ 01257 //連続2byte読み取り 01258 char rsv[2]; 01259 ctrl->rrc(0, BNO055P0_SW_REV_ID_LSB, rsv, 2); 01260 01261 return (rsv[1] << 8) | rsv[0]; 01262 } 01263 01264 /* ================================================================== 01265 * レジスタ:内部ブートリビジョンの値を取得する 01266 */ 01267 char BOARDC_BNO055::getBootRevision(){ 01268 return ctrl->rr(0, BNO055P0_BL_REV_ID); 01269 } 01270 01271 /* ================================================================== 01272 * 加速度センサーのRAW値に乗算する係数を取得する 01273 */ 01274 float BOARDC_BNO055::getAccScale(){ 01275 return scaleACC; 01276 } 01277 01278 /* ================================================================== 01279 * 地磁気センサーのRAW値に乗算する係数を取得する 01280 */ 01281 float BOARDC_BNO055::getMagScale(){ 01282 return scaleMAG; 01283 } 01284 01285 /* ================================================================== 01286 * 角速度センサーのRAW値に乗算する係数を取得する 01287 */ 01288 float BOARDC_BNO055::getGyroScale(){ 01289 return scaleGYRO; 01290 } 01291 01292 /* ================================================================== 01293 * 温度センサーのRAW値に乗算する係数を取得する 01294 */ 01295 float BOARDC_BNO055::getTempScale(){ 01296 return scaleTEMP; 01297 } 01298 01299 /* ================================================================== 01300 * オイラー角のRAW値に乗算する係数を取得する 01301 */ 01302 float BOARDC_BNO055::getEulerScale(){ 01303 return scaleEuler; 01304 } 01305 01306 /* ================================================================== 01307 * 加速度センサーの線形加速度のRAW値に乗算する係数を取得する 01308 */ 01309 float BOARDC_BNO055::getLinearScale(){ 01310 return scaleLIA; 01311 } 01312 01313 /* ================================================================== 01314 * 重力ベクトルのRAW値に乗算する係数を取得する 01315 */ 01316 float BOARDC_BNO055::getGVScale(){ 01317 return scaleGV; 01318 } 01319 01320 /* ================================================================== 01321 * 四元数のRAW値に乗算する係数を取得する 01322 */ 01323 double BOARDC_BNO055::getQuaternionScale(){ 01324 return scaleQuaternion; 01325 } 01326 01327 01328 /* ================================================================== 01329 * 加速度センサの値を取得する 01330 * ------------------------------------------------------------------ 01331 * &accX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される 01332 * &accY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される 01333 * &accZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される 01334 */ 01335 void BOARDC_BNO055::getAccDataAll(short &accX, short &accY, short &accZ){ 01336 //連続6byte読み取り 01337 char rsv[6]; 01338 ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 6); 01339 01340 accX = (rsv[1] << 8) | rsv[0]; 01341 accY = (rsv[3] << 8) | rsv[2]; 01342 accZ = (rsv[5] << 8) | rsv[4]; 01343 } 01344 01345 /* ================================================================== 01346 * 加速度センサの値(X軸のみ)を取得する 01347 */ 01348 short BOARDC_BNO055::getAccDataX(){ 01349 //連続2byte読み取り 01350 char rsv[2]; 01351 ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 2); 01352 01353 return (rsv[1] << 8) | rsv[0]; 01354 } 01355 01356 /* ================================================================== 01357 * 加速度センサの値(Y軸のみ)を取得する 01358 */ 01359 short BOARDC_BNO055::getAccDataY(){ 01360 //連続2byte読み取り 01361 char rsv[2]; 01362 ctrl->rrc(0, BNO055P0_ACC_DATA_Y_LSB, rsv, 2); 01363 01364 return (rsv[1] << 8) | rsv[0]; 01365 } 01366 01367 /* ================================================================== 01368 * 加速度センサの値(Z軸のみ)を取得する 01369 */ 01370 short BOARDC_BNO055::getAccDataZ(){ 01371 //連続2byte読み取り 01372 char rsv[2]; 01373 ctrl->rrc(0, BNO055P0_ACC_DATA_Z_LSB, rsv, 2); 01374 01375 return (rsv[1] << 8) | rsv[0]; 01376 } 01377 01378 /* ================================================================== 01379 * 地磁気センサの値を取得する 01380 * ------------------------------------------------------------------ 01381 * &magX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される 01382 * &magY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される 01383 * &magZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される 01384 */ 01385 void BOARDC_BNO055::getMagDataAll(short &magX, short &magY, short &magZ){ 01386 //連続6byte読み取り 01387 char rsv[6]; 01388 ctrl->rrc(0, BNO055P0_MAG_DATA_X_LSB, rsv, 6); 01389 01390 magX = (rsv[1] << 8) | rsv[0]; 01391 magY = (rsv[3] << 8) | rsv[2]; 01392 magZ = (rsv[5] << 8) | rsv[4]; 01393 } 01394 01395 /* ================================================================== 01396 * 地磁気センサの値(X軸のみ)を取得する 01397 */ 01398 short BOARDC_BNO055::getMagDataX(){ 01399 //連続2byte読み取り 01400 char rsv[2]; 01401 ctrl->rrc(0, BNO055P0_MAG_DATA_X_LSB, rsv, 2); 01402 01403 return (rsv[1] << 8) | rsv[0]; 01404 } 01405 01406 /* ================================================================== 01407 * 地磁気センサの値(Y軸のみ)を取得する 01408 */ 01409 short BOARDC_BNO055::getMagDataY(){ 01410 //連続2byte読み取り 01411 char rsv[2]; 01412 ctrl->rrc(0, BNO055P0_MAG_DATA_Y_LSB, rsv, 2); 01413 01414 return (rsv[1] << 8) | rsv[0]; 01415 } 01416 01417 /* ================================================================== 01418 * 地磁気センサの値(Z軸のみ)を取得する 01419 */ 01420 short BOARDC_BNO055::getMagDataZ(){ 01421 //連続2byte読み取り 01422 char rsv[2]; 01423 ctrl->rrc(0, BNO055P0_MAG_DATA_Z_LSB, rsv, 2); 01424 01425 return (rsv[1] << 8) | rsv[0]; 01426 } 01427 01428 /* ================================================================== 01429 * ジャイロセンサの値を取得する 01430 * ------------------------------------------------------------------ 01431 * &gyroX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される 01432 * &gyroY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される 01433 * &gyroZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される 01434 */ 01435 void BOARDC_BNO055::getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ){ 01436 //連続6byte読み取り 01437 char rsv[6]; 01438 ctrl->rrc(0, BNO055P0_GYR_DATA_X_LSB, rsv, 6); 01439 01440 gyroX = (rsv[1] << 8) | rsv[0]; 01441 gyroY = (rsv[3] << 8) | rsv[2]; 01442 gyroZ = (rsv[5] << 8) | rsv[4]; 01443 } 01444 01445 /* ================================================================== 01446 * ジャイロセンサの値(X軸のみ)を取得する 01447 */ 01448 short BOARDC_BNO055::getGyroDataX(){ 01449 //連続2byte読み取り 01450 char rsv[2]; 01451 ctrl->rrc(0, BNO055P0_GYR_DATA_X_LSB, rsv, 2); 01452 01453 return (rsv[1] << 8) | rsv[0]; 01454 } 01455 01456 /* ================================================================== 01457 * ジャイロセンサの値(Y軸のみ)を取得する 01458 */ 01459 short BOARDC_BNO055::getGyroDataY(){ 01460 //連続2byte読み取り 01461 char rsv[2]; 01462 ctrl->rrc(0, BNO055P0_GYR_DATA_Y_LSB, rsv, 2); 01463 01464 return (rsv[1] << 8) | rsv[0]; 01465 } 01466 01467 /* ================================================================== 01468 * ジャイロセンサの値(Z軸のみ)を取得する 01469 */ 01470 short BOARDC_BNO055::getGyroDataZ(){ 01471 //連続2byte読み取り 01472 char rsv[2]; 01473 ctrl->rrc(0, BNO055P0_GYR_DATA_Z_LSB, rsv, 2); 01474 01475 return (rsv[1] << 8) | rsv[0]; 01476 } 01477 01478 /* ================================================================== 01479 * FusionSensing:オイラー角の値を取得する 01480 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01481 * ------------------------------------------------------------------ 01482 * &E_heading: アドレス参照引数:関数実行後、この変数にYaw軸(heading)の値が格納される 01483 * &E_roll: アドレス参照引数:関数実行後、この変数にroll軸の値が格納される 01484 * &E_pitch: アドレス参照引数:関数実行後、この変数にpitch軸の値が格納される 01485 */ 01486 void BOARDC_BNO055::getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch){ 01487 //連続6byte読み取り 01488 char rsv[6]; 01489 ctrl->rrc(0, BNO055P0_EUL_HEADING_LSB, rsv, 6); 01490 01491 E_heading = (rsv[1] << 8) | rsv[0]; 01492 E_roll = (rsv[3] << 8) | rsv[2]; 01493 E_pitch = (rsv[5] << 8) | rsv[4]; 01494 } 01495 01496 /* ================================================================== 01497 * FusionSensing:オイラー角の値(Yaw軸(heading)のみ)を取得する 01498 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01499 */ 01500 short BOARDC_BNO055::getEulerDataHeading(){ 01501 //連続2byte読み取り 01502 char rsv[2]; 01503 ctrl->rrc(0, BNO055P0_EUL_HEADING_LSB, rsv, 2); 01504 01505 return (rsv[1] << 8) | rsv[0]; 01506 } 01507 01508 /* ================================================================== 01509 * getEulerDataHeading()のエイリアス 01510 * FusionSensing:オイラー角の値(Yaw軸(heading)のみ)を返す 01511 */ 01512 short BOARDC_BNO055::getEulerDataYaw(){ 01513 return getEulerDataHeading(); 01514 } 01515 01516 /* ================================================================== 01517 * FusionSensing:オイラー角の値(pitch軸のみ)を取得する 01518 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01519 */ 01520 short BOARDC_BNO055::getEulerDataRoll(){ 01521 //連続2byte読み取り 01522 char rsv[2]; 01523 ctrl->rrc(0, BNO055P0_EUL_ROLL_LSB, rsv, 2); 01524 01525 return (rsv[1] << 8) | rsv[0]; 01526 } 01527 01528 /* ================================================================== 01529 * FusionSensing:オイラー角の値(pitch軸のみ)を取得する 01530 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01531 */ 01532 short BOARDC_BNO055::getEulerDataPitch(){ 01533 //連続2byte読み取り 01534 char rsv[2]; 01535 ctrl->rrc(0, BNO055P0_EUL_PITCH_LSB, rsv, 2); 01536 01537 return (rsv[1] << 8) | rsv[0]; 01538 } 01539 01540 /* ================================================================== 01541 * FusionSensing:9軸センサーのすべての値の値を取得する 01542 */ 01543 void BOARDC_BNO055::get9Axis(short *box){ 01544 char rsv[18]; 01545 ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 18); 01546 01547 box[0] = (rsv[1] << 8) | rsv[0]; 01548 box[1] = (rsv[3] << 8) | rsv[2]; 01549 box[2] = (rsv[5] << 8) | rsv[4]; 01550 box[3] = (rsv[7] << 8) | rsv[6]; 01551 box[4] = (rsv[9] << 8) | rsv[8]; 01552 box[5] = (rsv[11] << 8) | rsv[10]; 01553 box[6] = (rsv[13] << 8) | rsv[12]; 01554 box[7] = (rsv[15] << 8) | rsv[14]; 01555 box[8] = (rsv[17] << 8) | rsv[16]; 01556 } 01557 01558 /* ================================================================== 01559 * FusionSensing:9軸センサーのすべての値とオイラー角のすべての値を取得する 01560 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01561 */ 01562 void BOARDC_BNO055::get9AxisAndEUL(short *box){ 01563 char rsv[24]; 01564 ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 24); 01565 01566 box[0] = (rsv[1] << 8) | rsv[0]; 01567 box[1] = (rsv[3] << 8) | rsv[2]; 01568 box[2] = (rsv[5] << 8) | rsv[4]; 01569 box[3] = (rsv[7] << 8) | rsv[6]; 01570 box[4] = (rsv[9] << 8) | rsv[8]; 01571 box[5] = (rsv[11] << 8) | rsv[10]; 01572 box[6] = (rsv[13] << 8) | rsv[12]; 01573 box[7] = (rsv[15] << 8) | rsv[14]; 01574 box[8] = (rsv[17] << 8) | rsv[16]; 01575 box[9] = (rsv[19] << 8) | rsv[18]; 01576 box[10] = (rsv[21] << 8) | rsv[20]; 01577 box[11] = (rsv[23] << 8) | rsv[22]; 01578 } 01579 01580 /* ================================================================== 01581 * FusionSensing:四元数(Quaternion)を取得する 01582 * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す 01583 * ------------------------------------------------------------------ 01584 * &q1, &q2, &q3, &q4:アドレス参照引数:関数実行後、この変数に四元数が格納される 01585 */ 01586 void BOARDC_BNO055::getQuaternion(short &q1, short &q2, short &q3, short &q4){ 01587 //連続8byte読み取り 01588 char rsv[8]; 01589 ctrl->rrc(0, BNO055P0_QUA_DATA_W_LSB, rsv, 8); 01590 01591 q1 = (rsv[1] << 8) | rsv[0]; 01592 q2 = (rsv[3] << 8) | rsv[2]; 01593 q3 = (rsv[5] << 8) | rsv[4]; 01594 q4 = (rsv[7] << 8) | rsv[6]; 01595 } 01596 01597 /* ================================================================== 01598 * 線形加速度(LinearAcceleration)での加速度センサの値を取得する 01599 * ------------------------------------------------------------------ 01600 * &L_accX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される 01601 * &L_accY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される 01602 * &L_accZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される 01603 */ 01604 void BOARDC_BNO055::getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ){ 01605 //連続6byte読み取り 01606 char rsv[6]; 01607 ctrl->rrc(0, BNO055P0_LIA_DATA_X_LSB, rsv, 6); 01608 01609 L_accX = (rsv[1] << 8) | rsv[0]; 01610 L_accY = (rsv[3] << 8) | rsv[2]; 01611 L_accZ = (rsv[5] << 8) | rsv[4]; 01612 } 01613 01614 /* ================================================================== 01615 * 線形加速度(LinearAcceleration)での加速度センサの値(X軸のみ)を取得する 01616 */ 01617 short BOARDC_BNO055::getLinearAccDataX(){ 01618 //連続2byte読み取り 01619 char rsv[2]; 01620 ctrl->rrc(0, BNO055P0_LIA_DATA_X_LSB, rsv, 2); 01621 01622 return (rsv[1] << 8) | rsv[0]; 01623 } 01624 01625 /* ================================================================== 01626 * 線形加速度(LinearAcceleration)での加速度センサの値(Y軸のみ)を取得する 01627 */ 01628 short BOARDC_BNO055::getLinearAccDataY(){ 01629 //連続2byte読み取り 01630 char rsv[2]; 01631 ctrl->rrc(0, BNO055P0_LIA_DATA_Y_LSB, rsv, 2); 01632 01633 return (rsv[1] << 8) | rsv[0]; 01634 } 01635 01636 /* ================================================================== 01637 * 線形加速度(LinearAcceleration)での加速度センサの値(Z軸のみ)を取得する 01638 */ 01639 short BOARDC_BNO055::getLinearAccDataZ(){ 01640 //連続2byte読み取り 01641 char rsv[2]; 01642 ctrl->rrc(0, BNO055P0_LIA_DATA_Z_LSB, rsv, 2); 01643 01644 return (rsv[1] << 8) | rsv[0]; 01645 } 01646 01647 /* ================================================================== 01648 * 重力ベクトル情報を取得する 01649 * ------------------------------------------------------------------ 01650 * &gvX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される 01651 * &gvY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される 01652 * &gvZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される 01653 */ 01654 void BOARDC_BNO055::getGVectorDataAll(short &gvX, short &gvY, short &gvZ){ 01655 //連続6byte読み取り 01656 char rsv[6]; 01657 ctrl->rrc(0, BNO055P0_GRV_DATA_X_LSB, rsv, 6); 01658 01659 gvX = (rsv[1] << 8) | rsv[0]; 01660 gvY = (rsv[3] << 8) | rsv[2]; 01661 gvZ = (rsv[5] << 8) | rsv[4]; 01662 } 01663 01664 /* ================================================================== 01665 * 重力ベクトル情報(X軸のみ)を取得する 01666 */ 01667 short BOARDC_BNO055::getGVectorDataX(){ 01668 //連続2byte読み取り 01669 char rsv[2]; 01670 ctrl->rrc(0, BNO055P0_GRV_DATA_X_LSB, rsv, 2); 01671 01672 return (rsv[1] << 8) | rsv[0]; 01673 } 01674 01675 /* ================================================================== 01676 * 重力ベクトル情報(Y軸のみ)を取得する 01677 */ 01678 short BOARDC_BNO055::getGVectorDataY(){ 01679 //連続2byte読み取り 01680 char rsv[2]; 01681 ctrl->rrc(0, BNO055P0_GRV_DATA_Y_LSB, rsv, 2); 01682 01683 return (rsv[1] << 8) | rsv[0]; 01684 } 01685 01686 /* ================================================================== 01687 * 重力ベクトル情報(Z軸のみ)を取得する 01688 */ 01689 short BOARDC_BNO055::getGVectorDataZ(){ 01690 //連続2byte読み取り 01691 char rsv[2]; 01692 ctrl->rrc(0, BNO055P0_GRV_DATA_Z_LSB, rsv, 2); 01693 01694 return (rsv[1] << 8) | rsv[0]; 01695 } 01696 01697 /* ================================================================== 01698 * センサー内部温度情報を取得する 01699 * 内部温度のセンサーは2つあり、どちらか一方のみの温度を返す 01700 * (設定レジスタTEMP_SOURCEにて選択可) 01701 * (setTempSource(bool)にて選択可) 01702 */ 01703 char BOARDC_BNO055::getTemperature(){ 01704 return ctrl->rr(0, BNO055P0_TEMP); 01705 } 01706 01707 /* ================================================================== 01708 * キャリブレーション(補正)の状態を取得する 01709 * ------------------------------------------------------------------ 01710 * &sys: アドレス参照引数:関数実行後、この変数にsystem補正の状態が格納される 01711 * &acc: アドレス参照引数:関数実行後、この変数に加速度センサー補正の状態が格納される 01712 * &mag: アドレス参照引数:関数実行後、この変数に地磁気センサー補正の状態が格納される 01713 * &gyro: アドレス参照引数:関数実行後、この変数に角速度センサー補正の状態が格納される 01714 * ------------------------------------------------------------------ 01715 * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため 01716 * 値は0[%],32[%],66[%],100[%]のいずれか 01717 */ 01718 void BOARDC_BNO055::getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro){ 01719 char rv = ctrl->rr(0, BNO055P0_CALIB_STAT); 01720 sys = (((rv & 0xC0) >> 6) * 34); 01721 gyro = (((rv & 0x30) >> 4) * 34); 01722 acc = (((rv & 0x0C) >> 2) * 34); 01723 mag = ((rv & 0x03) * 34); 01724 sys -= (sys == 0) ? 0 : 2; 01725 gyro -= (gyro == 0) ? 0 : 2; 01726 acc -= (acc == 0) ? 0 : 2; 01727 mag -= (mag == 0) ? 0 : 2; 01728 } 01729 01730 /* ================================================================== 01731 * キャリブレーション(補正)の状態(systemのみ)を取得する 01732 * ------------------------------------------------------------------ 01733 * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため 01734 * 値は0[%],32[%],66[%],100[%]のいずれか 01735 */ 01736 char BOARDC_BNO055::getCalibStatusSys(){ 01737 char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0xC0) >> 6) * 34) - 2; 01738 return (ret < 0) ? 0 : ret; 01739 } 01740 01741 /* ================================================================== 01742 * キャリブレーション(補正)の状態(加速度センサーのみ)を取得する 01743 * ------------------------------------------------------------------ 01744 * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため 01745 * 値は0[%],32[%],66[%],100[%]のいずれか 01746 */ 01747 char BOARDC_BNO055::getCalibStatusAcc(){ 01748 char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x0C) >> 2) * 34) - 2; 01749 return (ret < 0) ? 0 : ret; 01750 } 01751 01752 /* ================================================================== 01753 * キャリブレーション(補正)の状態(地磁気センサーのみ)を取得する 01754 * ------------------------------------------------------------------ 01755 * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため 01756 * 値は0[%],32[%],66[%],100[%]のいずれか 01757 */ 01758 char BOARDC_BNO055::getCalibStatusMag(){ 01759 char ret = ((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x03) * 34) - 2; 01760 return (ret < 0) ? 0 : ret; 01761 } 01762 01763 /* ================================================================== 01764 * キャリブレーション(補正)の状態(角速度センサーのみ)を取得する 01765 * ------------------------------------------------------------------ 01766 * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため 01767 * 値は0[%],32[%],66[%],100[%]のいずれか 01768 */ 01769 char BOARDC_BNO055::getCalibStatusGyro(){ 01770 char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x30) >> 4) * 34) - 2; 01771 return (ret < 0) ? 0 : ret; 01772 } 01773 01774 /* ================================================================== 01775 * システムおよびセンサーのセルフテストの実行結果を取得する 01776 * ------------------------------------------------------------------ 01777 * returns: 01778 * 1bit目:加速度センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常)) 01779 * 2bit目:地磁気センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常)) 01780 * 3bit目:角速度センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常)) 01781 * 4bit目:内部マイコンのセルフテストの実行結果(0:failed(異常), 1:passed(正常)) 01782 * ------------------------------------------------------------------ 01783 * 例:戻り値 0x0D (0b00001101) 01784 * >>加速度センサー:正常(1) 01785 * >>地磁気センサー:異常(0) 01786 * >>角速度センサー:正常(1) 01787 * >>内部マイコン:正常(1) 01788 */ 01789 char BOARDC_BNO055::getSelfTestResultAll(){ 01790 return ctrl->rr(0, BNO055P0_ST_RESULT); 01791 } 01792 01793 /* ================================================================== 01794 * 内部マイコン(BNO055のMCU)のセルフテストの実行結果を取得する 01795 * ------------------------------------------------------------------ 01796 * returns: 01797 * false:failed(異常) 01798 * true:passed(正常) 01799 */ 01800 bool BOARDC_BNO055::getSelfTestResultMCU(){ 01801 return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x08) >> 3) == 1); 01802 } 01803 01804 /* ================================================================== 01805 * 加速度センサーのセルフテストの実行結果を取得する 01806 * ------------------------------------------------------------------ 01807 * returns: 01808 * false:failed(異常) 01809 * true:passed(正常) 01810 */ 01811 bool BOARDC_BNO055::getSelfTestResultAcc(){ 01812 return ((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x01) == 1); 01813 } 01814 01815 /* ================================================================== 01816 * 地磁気センサーのセルフテストの実行結果を取得する 01817 * ------------------------------------------------------------------ 01818 * returns: 01819 * false:failed(異常) 01820 * true:passed(正常) 01821 */ 01822 bool BOARDC_BNO055::getSelfTestResultMag(){ 01823 return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x02) >> 1) == 1); 01824 } 01825 01826 /* ================================================================== 01827 * 地磁気センサーのセルフテストの実行結果を取得する 01828 * ------------------------------------------------------------------ 01829 * returns: 01830 * false:failed(異常) 01831 * true:passed(正常) 01832 */ 01833 bool BOARDC_BNO055::getSelfTestResultGyro(){ 01834 return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x04) >> 2) == 1); 01835 } 01836 01837 /* ================================================================== 01838 * 発生している割り込みステータス情報を取得する 01839 * ------------------------------------------------------------------ 01840 * returns: 01841 * 3bit目:GYRO_AM(角速度AnyMotion発生)(1:発生中, 0:なし) 01842 * 4bit目:GYR_HIGH_RATE(角速度ハイレート発生)(1:発生中, 0:なし) 01843 * 6bit目:ACC_HIGH_G(加速度急加速発生)(1:発生中, 0:なし) 01844 * 7bit目:ACC_AM(角速度AnyMotion発生)(1:発生中, 0:なし) 01845 * 8bit目:ACC_NM(角速度NoMotion発生)(1:発生中, 0:なし) 01846 */ 01847 char BOARDC_BNO055::triggeredIntALL(){ 01848 return ctrl->rr(0, BNO055P0_INT_STA); 01849 } 01850 01851 /* ================================================================== 01852 * 発生している割り込みステータス情報(ACC_NM)を取得する 01853 * ------------------------------------------------------------------ 01854 * returns: 01855 * true:ACC_NMトリガー発生中 01856 * false:ACC_NMトリガーなし 01857 */ 01858 bool BOARDC_BNO055::triggeredACC_NM(){ 01859 return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x80) >> 7) == 1); 01860 } 01861 01862 /* ================================================================== 01863 * 発生している割り込みステータス情報(ACC_AM)を取得する 01864 * ------------------------------------------------------------------ 01865 * returns: 01866 * true:ACC_AMトリガー発生中 01867 * false:ACC_AMトリガーなし 01868 */ 01869 bool BOARDC_BNO055::triggeredACC_AM(){ 01870 return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x40) >> 6) == 1); 01871 } 01872 01873 /* ================================================================== 01874 * 発生している割り込みステータス情報(ACC_HIGH_G)を取得する 01875 * ------------------------------------------------------------------ 01876 * returns: 01877 * true:ACC_HIGH_Gトリガー発生中 01878 * false:ACC_HIGH_Gトリガーなし 01879 */ 01880 bool BOARDC_BNO055::triggeredACC_HIGH_G(){ 01881 return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x20) >> 5) == 1); 01882 } 01883 01884 /* ================================================================== 01885 * 発生している割り込みステータス情報(GYR_HIGH_RATE)を取得する 01886 * ------------------------------------------------------------------ 01887 * returns: 01888 * true:GYR_HIGH_RATEトリガー発生中 01889 * false:GYR_HIGH_RATEトリガーなし 01890 */ 01891 bool BOARDC_BNO055::triggeredGYR_HIGH_RATE(){ 01892 return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x08) >> 3) == 1); 01893 } 01894 01895 /* ================================================================== 01896 * 発生している割り込みステータス情報(GYRO_AM)を取得する 01897 * ------------------------------------------------------------------ 01898 * returns: 01899 * true:GYRO_AMトリガー発生中 01900 * false:GYRO_AMトリガーなし 01901 */ 01902 bool BOARDC_BNO055::triggeredGYRO_AM(){ 01903 return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x04) >> 2) == 1); 01904 } 01905 01906 /* ================================================================== 01907 * BNO055のシステムクロック固定情報を取得する 01908 * ------------------------------------------------------------------ 01909 * returns: 01910 * true:設定によって固定されている(SYS_TRIGGEレジスタのCLK_SEL) 01911 * false:設定されていない(内部か外部選択可) 01912 * ------------------------------------------------------------------ 01913 * setSys_ExternalCrystal(bool)で設定可 01914 */ 01915 bool BOARDC_BNO055::isSystemClockFixed(){ 01916 return (ctrl->rr(0, BNO055P0_SYS_CLK_STATUS) == 1); 01917 } 01918 01919 /* ================================================================== 01920 * BNO055のシステムステータスを取得する 01921 * ------------------------------------------------------------------ 01922 * returns: 01923 * 0: システム待機状態 01924 * 1: システムエラー 01925 * 2: ペリフェラル初期化中 01926 * 3: システム初期化中 01927 * 4: セルフテスト実行中 01928 * 5: 起動中(Fusionアルゴリズム起動中) 01929 * 6: 起動中(Fusionアルゴリズムなし) 01930 */ 01931 char BOARDC_BNO055::getSystemStatus(){ 01932 return ctrl->rr(0, BNO055P0_SYS_STATUS); 01933 } 01934 01935 /* ================================================================== 01936 * BNO055のシステムエラー情報を取得する 01937 * ------------------------------------------------------------------ 01938 * returns: 01939 * 0: エラーなし 01940 * 1: ペリフェラル初期化エラー 01941 * 2: システム初期化エラー 01942 * 3: セルフテスト結果不調 01943 * 4: レジスタマップエラー(値の範囲外) 01944 * 5: レジスタマップエラー(アドレスの範囲外) 01945 * 6: レジスタマップエラー(書き込み不能) 01946 * 7: BNO005LowPowerモードにつき指定モード実行不可 01947 * 8: 加速度センサーPowerMode実行不可 01948 * 9: Fusionアルゴリズム設定エラー 01949 * 10: 各センサー設定エラー 01950 */ 01951 char BOARDC_BNO055::getSystemError(){ 01952 return ctrl->rr(0, BNO055P0_SYS_ERR); 01953 } 01954 01955 /* ================================================================== 01956 * システムの設定単位系を取得する 01957 * ------------------------------------------------------------------ 01958 * returns: 01959 * 1bit目: 加速度センサー単位系(0:m/s^2, 1:mg) 01960 * 2bit目: 角速度センサー単位系(0:deg/s, 1:rad/s) 01961 * 3bit目: オイラー角単位系(0:deg, 1:rad) 01962 * 5bit目: 温度単位系(0:摂氏, 1:華氏) 01963 * 7bit目: 出力設定(0:Windows, 1:Android) 01964 */ 01965 char BOARDC_BNO055::getUNIT_SEL(){ 01966 return ctrl->rr(0, BNO055P0_UNIT_SEL); 01967 } 01968 01969 /* ================================================================== 01970 * システムの設定単位系を設定する 01971 * ------------------------------------------------------------------ 01972 * 引数selectValue: 01973 * 1bit目: 加速度センサー単位系(0:m/s^2, 1:mg) 01974 * 2bit目: 角速度センサー単位系(0:deg/s, 1:rad/s) 01975 * 3bit目: オイラー角単位系(0:deg, 1:rad) 01976 * 5bit目: 温度単位系(0:摂氏, 1:華氏) 01977 * 7bit目: 出力設定(0:Windows, 1:Android) 01978 * returns: 01979 * -1 失敗 01980 * 1 成功 01981 */ 01982 char BOARDC_BNO055::setUNIT_SEL(char selectValue){ 01983 if(ctrl->wr(0, BNO055P0_UNIT_SEL, selectValue) == -1) return -1; 01984 01985 scaleACC = ((selectValue & 0x01) == 0) ? 0.01f : 1.0f; 01986 scaleGYRO = ((selectValue & 0x02) == 0) ? 0.0625f : 0.001111111111f; 01987 scaleEuler = ((selectValue & 0x04) == 0) ? 0.0625f : 0.001111111111f; 01988 scaleTEMP = ((selectValue & 0x10) == 0) ? 1.0f : 2.0f; 01989 scaleLIA = scaleACC; 01990 scaleGV = scaleACC; 01991 01992 return 1; 01993 } 01994 01995 /* ================================================================== 01996 * システムの設定単位系(加速度センサー)を設定する 01997 * ------------------------------------------------------------------ 01998 * 引数isMeterPerSec2: 01999 * true: m/s^2 02000 * false: mg 02001 * ------------------------------------------------------------------ 02002 * returns: 02003 * -1 失敗 02004 * 1 成功 02005 */ 02006 char BOARDC_BNO055::setUNIT_AccUnit(bool isMeterPerSec2){ 02007 char val = getUNIT_SEL() & 0xFE; 02008 if(!isMeterPerSec2) val += 1; 02009 return setUNIT_SEL(val); 02010 } 02011 02012 /* ================================================================== 02013 * システムの設定単位系(角速度センサー)を設定する 02014 * ------------------------------------------------------------------ 02015 * 引数isDps: 02016 * true: dps(Degrees/s) 02017 * false: rps(Radians/s) 02018 * ------------------------------------------------------------------ 02019 * returns: 02020 * -1 失敗 02021 * 1 成功 02022 */ 02023 char BOARDC_BNO055::setUNIT_GyroUnit(bool isDps){ 02024 char val = getUNIT_SEL() & 0xFD; 02025 if(!isDps) val += 2; 02026 return setUNIT_SEL(val); 02027 } 02028 02029 /* ================================================================== 02030 * システムの設定単位系(オイラー角)を設定する 02031 * ------------------------------------------------------------------ 02032 * 引数isDegrees: 02033 * true: Degrees 02034 * false: Radians 02035 * ------------------------------------------------------------------ 02036 * returns: 02037 * -1 失敗 02038 * 1 成功 02039 */ 02040 char BOARDC_BNO055::setUNIT_EulerUnit(bool isDegrees){ 02041 char val = getUNIT_SEL() & 0xFB; 02042 if(!isDegrees) val += 4; 02043 return setUNIT_SEL(val); 02044 } 02045 02046 /* ================================================================== 02047 * システムの設定単位系(温度)を設定する 02048 * ------------------------------------------------------------------ 02049 * 引数isCelsius: 02050 * true: 摂氏(Celsius) 02051 * false: 華氏(Fahrenheit) 02052 * ------------------------------------------------------------------ 02053 * returns: 02054 * -1 失敗 02055 * 1 成功 02056 */ 02057 char BOARDC_BNO055::setUNIT_Temperature(bool isCelsius){ 02058 char val = getUNIT_SEL() & 0xEF; 02059 if(!isCelsius) val += 16; 02060 return setUNIT_SEL(val); 02061 } 02062 02063 /* ================================================================== 02064 * システムの設定単位系(出力設定)を設定する 02065 * ------------------------------------------------------------------ 02066 * 引数ori_Android: 02067 * true: Android用(Pitch角:+180 to -180 反時計回り+) 02068 * false: Windows用(Pitch角:-180 to +180 時計回り+) 02069 * ------------------------------------------------------------------ 02070 * returns: 02071 * -1 失敗 02072 * 1 成功 02073 */ 02074 char BOARDC_BNO055::setUNIT_OrientationMode(bool ori_Android){ 02075 char val = getUNIT_SEL() & 0xBF; 02076 if(!ori_Android) val += 64; 02077 return setUNIT_SEL(val); 02078 } 02079 02080 /* ================================================================== 02081 * システムの動作モードを取得する 02082 * ------------------------------------------------------------------ 02083 * returns: 02084 * 1 ACCONLY(NO FUSION)加速度のみ 02085 * 2 MAGONLY(NO FUSION)地磁気のみ 02086 * 3 GYROONLY(NO FUSION)角速度のみ 02087 * 4 ACCMAG(NO FUSION)加速度と地磁気 02088 * 5 ACCGYRO(NO FUSION)加速度と角速度 02089 * 6 MAGGYRO(NO FUSION)地磁気と角速度 02090 * 7 AMG(NO FUSION)加速度、地磁気、角速度 02091 * 8 IMU 02092 * 9 COMPASS 02093 * 10 M4G 02094 * 11 NDOF_FMC_OFF 02095 * 12 NDOF 02096 */ 02097 char BOARDC_BNO055::getOperationMode(){ 02098 return ctrl->rr(0, BNO055P0_OPR_MODE); 02099 } 02100 02101 /* ================================================================== 02102 * システムの動作モードを設定する 02103 * ------------------------------------------------------------------ 02104 * 引数modeValue: 02105 * 1 ACCONLY(NO FUSION)加速度のみ 02106 * 2 MAGONLY(NO FUSION)地磁気のみ 02107 * 3 GYROONLY(NO FUSION)角速度のみ 02108 * 4 ACCMAG(NO FUSION)加速度と地磁気 02109 * 5 ACCGYRO(NO FUSION)加速度と角速度 02110 * 6 MAGGYRO(NO FUSION)地磁気と角速度 02111 * 7 AMG(NO FUSION)加速度、地磁気、角速度 02112 * 8 IMU 02113 * 9 COMPASS 02114 * 10 M4G 02115 * 11 NDOF_FMC_OFF 02116 * 12 NDOF 02117 * ------------------------------------------------------------------ 02118 * returns: 02119 * -1 失敗 02120 * 1 成功 02121 */ 02122 char BOARDC_BNO055::setOperationMode(char modeValue){ 02123 if(modeValue < 0 || modeValue > 12) modeValue = 7; 02124 return ctrl->wr(0, BNO055P0_OPR_MODE, modeValue); 02125 } 02126 02127 /* ================================================================== 02128 * システムの動作モードを設定モードに設定する 02129 * ------------------------------------------------------------------ 02130 * returns: 02131 * -1 失敗 02132 * 1 成功 02133 */ 02134 char BOARDC_BNO055::setOperation_CONFIG(){ 02135 return ctrl->wr(0, BNO055P0_OPR_MODE, 0); 02136 } 02137 02138 /* ================================================================== 02139 * システムの動作モードを加速度モードに設定する 02140 * ------------------------------------------------------------------ 02141 * returns: 02142 * -1 失敗 02143 * 1 成功 02144 */ 02145 char BOARDC_BNO055::setOperation_ACCONRY(){ 02146 return ctrl->wr(0, BNO055P0_OPR_MODE, 1); 02147 } 02148 02149 /* ================================================================== 02150 * システムの動作モードを地磁気モードに設定する 02151 * ------------------------------------------------------------------ 02152 * returns: 02153 * -1 失敗 02154 * 1 成功 02155 */ 02156 char BOARDC_BNO055::setOperation_MAGONRY(){ 02157 return ctrl->wr(0, BNO055P0_OPR_MODE, 2); 02158 } 02159 02160 /* ================================================================== 02161 * システムの動作モードを角速度モードに設定する 02162 * ------------------------------------------------------------------ 02163 * returns: 02164 * -1 失敗 02165 * 1 成功 02166 */ 02167 char BOARDC_BNO055::setOperation_GYROONRY(){ 02168 return ctrl->wr(0, BNO055P0_OPR_MODE, 3); 02169 } 02170 02171 /* ================================================================== 02172 * システムの動作モードを加速度地磁気モードに設定する 02173 * ------------------------------------------------------------------ 02174 * returns: 02175 * -1 失敗 02176 * 1 成功 02177 */ 02178 char BOARDC_BNO055::setOperation_ACCMAG(){ 02179 return ctrl->wr(0, BNO055P0_OPR_MODE, 4); 02180 } 02181 02182 /* ================================================================== 02183 * システムの動作モードを加速度角速度モードに設定する 02184 * ------------------------------------------------------------------ 02185 * returns: 02186 * -1 失敗 02187 * 1 成功 02188 */ 02189 char BOARDC_BNO055::setOperation_ACCGYRO(){ 02190 return ctrl->wr(0, BNO055P0_OPR_MODE, 5); 02191 } 02192 02193 /* ================================================================== 02194 * システムの動作モードを地磁気角速度モードに設定する 02195 * ------------------------------------------------------------------ 02196 * returns: 02197 * -1 失敗 02198 * 1 成功 02199 */ 02200 char BOARDC_BNO055::setOperation_MAGGYRO(){ 02201 return ctrl->wr(0, BNO055P0_OPR_MODE, 6); 02202 } 02203 02204 /* ================================================================== 02205 * システムの動作モードをFusionなし9軸モードに設定する 02206 * ------------------------------------------------------------------ 02207 * returns: 02208 * -1 失敗 02209 * 1 成功 02210 */ 02211 char BOARDC_BNO055::setOperation_AMG(){ 02212 return ctrl->wr(0, BNO055P0_OPR_MODE, 7); 02213 } 02214 02215 /* ================================================================== 02216 * システムの動作モードを6軸(加速度、角速度)Fusionモードに設定する 02217 * ------------------------------------------------------------------ 02218 * returns: 02219 * -1 失敗 02220 * 1 成功 02221 */ 02222 char BOARDC_BNO055::setOperation_Fusion_IMU(){ 02223 return ctrl->wr(0, BNO055P0_OPR_MODE, 8); 02224 } 02225 02226 /* ================================================================== 02227 * システムの動作モードを6軸(加速度、地磁気)Fusionモード(相対系)に設定する 02228 * ------------------------------------------------------------------ 02229 * returns: 02230 * -1 失敗 02231 * 1 成功 02232 */ 02233 char BOARDC_BNO055::setOperation_Fusion_COMPASS(){ 02234 return ctrl->wr(0, BNO055P0_OPR_MODE, 9); 02235 } 02236 02237 /* ================================================================== 02238 * システムの動作モードを6軸(加速度、地磁気)Fusionモード(絶対系)に設定する 02239 * ------------------------------------------------------------------ 02240 * returns: 02241 * -1 失敗 02242 * 1 成功 02243 */ 02244 char BOARDC_BNO055::setOperation_Fusion_M4G(){ 02245 return ctrl->wr(0, BNO055P0_OPR_MODE, 10); 02246 } 02247 02248 /* ================================================================== 02249 * システムの動作モードをNDOFモード(地磁気短時間補正OFF)に設定する 02250 * ------------------------------------------------------------------ 02251 * returns: 02252 * -1 失敗 02253 * 1 成功 02254 */ 02255 char BOARDC_BNO055::setOperation_Fusion_NDOF_FMC_OFF(){ 02256 return ctrl->wr(0, BNO055P0_OPR_MODE, 11); 02257 } 02258 02259 /* ================================================================== 02260 * システムの動作モードをNDOFモードに設定する 02261 * ------------------------------------------------------------------ 02262 * returns: 02263 * -1 失敗 02264 * 1 成功 02265 */ 02266 char BOARDC_BNO055::setOperation_Fusion_NDOF(){ 02267 return ctrl->wr(0, BNO055P0_OPR_MODE, 12); 02268 } 02269 02270 /* ================================================================== 02271 * システムの電源モードを取得する 02272 * ------------------------------------------------------------------ 02273 * returns: 02274 * 0: Normal 02275 * 1: LowPower 02276 * 2: Suspend 02277 */ 02278 char BOARDC_BNO055::getPowerMode(){ 02279 return ctrl->rr(0, BNO055P0_PWR_MODE); 02280 } 02281 02282 /* ================================================================== 02283 * システムの電源モードを設定する 02284 * ------------------------------------------------------------------ 02285 * modeValue: 02286 * 0: Normal 02287 * 1: LowPower 02288 * 2: Suspend 02289 * ------------------------------------------------------------------ 02290 * returns: 02291 * -1 失敗 02292 * 1 成功 02293 */ 02294 char BOARDC_BNO055::setPowerMode(unsigned char modeValue){ 02295 if(modeValue > 2) return -1; 02296 return ctrl->wr(0, BNO055P0_PWR_MODE, modeValue); 02297 } 02298 02299 /* ================================================================== 02300 * システムの電源モードを通常モードに設定する 02301 * ------------------------------------------------------------------ 02302 * returns: 02303 * -1 失敗 02304 * 1 成功 02305 */ 02306 char BOARDC_BNO055::setPowerMode_Normal(){ 02307 return ctrl->wr(0, BNO055P0_PWR_MODE, 0); 02308 } 02309 02310 /* ================================================================== 02311 * システムの電源モードを低消費電力モードに設定する 02312 * ------------------------------------------------------------------ 02313 * returns: 02314 * -1 失敗 02315 * 1 成功 02316 */ 02317 char BOARDC_BNO055::setPowerMode_LowPower(){ 02318 return ctrl->wr(0, BNO055P0_PWR_MODE, 1); 02319 } 02320 02321 /* ================================================================== 02322 * システムの電源モードをスリープモードに設定する 02323 * ------------------------------------------------------------------ 02324 * returns: 02325 * -1 失敗 02326 * 1 成功 02327 */ 02328 char BOARDC_BNO055::setPowerMode_Suspend(){ 02329 return ctrl->wr(0, BNO055P0_PWR_MODE, 2); 02330 } 02331 02332 /* ================================================================== 02333 * システムのトリガー設定を変更する 02334 * ------------------------------------------------------------------ 02335 * returns: 02336 * -1 失敗 02337 * 0 変更なし 02338 * 1 成功 02339 */ 02340 char BOARDC_BNO055::setSysTrigger(char regVal){ 02341 clkExt = regVal >> 7; 02342 return ctrl->wr(0, BNO055P0_SYS_TRIGGER, regVal & 0xE1); 02343 } 02344 02345 /* ================================================================== 02346 * システムのクロック発振元を設定する 02347 * 外部を指定する場合は、設定前にXIN,XOUTが発振子に結線されている必要がある 02348 * ------------------------------------------------------------------ 02349 * returns: 02350 * -1 失敗 02351 * 0 変更なし 02352 * 1 成功 02353 */ 02354 char BOARDC_BNO055::setSys_ExternalCrystal(bool isExternal){ 02355 if(clkExt == isExternal) return 0; 02356 02357 clkExt = isExternal; 02358 return ctrl->wr(0, BNO055P0_SYS_TRIGGER, (clkExt) ? 0x80 : 0x00); 02359 } 02360 02361 /* ================================================================== 02362 * システムの割り込み発生をすべてリセットする 02363 * ------------------------------------------------------------------ 02364 * returns: 02365 * -1 失敗 02366 * 1 成功 02367 */ 02368 char BOARDC_BNO055::resetInterrupt(){ 02369 return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x40); 02370 } 02371 02372 /* ================================================================== 02373 * システムをリセットする 02374 * ------------------------------------------------------------------ 02375 * returns: 02376 * -1 失敗 02377 * 1 成功 02378 */ 02379 char BOARDC_BNO055::soft_reset(){ 02380 return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x20); 02381 } 02382 02383 /* ================================================================== 02384 * セルフテストを実行する 02385 * ------------------------------------------------------------------ 02386 * returns: 02387 * -1 失敗 02388 * 1 成功 02389 */ 02390 char BOARDC_BNO055::execSelfTest(){ 02391 return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x01); 02392 } 02393 02394 /* ================================================================== 02395 * システムの温度計測に使用するセンサーを取得する 02396 * ------------------------------------------------------------------ 02397 * returns: 02398 * 0 温度計測に加速度センサーを使用している 02399 * 1 温度計測に角速度センサーを使用している 02400 */ 02401 char BOARDC_BNO055::getTempSource(){ 02402 return ctrl->rr(0, BNO055P0_TEMP_SOURCE); 02403 } 02404 02405 /* ================================================================== 02406 * システムの温度計測に使用するセンサーを選択する 02407 * ------------------------------------------------------------------ 02408 * 引数Accelerometer: 02409 * true:加速度センサーを温度計測に使用する 02410 * false:角速度センサーを温度計測に使用する 02411 * ------------------------------------------------------------------ 02412 * returns: 02413 * -1 失敗 02414 * 1 成功 02415 */ 02416 char BOARDC_BNO055::setTempSource(bool Accelerometer){ 02417 return ctrl->wr(0, BNO055P0_TEMP_SOURCE, (Accelerometer) ? 0 : 1); 02418 } 02419 02420 /* ================================================================== 02421 * センサー出力軸交換情報の取得 02422 * ------------------------------------------------------------------ 02423 * returns: 02424 * AXIS_MAP_CONFIGの設定情報:BNO055データシート [3.4 Axis remap] を参照 02425 */ 02426 char BOARDC_BNO055::getAxisMapConfig(){ 02427 char ret = ctrl->rr(0, BNO055P0_AXIS_MAP_CONFIG); 02428 if(axisRemap != ret) axisRemap = ret; 02429 return axisRemap; 02430 } 02431 02432 /* ================================================================== 02433 * センサー出力軸交換の設定 02434 * ------------------------------------------------------------------ 02435 * 引数val: 02436 * X,Y,Zの出力交換の情報 02437 * (BNO055データシート [3.4 Axis remap] を参照 02438 * ------------------------------------------------------------------ 02439 * returns: 02440 * -1 失敗 02441 * 0 変更なし 02442 * 1 成功 02443 */ 02444 char BOARDC_BNO055::setAxisMapConfig(char val){ 02445 if(axisRemap == (val & 0x3F)) return 0; 02446 else axisRemap = (val & 0x3F); 02447 return ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02448 } 02449 02450 /* ================================================================== 02451 * センサー出力軸符号情報の取得 02452 * ------------------------------------------------------------------ 02453 * returns: 02454 * AXIS_MAP_SIGNの設定情報:BNO055データシート [3.4 Axis remap] を参照 02455 */ 02456 char BOARDC_BNO055::getAxisMapSign(){ 02457 char ret = ctrl->rr(0, BNO055P0_AXIS_MAP_SIGN); 02458 if(axisSign != ret) axisSign = ret; 02459 return axisSign; 02460 } 02461 02462 /* ================================================================== 02463 * センサー出力軸符号の設定 02464 * ------------------------------------------------------------------ 02465 * 引数val: 02466 * X,Y,Zの出力符号の情報 02467 * (BNO055データシート [3.4 Axis remap] を参照 02468 * ------------------------------------------------------------------ 02469 * returns: 02470 * -1 失敗 02471 * 0 変更なし 02472 * 1 成功 02473 */ 02474 char BOARDC_BNO055::setAxisMapSign(char val){ 02475 if(axisSign == (val & 0x07)) return 0; 02476 else axisSign = (val & 0x07); 02477 return ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02478 } 02479 02480 /* ================================================================== 02481 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側左上] 02482 * ------------------------------------------------------------------ 02483 * (BNO055データシート [3.4 Axis remap] を参照 02484 * ------------------------------------------------------------------ 02485 * returns: 02486 * -1 AXIS_MAP_CONFIG設定の失敗 02487 * -2 AXIS_MAP_SIGN設定の失敗 02488 * 1 成功 02489 */ 02490 char BOARDC_BNO055::setAxisRemap_topview_topleft(){ 02491 axisRemap = 0x21; 02492 axisSign = 0x04; 02493 char ret = 0; 02494 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02495 if(ret == -1) return -1; 02496 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02497 if(ret == -1) return -2; 02498 return 1; 02499 } 02500 02501 /* ================================================================== 02502 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側右上] 02503 * ------------------------------------------------------------------ 02504 * (BNO055データシート [3.4 Axis remap] を参照 02505 * ------------------------------------------------------------------ 02506 * returns: 02507 * -1 AXIS_MAP_CONFIG設定の失敗 02508 * -2 AXIS_MAP_SIGN設定の失敗 02509 * 1 成功 02510 */ 02511 char BOARDC_BNO055::setAxisRemap_topview_topright(){ 02512 axisRemap = 0x24; 02513 axisSign = 0x00; 02514 char ret = 0; 02515 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02516 if(ret == -1) return -1; 02517 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02518 if(ret == -1) return -2; 02519 return 1; 02520 } 02521 02522 /* ================================================================== 02523 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側左下] 02524 * ------------------------------------------------------------------ 02525 * (BNO055データシート [3.4 Axis remap] を参照 02526 * ------------------------------------------------------------------ 02527 * returns: 02528 * -1 AXIS_MAP_CONFIG設定の失敗 02529 * -2 AXIS_MAP_SIGN設定の失敗 02530 * 1 成功 02531 */ 02532 char BOARDC_BNO055::setAxisRemap_topview_bottomleft(){ 02533 axisRemap = 0x24; 02534 axisSign = 0x06; 02535 char ret = 0; 02536 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02537 if(ret == -1) return -1; 02538 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02539 if(ret == -1) return -2; 02540 return 1; 02541 } 02542 02543 /* ================================================================== 02544 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側右下] 02545 * ------------------------------------------------------------------ 02546 * (BNO055データシート [3.4 Axis remap] を参照 02547 * ------------------------------------------------------------------ 02548 * returns: 02549 * -1 AXIS_MAP_CONFIG設定の失敗 02550 * -2 AXIS_MAP_SIGN設定の失敗 02551 * 1 成功 02552 */ 02553 char BOARDC_BNO055::setAxisRemap_topview_bottomright(){ 02554 axisRemap = 0x21; 02555 axisSign = 0x02; 02556 char ret = 0; 02557 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02558 if(ret == -1) return -1; 02559 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02560 if(ret == -1) return -2; 02561 return 1; 02562 } 02563 02564 /* ================================================================== 02565 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側左上] 02566 * ------------------------------------------------------------------ 02567 * (BNO055データシート [3.4 Axis remap] を参照 02568 * ------------------------------------------------------------------ 02569 * returns: 02570 * -1 AXIS_MAP_CONFIG設定の失敗 02571 * -2 AXIS_MAP_SIGN設定の失敗 02572 * 1 成功 02573 */ 02574 char BOARDC_BNO055::setAxisRemap_bottomview_topleft(){ 02575 axisRemap = 0x24; 02576 axisSign = 0x03; 02577 char ret = 0; 02578 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02579 if(ret == -1) return -1; 02580 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02581 if(ret == -1) return -2; 02582 return 1; 02583 } 02584 02585 /* ================================================================== 02586 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側右上] 02587 * ------------------------------------------------------------------ 02588 * (BNO055データシート [3.4 Axis remap] を参照 02589 * ------------------------------------------------------------------ 02590 * returns: 02591 * -1 AXIS_MAP_CONFIG設定の失敗 02592 * -2 AXIS_MAP_SIGN設定の失敗 02593 * 1 成功 02594 */ 02595 char BOARDC_BNO055::setAxisRemap_bottomview_topright(){ 02596 axisRemap = 0x21; 02597 axisSign = 0x01; 02598 char ret = 0; 02599 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02600 if(ret == -1) return -1; 02601 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02602 if(ret == -1) return -2; 02603 return 1; 02604 } 02605 02606 /* ================================================================== 02607 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側左下] 02608 * ------------------------------------------------------------------ 02609 * (BNO055データシート [3.4 Axis remap] を参照 02610 * ------------------------------------------------------------------ 02611 * returns: 02612 * -1 AXIS_MAP_CONFIG設定の失敗 02613 * -2 AXIS_MAP_SIGN設定の失敗 02614 * 1 成功 02615 */ 02616 char BOARDC_BNO055::setAxisRemap_bottomview_bottomleft(){ 02617 axisRemap = 0x21; 02618 axisSign = 0x07; 02619 char ret = 0; 02620 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02621 if(ret == -1) return -1; 02622 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02623 if(ret == -1) return -2; 02624 return 1; 02625 } 02626 02627 /* ================================================================== 02628 * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側右下] 02629 * ------------------------------------------------------------------ 02630 * (BNO055データシート [3.4 Axis remap] を参照 02631 * ------------------------------------------------------------------ 02632 * returns: 02633 * -1 AXIS_MAP_CONFIG設定の失敗 02634 * -2 AXIS_MAP_SIGN設定の失敗 02635 * 1 成功 02636 */ 02637 char BOARDC_BNO055::setAxisRemap_bottomview_bottomright(){ 02638 axisRemap = 0x24; 02639 axisSign = 0x05; 02640 char ret = 0; 02641 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap); 02642 if(ret == -1) return -1; 02643 ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign); 02644 if(ret == -1) return -2; 02645 return 1; 02646 } 02647 02648 /* ================================================================== 02649 * センサー出力軸の符号と交換の情報を直感的な形で取得する 02650 * ------------------------------------------------------------------ 02651 * (BNO055データシート [3.4 Axis remap] を参照 02652 * ------------------------------------------------------------------ 02653 * returns: 02654 * 0 [P0]表側から見たとき、BNO055の1pinが表側左上にある状態 02655 * 1 [P1]表側から見たとき、BNO055の1pinが表側右上にある状態 02656 * 2 [P2]表側から見たとき、BNO055の1pinが表側左下にある状態 02657 * 3 [P3]表側から見たとき、BNO055の1pinが表側右下にある状態 02658 * 4 [P4]表側から見たとき、BNO055の1pinが裏側左上にある状態 02659 * 5 [P5]表側から見たとき、BNO055の1pinが裏側右上にある状態 02660 * 6 [P6]表側から見たとき、BNO055の1pinが裏側左下にある状態 02661 * 7 [P7]表側から見たとき、BNO055の1pinが裏側右下にある状態 02662 * -1 それ以外の設定 02663 */ 02664 char BOARDC_BNO055::getAxisRemap_type(){ 02665 getAxisMapConfig(); //axisRemapに最新の値を格納 02666 getAxisMapSign(); //axisSignに最新の値を格納 02667 02668 if(axisRemap == 0x21){ 02669 switch(axisSign){ 02670 case 0x04: 02671 return 0; 02672 case 0x02: 02673 return 3; 02674 case 0x01: 02675 return 5; 02676 case 0x07: 02677 return 6; 02678 } 02679 }else if(axisRemap == 0x24){ 02680 switch(axisSign){ 02681 case 0x00: 02682 return 1; 02683 case 0x06: 02684 return 2; 02685 case 0x03: 02686 return 4; 02687 case 0x05: 02688 return 7; 02689 } 02690 } 02691 02692 return -1; 02693 } 02694 02695 /* ================================================================== 02696 * 加速度センサーの補正値を取得する 02697 * ------------------------------------------------------------------ 02698 * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される 02699 * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される 02700 * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される 02701 */ 02702 void BOARDC_BNO055::getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ){ 02703 //連続6byte読み取り 02704 char rsv[6]; 02705 ctrl->rrc(0, BNO055P0_ACC_OFFSET_X_LSB, rsv, 6); 02706 02707 short offX = (rsv[1] << 8) | rsv[0]; 02708 short offY = (rsv[3] << 8) | rsv[2]; 02709 short offZ = (rsv[5] << 8) | rsv[4]; 02710 offsetX = (1.0f * offX) * scaleACC; 02711 offsetY = (1.0f * offY) * scaleACC; 02712 offsetZ = (1.0f * offZ) * scaleACC; 02713 } 02714 02715 /* ================================================================== 02716 * 加速度センサーの補正値(X軸のみ)を取得する 02717 * ------------------------------------------------------------------ 02718 * returns: 02719 * X軸補正値(スケール乗算済み) 02720 */ 02721 float BOARDC_BNO055::getAccOffsetX(){ 02722 //連続2byte読み取り 02723 char rsv[2]; 02724 ctrl->rrc(0, BNO055P0_ACC_OFFSET_X_LSB, rsv, 2); 02725 02726 short offX = (rsv[1] << 8) | rsv[0]; 02727 return (1.0f * offX) * scaleACC; 02728 } 02729 02730 /* ================================================================== 02731 * 加速度センサーの補正値(Y軸のみ)を取得する 02732 * ------------------------------------------------------------------ 02733 * returns: 02734 * Y軸補正値(スケール乗算済み) 02735 */ 02736 float BOARDC_BNO055::getAccOffsetY(){ 02737 //連続2byte読み取り 02738 char rsv[2]; 02739 ctrl->rrc(0, BNO055P0_ACC_OFFSET_Y_LSB, rsv, 2); 02740 02741 short offX = (rsv[1] << 8) | rsv[0]; 02742 return (1.0f * offX) * scaleACC; 02743 } 02744 02745 /* ================================================================== 02746 * 加速度センサーの補正値(Z軸のみ)を取得する 02747 * ------------------------------------------------------------------ 02748 * returns: 02749 * Z軸補正値(スケール乗算済み) 02750 */ 02751 float BOARDC_BNO055::getAccOffsetZ(){ 02752 //連続2byte読み取り 02753 char rsv[2]; 02754 ctrl->rrc(0, BNO055P0_ACC_OFFSET_Z_LSB, rsv, 2); 02755 02756 short offX = (rsv[1] << 8) | rsv[0]; 02757 return (1.0f * offX) * scaleACC; 02758 } 02759 02760 /* ================================================================== 02761 * 加速度センサーの補正値を設定する 02762 * ------------------------------------------------------------------ 02763 * offsetX: スケール乗算済みのX軸の補正値 02764 * offsetY: スケール乗算済みのY軸の補正値 02765 * offsetZ: スケール乗算済みのZ軸の補正値 02766 * ------------------------------------------------------------------ 02767 * returns: 02768 * -1 失敗 02769 * 1 成功 02770 */ 02771 char BOARDC_BNO055::setAccOffsetAll(float offsetX, float offsetY, float offsetZ){ 02772 short offX = (short)((offsetX / scaleACC) + 0.5f); 02773 short offY = (short)((offsetY / scaleACC) + 0.5f); 02774 short offZ = (short)((offsetZ / scaleACC) + 0.5f); 02775 char msg[6]; 02776 msg[0] = offX & 0xFF; 02777 msg[1] = offX >> 8; 02778 msg[2] = offY & 0xFF; 02779 msg[3] = offY >> 8; 02780 msg[4] = offZ & 0xFF; 02781 msg[5] = offZ >> 8; 02782 02783 //連続6byte書き込み 02784 return ctrl->wrc(0, BNO055P0_ACC_OFFSET_X_LSB, msg, 6); 02785 } 02786 02787 char BOARDC_BNO055::setAccOffsetX(float offset){ 02788 short offX = (short)((offset / scaleACC) + 0.5f); 02789 char msg[2]; 02790 msg[0] = offX & 0xFF; 02791 msg[1] = offX >> 8; 02792 02793 //連続2byte書き込み 02794 return ctrl->wrc(0, BNO055P0_ACC_OFFSET_X_LSB, msg, 2); 02795 } 02796 02797 char BOARDC_BNO055::setAccOffsetY(float offset){ 02798 short offY = (short)((offset / scaleACC) + 0.5f); 02799 char msg[2]; 02800 msg[0] = offY & 0xFF; 02801 msg[1] = offY >> 8; 02802 02803 //連続2byte書き込み 02804 return ctrl->wrc(0, BNO055P0_ACC_OFFSET_Y_LSB, msg, 2); 02805 } 02806 02807 char BOARDC_BNO055::setAccOffsetZ(float offset){ 02808 short offZ = (short)((offset / scaleACC) + 0.5f); 02809 char msg[2]; 02810 msg[0] = offZ & 0xFF; 02811 msg[1] = offZ >> 8; 02812 02813 //連続2byte書き込み 02814 return ctrl->wrc(0, BNO055P0_ACC_OFFSET_Z_LSB, msg, 2); 02815 } 02816 02817 /* ================================================================== 02818 * 地磁気センサーの補正値を取得する 02819 * ------------------------------------------------------------------ 02820 * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される 02821 * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される 02822 * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される 02823 */ 02824 void BOARDC_BNO055::getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ){ 02825 //連続6byte読み取り 02826 char rsv[6]; 02827 ctrl->rrc(0, BNO055P0_MAG_OFFSET_X_LSB, rsv, 6); 02828 02829 short offX = (rsv[1] << 8) | rsv[0]; 02830 short offY = (rsv[3] << 8) | rsv[2]; 02831 short offZ = (rsv[5] << 8) | rsv[4]; 02832 offsetX = (1.0f * offX) * scaleMAG; 02833 offsetY = (1.0f * offY) * scaleMAG; 02834 offsetZ = (1.0f * offZ) * scaleMAG; 02835 } 02836 02837 /* ================================================================== 02838 * 地磁気センサーの補正値(X軸のみ)を取得する 02839 * ------------------------------------------------------------------ 02840 * returns: 02841 * X軸補正値(スケール乗算済み) 02842 */ 02843 float BOARDC_BNO055::getMagOffsetX(){ 02844 //連続2byte読み取り 02845 char rsv[2]; 02846 ctrl->rrc(0, BNO055P0_MAG_OFFSET_X_LSB, rsv, 2); 02847 02848 short offX = (rsv[1] << 8) | rsv[0]; 02849 return (1.0f * offX) * scaleMAG; 02850 } 02851 02852 /* ================================================================== 02853 * 地磁気センサーの補正値(Y軸のみ)を取得する 02854 * ------------------------------------------------------------------ 02855 * returns: 02856 * Y軸補正値(スケール乗算済み) 02857 */ 02858 float BOARDC_BNO055::getMagOffsetY(){ 02859 //連続2byte読み取り 02860 char rsv[2]; 02861 ctrl->rrc(0, BNO055P0_MAG_OFFSET_Y_LSB, rsv, 2); 02862 02863 short offY = (rsv[1] << 8) | rsv[0]; 02864 return (1.0f * offY) * scaleMAG; 02865 } 02866 02867 /* ================================================================== 02868 * 地磁気センサーの補正値(Z軸のみ)を取得する 02869 * ------------------------------------------------------------------ 02870 * returns: 02871 * Z軸補正値(スケール乗算済み) 02872 */ 02873 float BOARDC_BNO055::getMagOffsetZ(){ 02874 //連続2byte読み取り 02875 char rsv[2]; 02876 ctrl->rrc(0, BNO055P0_MAG_OFFSET_Z_LSB, rsv, 2); 02877 02878 short offZ = (rsv[1] << 8) | rsv[0]; 02879 return (1.0f * offZ) * scaleMAG; 02880 } 02881 02882 /* ================================================================== 02883 * 地磁気センサーの補正値を設定する 02884 * ------------------------------------------------------------------ 02885 * offsetX: スケール乗算済みのX軸の補正値 02886 * offsetY: スケール乗算済みのY軸の補正値 02887 * offsetZ: スケール乗算済みのZ軸の補正値 02888 * ------------------------------------------------------------------ 02889 * returns: 02890 * -1 失敗 02891 * 1 成功 02892 */ 02893 char BOARDC_BNO055::setMagOffsetAll(float offsetX, float offsetY, float offsetZ){ 02894 short offX = (short)((offsetX / scaleMAG) + 0.5f); 02895 short offY = (short)((offsetY / scaleMAG) + 0.5f); 02896 short offZ = (short)((offsetZ / scaleMAG) + 0.5f); 02897 char msg[6]; 02898 msg[0] = offX & 0xFF; 02899 msg[1] = offX >> 8; 02900 msg[2] = offY & 0xFF; 02901 msg[3] = offY >> 8; 02902 msg[4] = offZ & 0xFF; 02903 msg[5] = offZ >> 8; 02904 02905 //連続6byte書き込み 02906 return ctrl->wrc(0, BNO055P0_MAG_OFFSET_X_LSB, msg, 6); 02907 } 02908 02909 /* ================================================================== 02910 * 地磁気センサーの補正値(X軸のみ)を設定する 02911 * ------------------------------------------------------------------ 02912 * offset: スケール乗算済みの補正値 02913 * ------------------------------------------------------------------ 02914 * returns: 02915 * -1 失敗 02916 * 1 成功 02917 */ 02918 char BOARDC_BNO055::setMagOffsetX(float offset){ 02919 short offX = (short)((offset / scaleMAG) + 0.5f); 02920 char msg[2]; 02921 msg[0] = offX & 0xFF; 02922 msg[1] = offX >> 8; 02923 02924 //連続2byte書き込み 02925 return ctrl->wrc(0, BNO055P0_MAG_OFFSET_X_LSB, msg, 2); 02926 } 02927 02928 /* ================================================================== 02929 * 地磁気センサーの補正値(Y軸のみ)を設定する 02930 * ------------------------------------------------------------------ 02931 * offset: スケール乗算済みの補正値 02932 * ------------------------------------------------------------------ 02933 * returns: 02934 * -1 失敗 02935 * 1 成功 02936 */ 02937 char BOARDC_BNO055::setMagOffsetY(float offset){ 02938 short offY = (short)((offset / scaleMAG) + 0.5f); 02939 char msg[2]; 02940 msg[0] = offY & 0xFF; 02941 msg[1] = offY >> 8; 02942 02943 //連続2byte書き込み 02944 return ctrl->wrc(0, BNO055P0_MAG_OFFSET_Y_LSB, msg, 2); 02945 } 02946 02947 /* ================================================================== 02948 * 地磁気センサーの補正値(Z軸のみ)を設定する 02949 * ------------------------------------------------------------------ 02950 * offset: スケール乗算済みの補正値 02951 * ------------------------------------------------------------------ 02952 * returns: 02953 * -1 失敗 02954 * 1 成功 02955 */ 02956 char BOARDC_BNO055::setMagOffsetZ(float offset){ 02957 short offZ = (short)((offset / scaleMAG) + 0.5f); 02958 char msg[2]; 02959 msg[0] = offZ & 0xFF; 02960 msg[1] = offZ >> 8; 02961 02962 //連続2byte書き込み 02963 return ctrl->wrc(0, BNO055P0_MAG_OFFSET_Z_LSB, msg, 2); 02964 } 02965 02966 /* ================================================================== 02967 * 角速度センサーの補正値を取得する 02968 * ------------------------------------------------------------------ 02969 * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される 02970 * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される 02971 * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される 02972 */ 02973 void BOARDC_BNO055::getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ){ 02974 //連続6byte読み取り 02975 char rsv[6]; 02976 ctrl->rrc(0, BNO055P0_GYR_OFFSET_X_LSB, rsv, 6); 02977 02978 short offX = (rsv[1] << 8) | rsv[0]; 02979 short offY = (rsv[3] << 8) | rsv[2]; 02980 short offZ = (rsv[5] << 8) | rsv[4]; 02981 offsetX = (1.0f * offX) * scaleGYRO; 02982 offsetY = (1.0f * offY) * scaleGYRO; 02983 offsetZ = (1.0f * offZ) * scaleGYRO; 02984 } 02985 02986 /* ================================================================== 02987 * 角速度センサーの補正値(X軸のみ)を取得する 02988 * ------------------------------------------------------------------ 02989 * returns: 02990 * X軸補正値(スケール乗算済み) 02991 */ 02992 float BOARDC_BNO055::getGyroOffsetX(){ 02993 //連続2byte読み取り 02994 char rsv[2]; 02995 ctrl->rrc(0, BNO055P0_GYR_OFFSET_X_LSB, rsv, 2); 02996 02997 short offX = (rsv[1] << 8) | rsv[0]; 02998 return (1.0f * offX) * scaleGYRO; 02999 } 03000 03001 /* ================================================================== 03002 * 角速度センサーの補正値(Y軸のみ)を取得する 03003 * ------------------------------------------------------------------ 03004 * returns: 03005 * Y軸補正値(スケール乗算済み) 03006 */ 03007 float BOARDC_BNO055::getGyroOffsetY(){ 03008 //連続2byte読み取り 03009 char rsv[2]; 03010 ctrl->rrc(0, BNO055P0_GYR_OFFSET_Y_LSB, rsv, 2); 03011 03012 short offY = (rsv[1] << 8) | rsv[0]; 03013 return (1.0f * offY) * scaleGYRO; 03014 } 03015 03016 /* ================================================================== 03017 * 角速度センサーの補正値(Z軸のみ)を取得する 03018 * ------------------------------------------------------------------ 03019 * returns: 03020 * Z軸補正値(スケール乗算済み) 03021 */ 03022 float BOARDC_BNO055::getGyroOffsetZ(){ 03023 //連続2byte読み取り 03024 char rsv[2]; 03025 ctrl->rrc(0, BNO055P0_GYR_OFFSET_Z_LSB, rsv, 2); 03026 03027 short offZ = (rsv[1] << 8) | rsv[0]; 03028 return (1.0f * offZ) * scaleGYRO; 03029 } 03030 03031 /* ================================================================== 03032 * 角速度センサーの補正値を設定する 03033 * ------------------------------------------------------------------ 03034 * offsetX: スケール乗算済みのX軸の補正値 03035 * offsetY: スケール乗算済みのY軸の補正値 03036 * offsetZ: スケール乗算済みのZ軸の補正値 03037 * ------------------------------------------------------------------ 03038 * returns: 03039 * -1 失敗 03040 * 1 成功 03041 */ 03042 char BOARDC_BNO055::setGyroOffsetAll(float offsetX, float offsetY, float offsetZ){ 03043 short offX = (short)((offsetX / scaleGYRO) + 0.5f); 03044 short offY = (short)((offsetY / scaleGYRO) + 0.5f); 03045 short offZ = (short)((offsetZ / scaleGYRO) + 0.5f); 03046 char msg[6]; 03047 msg[0] = offX & 0xFF; 03048 msg[1] = offX >> 8; 03049 msg[2] = offY & 0xFF; 03050 msg[3] = offY >> 8; 03051 msg[4] = offZ & 0xFF; 03052 msg[5] = offZ >> 8; 03053 03054 //連続6byte書き込み 03055 return ctrl->wrc(0, BNO055P0_GYR_OFFSET_X_LSB, msg, 6); 03056 } 03057 03058 /* ================================================================== 03059 * 角速度センサーの補正値(X軸のみ)を設定する 03060 * ------------------------------------------------------------------ 03061 * offset: スケール乗算済みの補正値 03062 * ------------------------------------------------------------------ 03063 * returns: 03064 * -1 失敗 03065 * 1 成功 03066 */ 03067 char BOARDC_BNO055::setGyroOffsetX(float offset){ 03068 short offX = (short)((offset / scaleGYRO) + 0.5f); 03069 char msg[2]; 03070 msg[0] = offX & 0xFF; 03071 msg[1] = offX >> 8; 03072 03073 //連続2byte書き込み 03074 return ctrl->wrc(0, BNO055P0_GYR_OFFSET_X_LSB, msg, 2); 03075 } 03076 03077 /* ================================================================== 03078 * 角速度センサーの補正値(Y軸のみ)を設定する 03079 * ------------------------------------------------------------------ 03080 * offset: スケール乗算済みの補正値 03081 * ------------------------------------------------------------------ 03082 * returns: 03083 * -1 失敗 03084 * 1 成功 03085 */ 03086 char BOARDC_BNO055::setGyroOffsetY(float offset){ 03087 short offY = (short)((offset / scaleGYRO) + 0.5f); 03088 char msg[2]; 03089 msg[0] = offY & 0xFF; 03090 msg[1] = offY >> 8; 03091 03092 //連続2byte書き込み 03093 return ctrl->wrc(0, BNO055P0_GYR_OFFSET_Y_LSB, msg, 2); 03094 } 03095 03096 /* ================================================================== 03097 * 角速度センサーの補正値(Z軸のみ)を設定する 03098 * ------------------------------------------------------------------ 03099 * offset: スケール乗算済みの補正値 03100 * ------------------------------------------------------------------ 03101 * returns: 03102 * -1 失敗 03103 * 1 成功 03104 */ 03105 char BOARDC_BNO055::setGyroOffsetZ(float offset){ 03106 short offZ = (short)((offset / scaleGYRO) + 0.5f); 03107 char msg[2]; 03108 msg[0] = offZ & 0xFF; 03109 msg[1] = offZ >> 8; 03110 03111 //連続2byte書き込み 03112 return ctrl->wrc(0, BNO055P0_GYR_OFFSET_Z_LSB, msg, 2); 03113 } 03114 03115 /* ================================================================== 03116 * 加速度センサーのデータ出力範囲[単位:LSB]を取得する 03117 * ------------------------------------------------------------------ 03118 * returns: 03119 * +-データ計測範囲[単位:LSB] 03120 */ 03121 short BOARDC_BNO055::getAccRadius(){ 03122 //連続2byte読み取り 03123 char rsv[2]; 03124 ctrl->rrc(0, BNO055P0_ACC_RADIUS_LSB, rsv, 2); 03125 03126 return (rsv[1] << 8) | rsv[0]; 03127 } 03128 03129 /* ================================================================== 03130 * 加速度センサーのデータ出力範囲[単位:LSB]を設定する 03131 * ------------------------------------------------------------------ 03132 * 引数r: データ計測範囲の最大値および最低値(-r から +r の範囲が計測範囲) 03133 * 最大値は1000[LSB] 03134 * ------------------------------------------------------------------ 03135 * returns: 03136 * -1 失敗 03137 * 1 成功 03138 */ 03139 char BOARDC_BNO055::setAccRadius(short LSB){ 03140 if(LSB > 1000) LSB = 1000; 03141 03142 char msg[2]; 03143 msg[0] = LSB & 0xFF; 03144 msg[1] = LSB >> 8; 03145 03146 //連続2byte書き込み 03147 return ctrl->wrc(0, BNO055P0_ACC_RADIUS_LSB, msg, 2); 03148 } 03149 03150 /* ================================================================== 03151 * 地磁気センサーのデータ出力範囲[単位:LSB]を取得する 03152 * ------------------------------------------------------------------ 03153 * returns: 03154 * +-データ計測範囲 03155 */ 03156 short BOARDC_BNO055::getMagRadius(){ 03157 //連続2byte読み取り 03158 char rsv[2]; 03159 ctrl->rrc(0, BNO055P0_MAG_RADIUS_LSB, rsv, 2); 03160 03161 return (rsv[1] << 8) | rsv[0]; 03162 } 03163 03164 /* ================================================================== 03165 * 加速度センサーのデータ出力範囲[単位:LSB]を設定する 03166 * ------------------------------------------------------------------ 03167 * 引数r: データ計測範囲の最大値および最低値(-r から +r の範囲が計測範囲) 03168 * 最大値は960[LSB] 03169 * ------------------------------------------------------------------ 03170 * returns: 03171 * -1 失敗 03172 * 1 成功 03173 */ 03174 char BOARDC_BNO055::setMagRadius(short LSB){ 03175 if(LSB > 960) LSB = 960; 03176 03177 char msg[2]; 03178 msg[0] = LSB & 0xFF; 03179 msg[1] = LSB >> 8; 03180 03181 //連続2byte書き込み 03182 return ctrl->wrc(0, BNO055P0_MAG_RADIUS_LSB, msg, 2); 03183 } 03184 03185 /* ================================================================== 03186 * 加速度センサー設定のレジスタ値を取得する 03187 * ------------------------------------------------------------------ 03188 * returns: 03189 * 加速度センサー設定のレジスタ値 03190 */ 03191 char BOARDC_BNO055::getAccConfig(){ 03192 return ctrl->rr(1, BNO055P1_ACC_CONFIG); 03193 } 03194 03195 /* ================================================================== 03196 * 加速度センサー設定のレジスタ値を設定する 03197 * ------------------------------------------------------------------ 03198 * 引数regVal: 加速度センサー設定のレジスタ値 03199 * ------------------------------------------------------------------ 03200 * returns: 03201 * -1 失敗 03202 * 1 成功 03203 */ 03204 char BOARDC_BNO055::setAccConfig(char regVal){ 03205 return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal); 03206 } 03207 03208 /* ================================================================== 03209 * 加速度センサー設定のレジスタ値を設定する 03210 * ------------------------------------------------------------------ 03211 * 引数gRange: 加速度センサーの計測範囲 03212 * 引数bandWidth: 加速度センサー出力レート(Fusion時は自動設定) 03213 * 引数powMode: 加速度センサー電源設定(Fusion時は自動設定) 03214 * ------------------------------------------------------------------ 03215 * returns: 03216 * -1 失敗 03217 * 1 成功 03218 */ 03219 char BOARDC_BNO055::setAccConfig(char gRange, char bandWidth, char powMode){ 03220 char regVal = (powMode << 5) | (bandWidth << 2) | gRange; 03221 return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal); 03222 } 03223 03224 /* ================================================================== 03225 * 加速度センサーの計測範囲を設定する 03226 * ------------------------------------------------------------------ 03227 * 引数G: 加速度センサーの計測範囲(+-2, 4, 8, 16Gのいずれか) 03228 * ------------------------------------------------------------------ 03229 * returns: 03230 * -1 失敗 03231 * 1 成功 03232 */ 03233 char BOARDC_BNO055::setAccRange(unsigned char G){ 03234 char val = 0; 03235 switch(G){ 03236 case 2: 03237 val = 0x00; 03238 break; 03239 case 4: 03240 val = 0x01; 03241 break; 03242 case 8: 03243 val = 0x02; 03244 break; 03245 case 16: 03246 val = 0x03; 03247 break; 03248 default: 03249 val = 0x02; 03250 } 03251 03252 char regVal = ctrl->rr(1, BNO055P1_ACC_CONFIG); 03253 regVal = (regVal & 0xFC) | val; 03254 03255 return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal); 03256 } 03257 03258 /* ================================================================== 03259 * 地磁気センサー設定のレジスタ値を取得する 03260 * ------------------------------------------------------------------ 03261 * returns: 03262 * 地磁気センサー設定のレジスタ値 03263 */ 03264 char BOARDC_BNO055::getMagConfig(){ 03265 return ctrl->rr(1, BNO055P1_MAG_CONFIG); 03266 } 03267 03268 /* ================================================================== 03269 * 地磁気センサー設定のレジスタ値を設定する 03270 * ------------------------------------------------------------------ 03271 * 引数regVal: 地磁気センサー設定のレジスタ値 03272 * ------------------------------------------------------------------ 03273 * returns: 03274 * -1 失敗 03275 * 1 成功 03276 */ 03277 char BOARDC_BNO055::setMagConfig(char regVal){ 03278 return ctrl->wr(1, BNO055P1_MAG_CONFIG, regVal); 03279 } 03280 03281 /* ================================================================== 03282 * 地磁気センサー設定のレジスタ値を設定する 03283 * ------------------------------------------------------------------ 03284 * 引数rate: 地磁気センサー出力レート(Fusion時は自動設定) 03285 * 引数oprMode: 地磁気センサー出力モード(Fusion時は自動設定) 03286 * 引数powMode: 地磁気センサー電源設定(Fusion時は自動設定) 03287 * ------------------------------------------------------------------ 03288 * returns: 03289 * -1 失敗 03290 * 1 成功 03291 */ 03292 char BOARDC_BNO055::setMagConfig(char rate, char oprMode, char powMode){ 03293 char regVal = powMode << 5 | oprMode << 3 | rate; 03294 return ctrl->wr(1, BNO055P1_MAG_CONFIG, regVal); 03295 } 03296 03297 /* ================================================================== 03298 * 角速度センサー設定(0)のレジスタ値を取得する 03299 * ------------------------------------------------------------------ 03300 * returns: 03301 * 角速度センサー設定(0)のレジスタ値 03302 */ 03303 char BOARDC_BNO055::getGyroConfig_0(){ 03304 return ctrl->rr(1, BNO055P1_GYR_CONFIG_0); 03305 } 03306 03307 /* ================================================================== 03308 * 角速度センサー設定(0)のレジスタ値を設定する 03309 * ------------------------------------------------------------------ 03310 * 引数regVal: 角速度センサー設定(0)のレジスタ値 03311 * ------------------------------------------------------------------ 03312 * returns: 03313 * -1 失敗 03314 * 1 成功 03315 */ 03316 char BOARDC_BNO055::setGyroConfig_0(char regVal){ 03317 return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal); 03318 } 03319 03320 /* ================================================================== 03321 * 角速度センサー設定(0)のレジスタ値を設定する 03322 * ------------------------------------------------------------------ 03323 * 引数range: 角速度センサーの計測範囲(Fusion時は自動設定) 03324 * 引数bandWidth: 角速度センサー出力レート(Fusion時は自動設定) 03325 * ------------------------------------------------------------------ 03326 * returns: 03327 * -1 失敗 03328 * 1 成功 03329 */ 03330 char BOARDC_BNO055::setGyroConfig_0(char range, char bandWidth){ 03331 char regVal = bandWidth << 3 | range; 03332 return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal); 03333 } 03334 03335 /* ================================================================== 03336 * 角速度センサー設定(1)のレジスタ値を取得する 03337 * ------------------------------------------------------------------ 03338 * returns: 03339 * 角速度センサー設定(1)のレジスタ値 03340 */ 03341 char BOARDC_BNO055::getGyroConfig_1(){ 03342 return ctrl->rr(1, BNO055P1_GYR_CONFIG_0); 03343 } 03344 03345 /* ================================================================== 03346 * 角速度センサー設定(1)のレジスタ値を設定する 03347 * ------------------------------------------------------------------ 03348 * 引数powMode: 角速度センサーの電源設定(Fusion時は自動設定) 03349 * ------------------------------------------------------------------ 03350 * returns: 03351 * -1 失敗 03352 * 1 成功 03353 */ 03354 char BOARDC_BNO055::setGyroConfig_1(char powMode){ 03355 return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, powMode & 0x07); 03356 } 03357 03358 /* ================================================================== 03359 * 角速度センサーの計測範囲を設定する 03360 * ------------------------------------------------------------------ 03361 * 引数G: 角速度センサーの計測範囲(2000, 1000, 500, 250, 125dpsのいずれか) 03362 * ------------------------------------------------------------------ 03363 * returns: 03364 * -1 失敗 03365 * 1 成功 03366 */ 03367 char BOARDC_BNO055::setGyroRange(unsigned short dps){ 03368 char val = 0; 03369 switch(dps){ 03370 case 2000: 03371 val = 0; 03372 break; 03373 case 1000: 03374 val = 1; 03375 break; 03376 case 500: 03377 val = 2; 03378 break; 03379 case 250: 03380 val = 3; 03381 break; 03382 case 125: 03383 val = 4; 03384 break; 03385 default: 03386 val = 1; 03387 } 03388 03389 char regVal = ctrl->rr(1, BNO055P1_GYR_CONFIG_0); 03390 regVal = (regVal & 0xF8) + val; 03391 03392 return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal); 03393 } 03394 03395 /* ================================================================== 03396 * 加速度センサーのスリープモードのレジスタ値を取得する 03397 * ------------------------------------------------------------------ 03398 * returns: 03399 * 加速度センサーのスリープモードのレジスタ値 03400 */ 03401 char BOARDC_BNO055::getAccSleepConfig(){ 03402 return ctrl->rr(1, BNO055P1_ACC_SLEEP_CONFIG); 03403 } 03404 03405 /* ================================================================== 03406 * 加速度センサーのスリープモードのレジスタ値を設定する 03407 * ------------------------------------------------------------------ 03408 * 引数regVal: 加速度センサーのスリープモードのレジスタ値 03409 * ------------------------------------------------------------------ 03410 * returns: 03411 * -1 失敗 03412 * 1 成功 03413 */ 03414 char BOARDC_BNO055::setAccSleepConfig(char regVal){ 03415 return ctrl->wr(1, BNO055P1_ACC_SLEEP_CONFIG, regVal); 03416 } 03417 03418 /* ================================================================== 03419 * 加速度センサーのスリープモードのレジスタ値を設定する 03420 * ------------------------------------------------------------------ 03421 * 引数duration: 加速度センサーのスリープモードの持続閾値 03422 * 引数mode: 加速度センサーのスリープモード選択 03423 * ------------------------------------------------------------------ 03424 * returns: 03425 * -1 失敗 03426 * 1 成功 03427 */ 03428 char BOARDC_BNO055::setAccSleepConfig(char duration, char mode){ 03429 char regVal = duration << 1 | mode; 03430 return ctrl->wr(1, BNO055P1_ACC_SLEEP_CONFIG, regVal); 03431 } 03432 03433 /* ================================================================== 03434 * 角速度センサーのスリープモードのレジスタ値を取得する 03435 * ------------------------------------------------------------------ 03436 * returns: 03437 * 角速度センサーのスリープモードのレジスタ値 03438 */ 03439 char BOARDC_BNO055::getGyroSleepConfig(){ 03440 return ctrl->rr(1, BNO055P1_GYR_SLEEP_CONFIG); 03441 } 03442 03443 /* ================================================================== 03444 * 角速度センサーのスリープモードのレジスタ値を設定する 03445 * ------------------------------------------------------------------ 03446 * 引数regVal: 角速度センサーのスリープモードのレジスタ値 03447 * ------------------------------------------------------------------ 03448 * returns: 03449 * -1 失敗 03450 * 1 成功 03451 */ 03452 char BOARDC_BNO055::setGyroSleepConfig(char regVal){ 03453 return ctrl->wr(1, BNO055P1_GYR_SLEEP_CONFIG, regVal); 03454 } 03455 03456 /* ================================================================== 03457 * 角速度センサーのスリープモードのレジスタ値を設定する 03458 * ------------------------------------------------------------------ 03459 * 引数duration: 角速度センサーの自動スリープモードの持続閾値 03460 * 引数mode: 角速度センサーのスリープモードの持続閾値 03461 * ------------------------------------------------------------------ 03462 * returns: 03463 * -1 失敗 03464 * 1 成功 03465 */ 03466 char BOARDC_BNO055::setGyroSleepConfig(char autoSleepDuration, char duration){ 03467 char regVal = autoSleepDuration << 3 | duration; 03468 return ctrl->wr(1, BNO055P1_GYR_SLEEP_CONFIG, regVal); 03469 } 03470 03471 /* ================================================================== 03472 * 各センサーの割り込みフラグ発生のINTピン出力許可設定を取得する 03473 * ------------------------------------------------------------------ 03474 * returns: 03475 * 各センサーの割り込みフラグ有効無効設定のレジスタ値 03476 * 2bit目 角速度センサーAnyMotion割り込み(0:無効, 1:許可) 03477 * 3bit目 角速度センサーHighRate割り込み(0:無効, 1:許可) 03478 * 5bit目 加速度センサーHIGH_G割り込み(0:無効, 1:許可) 03479 * 6bit目 加速度センサーAnyMotion割り込み(0:無効, 1:許可) 03480 * 7bit目 加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:許可) 03481 */ 03482 char BOARDC_BNO055::getInterruptMask(){ 03483 return ctrl->rr(1, BNO055P1_INT_MSK); 03484 } 03485 03486 /* ================================================================== 03487 * 各センサーの割り込みフラグ発生のINTピン出力許可設定を設定する 03488 * ------------------------------------------------------------------ 03489 * 引数mask: 各センサーの割り込みフラグ有効無効設定のレジスタ値 03490 * 2bit目 角速度センサーAnyMotion割り込み(0:無効, 1:許可) 03491 * 3bit目 角速度センサーHighRate割り込み(0:無効, 1:許可) 03492 * 5bit目 加速度センサーHIGH_G割り込み(0:無効, 1:許可) 03493 * 6bit目 加速度センサーAnyMotion割り込み(0:無効, 1:許可) 03494 * 7bit目 加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:許可) 03495 * ------------------------------------------------------------------ 03496 * returns: 03497 * -1 失敗 03498 * 1 成功 03499 */ 03500 char BOARDC_BNO055::setInterruptMask(char mask){ 03501 return ctrl->wr(1, BNO055P1_INT_MSK, mask); 03502 } 03503 03504 /* ================================================================== 03505 * 各センサーの割り込みフラグ有効無効設定を取得する 03506 * ------------------------------------------------------------------ 03507 * returns: 03508 * 各センサーの割り込みフラグ有効無効設定のレジスタ値 03509 * 2bit目 角速度センサーAnyMotion割り込み(0:無効, 1:有効) 03510 * 3bit目 角速度センサーHighRate割り込み(0:無効, 1:有効) 03511 * 5bit目 加速度センサーHIGH_G割り込み(0:無効, 1:有効) 03512 * 6bit目 加速度センサーAnyMotion割り込み(0:無効, 1:有効) 03513 * 7bit目 加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:有効) 03514 */ 03515 char BOARDC_BNO055::getInterruptEnable(){ 03516 return ctrl->rr(1, BNO055P1_INT_EN); 03517 } 03518 03519 /* ================================================================== 03520 * 各センサーの割り込みフラグ有効無効設定を設定する 03521 * ------------------------------------------------------------------ 03522 * 引数mask: 各センサーの割り込みフラグ有効無効設定のレジスタ値 03523 * 2bit目 角速度センサーAnyMotion割り込み(0:無効, 1:有効) 03524 * 3bit目 角速度センサーHighRate割り込み(0:無効, 1:有効) 03525 * 5bit目 加速度センサーHIGH_G割り込み(0:無効, 1:有効) 03526 * 6bit目 加速度センサーAnyMotion割り込み(0:無効, 1:有効) 03527 * 7bit目 加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:有効) 03528 * ------------------------------------------------------------------ 03529 * returns: 03530 * -1 失敗 03531 * 1 成功 03532 */ 03533 char BOARDC_BNO055::setInterruptEnable(char mask){ 03534 return ctrl->wr(1, BNO055P1_INT_EN, mask); 03535 } 03536 03537 /* ================================================================== 03538 * 加速度センサーのAnyMotion割り込み発生閾値を取得する 03539 * ------------------------------------------------------------------ 03540 * 引数ismg: 出力する値の単位の選択(true: mG, false: mm/s^2) 03541 * ------------------------------------------------------------------ 03542 * returns: 03543 * 加速度センサーのAnyMotion割り込み発生閾値 03544 */ 03545 float BOARDC_BNO055::getAccAnyMotionThreashold(bool ismg){ 03546 char rc = getAccConfig(); 03547 float scale = 0.0f; 03548 03549 switch(rc & 0x03){ 03550 case 0: 03551 scale = 3.91; 03552 break; 03553 case 1: 03554 scale = 7.81; 03555 break; 03556 case 2: 03557 scale = 15.63; 03558 break; 03559 case 3: 03560 scale = 31.25; 03561 break; 03562 } 03563 03564 scale *= (ismg) ? 1.0 : 9.80665; 03565 03566 return (1.0 * ctrl->rr(1, BNO055P1_ACC_AM_THRES)) * scale; 03567 } 03568 03569 /* ================================================================== 03570 * 加速度センサーのAnyMotion割り込み発生閾値を設定する 03571 * ------------------------------------------------------------------ 03572 * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2) 03573 * 引数threashold: 単位変換済みの閾値 03574 * ------------------------------------------------------------------ 03575 * returns: 03576 * -1 失敗 03577 * 1 成功 03578 */ 03579 char BOARDC_BNO055::setAccAnyMotionThreashold(bool ismg, float threashold){ 03580 char rc = getAccConfig(); 03581 float scale = 0.0f; 03582 03583 switch(rc & 0x03){ 03584 case 0: 03585 scale = 3.91; 03586 break; 03587 case 1: 03588 scale = 7.81; 03589 break; 03590 case 2: 03591 scale = 15.63; 03592 break; 03593 case 3: 03594 scale = 31.25; 03595 break; 03596 } 03597 03598 scale *= (ismg) ? 1.0 : 9.8; 03599 03600 char cTh = (char)((threashold / scale) + 0.5); 03601 03602 return ctrl->wr(1, BNO055P1_ACC_AM_THRES, cTh); 03603 } 03604 03605 /* ================================================================== 03606 * 加速度センサーの割り込み使用設定を取得する 03607 * ------------------------------------------------------------------ 03608 * returns: 03609 * 0bit目,1bit目 連続発生閾値([1bit目+0bit目+1]回の発生でフラグON) 03610 * 2bit目 AM/NM_X_AXISトリガー使用(0:使用しない, 1:使用する) 03611 * 3bit目 AM/NM_Y_AXISトリガー使用(0:使用しない, 1:使用する) 03612 * 4bit目 AM/NM_Z_AXISトリガー使用(0:使用しない, 1:使用する) 03613 * 5bit目 HG_X_AXISトリガー使用(0:使用しない, 1:使用する) 03614 * 6bit目 HG_Y_AXISトリガー使用(0:使用しない, 1:使用する) 03615 * 7bit目 HG_Z_AXISトリガー使用(0:使用しない, 1:使用する) 03616 */ 03617 char BOARDC_BNO055::getAccInterruptSettings(){ 03618 return ctrl->rr(1, BNO055P1_ACC_INT_SETTINGS); 03619 } 03620 03621 /* ================================================================== 03622 * 加速度センサーの割り込み使用設定を設定する 03623 * ------------------------------------------------------------------ 03624 * 引数settings: 03625 * 0bit目,1bit目 連続発生閾値([1bit目+0bit目+1]回の発生でフラグON) 03626 * 2bit目 AM/NM_X_AXISトリガー使用(0:使用しない, 1:使用する) 03627 * 3bit目 AM/NM_Y_AXISトリガー使用(0:使用しない, 1:使用する) 03628 * 4bit目 AM/NM_Z_AXISトリガー使用(0:使用しない, 1:使用する) 03629 * 5bit目 HG_X_AXISトリガー使用(0:使用しない, 1:使用する) 03630 * 6bit目 HG_Y_AXISトリガー使用(0:使用しない, 1:使用する) 03631 * 7bit目 HG_Z_AXISトリガー使用(0:使用しない, 1:使用する) 03632 * ------------------------------------------------------------------ 03633 * returns: 03634 * -1 失敗 03635 * 1 成功 03636 */ 03637 char BOARDC_BNO055::setAccInterruptSettings(char settings){ 03638 return ctrl->wr(1, BNO055P1_ACC_INT_SETTINGS, settings); 03639 } 03640 03641 /* ================================================================== 03642 * 加速度センサーのHighG割り込み閾値を取得する 03643 * ------------------------------------------------------------------ 03644 * returns: 03645 * HighG割り込み発生閾値[単位:ミリ秒](2ms - 512ms) 03646 */ 03647 unsigned short BOARDC_BNO055::getAccHighGduration(){ 03648 return (ctrl->rr(1, BNO055P1_ACC_HG_DURATION) + 1) << 1; 03649 } 03650 03651 /* ================================================================== 03652 * 加速度センサーのHighG割り込み継続発生閾値を設定する 03653 * ------------------------------------------------------------------ 03654 * 引数ms: HighG割り込み継続発生閾値[単位:ミリ秒](2ms - 512ms) 03655 * ------------------------------------------------------------------ 03656 * returns: 03657 * -1 失敗 03658 * 1 成功 03659 */ 03660 char BOARDC_BNO055::setAccHighGduration(short ms){ 03661 if(ms > 512 || ms < 2) return -1; 03662 03663 ms = (ms >> 1) - 1; 03664 03665 return ctrl->wr(1, BNO055P1_ACC_HG_DURATION, ms & 0xFF); 03666 } 03667 03668 /* ================================================================== 03669 * 加速度センサーのHighG割り込み発生閾値を取得する 03670 * ------------------------------------------------------------------ 03671 * 引数ismg: 出力する値の単位の選択(true: mG, false: mm/s^2) 03672 * ------------------------------------------------------------------ 03673 * returns: 03674 * HighG割り込み発生閾値 03675 */ 03676 float BOARDC_BNO055::getAccHighGThreashold(bool ismg){ 03677 char rc = getAccConfig(); 03678 float scale = 0.0f; 03679 03680 switch(rc & 0x03){ 03681 case 0: 03682 scale = 7.81; 03683 break; 03684 case 1: 03685 scale = 15.63; 03686 break; 03687 case 2: 03688 scale = 31.25; 03689 break; 03690 case 3: 03691 scale = 62.5; 03692 break; 03693 } 03694 03695 scale *= (ismg) ? 1.0 : 9.8; 03696 03697 return (1.0 * ctrl->rr(1, BNO055P1_ACC_HG_THRES)) * scale; 03698 } 03699 03700 /* ================================================================== 03701 * 加速度センサーのHighG割り込み発生閾値を設定する 03702 * ------------------------------------------------------------------ 03703 * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2) 03704 * 引数threashold: 単位変換済みの閾値 03705 * ------------------------------------------------------------------ 03706 * returns: 03707 * -1 失敗 03708 * 1 成功 03709 */ 03710 char BOARDC_BNO055::setAccHighGThreashold(bool ismg, float threashold){ 03711 char rc = getAccConfig(); 03712 float scale = 0.0f; 03713 03714 switch(rc & 0x03){ 03715 case 0: 03716 scale = 7.81; 03717 break; 03718 case 1: 03719 scale = 15.63; 03720 break; 03721 case 2: 03722 scale = 31.25; 03723 break; 03724 case 3: 03725 scale = 62.5; 03726 break; 03727 } 03728 03729 scale *= (ismg) ? 1.0 : 9.8; 03730 03731 char cTh = (char)((threashold / scale) + 0.5); 03732 03733 return ctrl->wr(1, BNO055P1_ACC_HG_THRES, cTh); 03734 } 03735 03736 /* ================================================================== 03737 * 加速度センサーのNoMotion割り込み発生閾値を取得する 03738 * ------------------------------------------------------------------ 03739 * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2) 03740 * ------------------------------------------------------------------ 03741 * returns: 03742 * NoMotion割り込み発生閾値 03743 */ 03744 float BOARDC_BNO055::getAccNMThreashold(bool ismg){ 03745 char rc = getAccConfig(); 03746 float scale = 0.0f; 03747 03748 switch(rc & 0x03){ 03749 case 0: 03750 scale = 3.91; 03751 break; 03752 case 1: 03753 scale = 7.81; 03754 break; 03755 case 2: 03756 scale = 15.63; 03757 break; 03758 case 3: 03759 scale = 31.25; 03760 break; 03761 } 03762 03763 scale *= (ismg) ? 1.0 : 9.8; 03764 03765 return (1.0 * ctrl->rr(1, BNO055P1_ACC_NM_THRES)) * scale; 03766 } 03767 03768 /* ================================================================== 03769 * 加速度センサーのNoMotion割り込み発生閾値を設定する 03770 * ------------------------------------------------------------------ 03771 * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2) 03772 * 引数threashold: 単位変換済みの閾値 03773 * ------------------------------------------------------------------ 03774 * returns: 03775 * -1 失敗 03776 * 1 成功 03777 */ 03778 char BOARDC_BNO055::setAccNMThreashold(bool ismg, float threashold){ 03779 char rc = getAccConfig(); 03780 float scale = 0.0f; 03781 03782 switch(rc & 0x03){ 03783 case 0: 03784 scale = 3.91; 03785 break; 03786 case 1: 03787 scale = 7.81; 03788 break; 03789 case 2: 03790 scale = 15.63; 03791 break; 03792 case 3: 03793 scale = 31.25; 03794 break; 03795 } 03796 03797 scale *= (ismg) ? 1.0 : 9.8; 03798 03799 char cTh = (char)((threashold / scale) + 0.5); 03800 03801 return ctrl->wr(1, BNO055P1_ACC_NM_THRES, cTh); 03802 } 03803 03804 /* ================================================================== 03805 * 加速度センサーのNoMotion割り込み設定を取得する 03806 * ------------------------------------------------------------------ 03807 * returns: 03808 * NoMotion割り込み設定値 03809 * 1bit目: スローモーション、ノーモーション選択(0:NoMotion, 1:SlowMotion) 03810 * 2 - 7bit目: slo_no_mot _dur設定値(データシート参照) 03811 */ 03812 char BOARDC_BNO055::getAccNMsetting(){ 03813 return ctrl->rr(1, BNO055P1_ACC_NM_SET); 03814 } 03815 03816 /* ================================================================== 03817 * 加速度センサーのNoMotion割り込み設定を設定する 03818 * ------------------------------------------------------------------ 03819 * 引数setting: NoMotion割り込み設定値 03820 * 1bit目: スローモーション、ノーモーション選択(0:NoMotion, 1:SlowMotion) 03821 * 2 - 7bit目: slo_no_mot _dur設定値(データシート参照) 03822 * ------------------------------------------------------------------ 03823 * returns: 03824 * -1 失敗 03825 * 1 成功 03826 */ 03827 char BOARDC_BNO055::setAccNMsetting(char setting){ 03828 return ctrl->wr(1, BNO055P1_ACC_NM_SET, setting); 03829 } 03830 03831 /* ================================================================== 03832 * 角速度センサーの割り込み設定を取得する 03833 * ------------------------------------------------------------------ 03834 * returns: 03835 * 角速度センサーの割り込み設定レジスタ値 03836 */ 03837 char BOARDC_BNO055::getGyroInterruptSettings(){ 03838 return ctrl->rr(1, BNO055P1_GYR_INT_SETING); 03839 } 03840 03841 /* ================================================================== 03842 * 角速度センサーの割り込み設定を設定する 03843 * ------------------------------------------------------------------ 03844 * 引数setting: 角速度センサーの割り込み設定レジスタ値 03845 * ------------------------------------------------------------------ 03846 * returns: 03847 * -1 失敗 03848 * 1 成功 03849 */ 03850 char BOARDC_BNO055::setGyroInterruptSettings(char settings){ 03851 return ctrl->wr(1, BNO055P1_GYR_INT_SETING, settings); 03852 } 03853 03854 /* ================================================================== 03855 * 角速度センサーのHighRate割り込み設定(X軸のみ)を取得する 03856 * ------------------------------------------------------------------ 03857 * 引数setting: 角速度センサーの割り込み設定レジスタ値 03858 */ 03859 char BOARDC_BNO055::getGyroHighRateXsetting(){ 03860 return ctrl->rr(1, BNO055P1_GYR_HR_X_SET); 03861 } 03862 03863 /* ================================================================== 03864 * 角速度センサーのHighRate割り込み設定(X軸のみ、実際の値)を取得する 03865 * ------------------------------------------------------------------ 03866 * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される 03867 * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される 03868 */ 03869 void BOARDC_BNO055::getGyroHighRateXsetting_dps(float &hyst, float &thres){ 03870 char r = getGyroConfig_0(); 03871 hyst = 0.0f; 03872 thres = 0.0f; 03873 03874 switch(r & 0x07){ 03875 case 0: 03876 hyst = 62.26; 03877 thres = 62.5; 03878 break; 03879 case 1: 03880 hyst = 31.13; 03881 thres = 31.25; 03882 break; 03883 case 2: 03884 hyst = 15.56; 03885 thres = 15.62; 03886 break; 03887 case 3: 03888 hyst = 7.78; 03889 thres = 7.81; 03890 break; 03891 case 4: 03892 hyst = 3.89; 03893 thres = 3.90; 03894 break; 03895 } 03896 03897 char val = ctrl->rr(1, BNO055P1_GYR_HR_X_SET); 03898 03899 hyst *= (float)((val & 0x60) * 1.0); 03900 thres *= (float)((val & 0x1F) * 1.0); 03901 } 03902 03903 /* ================================================================== 03904 * 角速度センサーのHighRate割り込み設定(X軸のみ)を設定する 03905 * ------------------------------------------------------------------ 03906 * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値 03907 * ------------------------------------------------------------------ 03908 * returns: 03909 * -1 失敗 03910 * 1 成功 03911 */ 03912 char BOARDC_BNO055::setGyroHighRateXsetting(char setting){ 03913 return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, setting); 03914 } 03915 03916 /* ================================================================== 03917 * 角速度センサーのHighRate割り込み設定(X軸のみ)を設定する 03918 * ------------------------------------------------------------------ 03919 * 引数hystVal: ヒステリシス 03920 * 引数thresVal: スレッショルド 03921 * ------------------------------------------------------------------ 03922 * returns: 03923 * -1 失敗 03924 * 1 成功 03925 */ 03926 char BOARDC_BNO055::setGyroHighRateXsetting_dps(float hystVal, float thresVal){ 03927 char r = getGyroConfig_0(); 03928 float hyst = 0.0f; 03929 float thres = 0.0f; 03930 03931 switch(r & 0x07){ 03932 case 0: 03933 hyst = 62.26; 03934 thres = 62.5; 03935 break; 03936 case 1: 03937 hyst = 31.13; 03938 thres = 31.25; 03939 break; 03940 case 2: 03941 hyst = 15.56; 03942 thres = 15.62; 03943 break; 03944 case 3: 03945 hyst = 7.78; 03946 thres = 7.81; 03947 break; 03948 case 4: 03949 hyst = 3.89; 03950 thres = 3.90; 03951 break; 03952 } 03953 03954 char hystChar = (char)((hystVal / hyst) + 0.5); 03955 char thresChar = (char)((thresVal / thres) + 0.5); 03956 03957 return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, ((hystChar << 5) | thresChar)); 03958 } 03959 03960 /* ================================================================== 03961 * 角速度センサーのHighRate割り込み継続発生閾値(X軸のみ)を取得する 03962 * ------------------------------------------------------------------ 03963 * returns: 03964 * HighRate割り込み継続発生閾値[単位:ミリ秒] 03965 */ 03966 float BOARDC_BNO055::getGyroHighRateXduration(){ 03967 return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_X)) * 2.5; 03968 } 03969 03970 /* ================================================================== 03971 * 角速度センサーのHighRate割り込み継続発生閾値(X軸のみ)を設定する 03972 * ------------------------------------------------------------------ 03973 * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒] 03974 * ------------------------------------------------------------------ 03975 * returns: 03976 * -1 失敗 03977 * 1 成功 03978 */ 03979 char BOARDC_BNO055::setGyroHighRateXduration(float duration){ 03980 return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, (char)(((duration / 2.5) - 1.0) + 0.5)); 03981 } 03982 03983 /* ================================================================== 03984 * 角速度センサーのHighRate割り込み設定(Y軸のみ)を取得する 03985 * ------------------------------------------------------------------ 03986 * returns: 03987 * 角速度センサーのHighRate割り込み設定 03988 */ 03989 char BOARDC_BNO055::getGyroHighRateYsetting(){ 03990 return ctrl->rr(1, BNO055P1_GYR_HR_Y_SET); 03991 } 03992 03993 /* ================================================================== 03994 * 角速度センサーのHighRate割り込み設定(Y軸のみ、実際の値)を取得する 03995 * ------------------------------------------------------------------ 03996 * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される 03997 * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される 03998 */ 03999 void BOARDC_BNO055::getGyroHighRateYsetting_dps(float &hyst, float &thres){ 04000 char r = getGyroConfig_0(); 04001 hyst = 0.0f; 04002 thres = 0.0f; 04003 04004 switch(r & 0x07){ 04005 case 0: 04006 hyst = 62.26; 04007 thres = 62.5; 04008 break; 04009 case 1: 04010 hyst = 31.13; 04011 thres = 31.25; 04012 break; 04013 case 2: 04014 hyst = 15.56; 04015 thres = 15.62; 04016 break; 04017 case 3: 04018 hyst = 7.78; 04019 thres = 7.81; 04020 break; 04021 case 4: 04022 hyst = 3.89; 04023 thres = 3.90; 04024 break; 04025 } 04026 04027 char val = ctrl->rr(1, BNO055P1_GYR_HR_Y_SET); 04028 04029 hyst *= (float)((val & 0x60) * 1.0); 04030 thres *= (float)((val & 0x1F) * 1.0); 04031 } 04032 04033 /* ================================================================== 04034 * 角速度センサーのHighRate割り込み設定(Y軸のみ)を設定する 04035 * ------------------------------------------------------------------ 04036 * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値 04037 * ------------------------------------------------------------------ 04038 * returns: 04039 * -1 失敗 04040 * 1 成功 04041 */ 04042 char BOARDC_BNO055::setGyroHighRateYsetting(char setting){ 04043 return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, setting); 04044 } 04045 04046 /* ================================================================== 04047 * 角速度センサーのHighRate割り込み設定(Y軸のみ)を設定する 04048 * ------------------------------------------------------------------ 04049 * 引数hystVal: ヒステリシス 04050 * 引数thresVal: スレッショルド 04051 * ------------------------------------------------------------------ 04052 * returns: 04053 * -1 失敗 04054 * 1 成功 04055 */ 04056 char BOARDC_BNO055::setGyroHighRateYsetting_dps(float hystVal, float thresVal){ 04057 char r = getGyroConfig_0(); 04058 float hyst = 0.0f; 04059 float thres = 0.0f; 04060 04061 switch(r & 0x07){ 04062 case 0: 04063 hyst = 62.26; 04064 thres = 62.5; 04065 break; 04066 case 1: 04067 hyst = 31.13; 04068 thres = 31.25; 04069 break; 04070 case 2: 04071 hyst = 15.56; 04072 thres = 15.62; 04073 break; 04074 case 3: 04075 hyst = 7.78; 04076 thres = 7.81; 04077 break; 04078 case 4: 04079 hyst = 3.89; 04080 thres = 3.90; 04081 break; 04082 } 04083 04084 char hystChar = (char)((hystVal / hyst) + 0.5); 04085 char thresChar = (char)((thresVal / thres) + 0.5); 04086 04087 return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, ((hystChar << 5) | thresChar)); 04088 } 04089 04090 /* ================================================================== 04091 * 角速度センサーのHighRate割り込み継続発生閾値(Y軸のみ)を取得する 04092 * ------------------------------------------------------------------ 04093 * returns: 04094 * HighRate割り込み継続発生閾値[単位:ミリ秒] 04095 */ 04096 float BOARDC_BNO055::getGyroHighRateYduration(){ 04097 return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_Y)) * 2.5; 04098 } 04099 04100 /* ================================================================== 04101 * 角速度センサーのHighRate割り込み継続発生閾値(Y軸のみ)を設定する 04102 * ------------------------------------------------------------------ 04103 * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒] 04104 * ------------------------------------------------------------------ 04105 * returns: 04106 * -1 失敗 04107 * 1 成功 04108 */ 04109 char BOARDC_BNO055::setGyroHighRateYduration(float duration){ 04110 return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, (char)(((duration / 2.5) - 1.0) + 0.5)); 04111 } 04112 04113 /* ================================================================== 04114 * 角速度センサーのHighRate割り込み設定(Z軸のみ)を取得する 04115 * ------------------------------------------------------------------ 04116 * returns: 04117 * 角速度センサーのHighRate割り込み設定レジスタ値 04118 */ 04119 char BOARDC_BNO055::getGyroHighRateZsetting(){ 04120 return ctrl->rr(1, BNO055P1_GYR_HR_Z_SET); 04121 } 04122 04123 /* ================================================================== 04124 * 角速度センサーのHighRate割り込み設定(Z軸のみ、実際の値)を取得する 04125 * ------------------------------------------------------------------ 04126 * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される 04127 * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される 04128 */ 04129 void BOARDC_BNO055::getGyroHighRateZsetting_dps(float &hyst, float &thres){ 04130 char r = getGyroConfig_0(); 04131 hyst = 0.0f; 04132 thres = 0.0f; 04133 04134 switch(r & 0x07){ 04135 case 0: 04136 hyst = 62.26; 04137 thres = 62.5; 04138 break; 04139 case 1: 04140 hyst = 31.13; 04141 thres = 31.25; 04142 break; 04143 case 2: 04144 hyst = 15.56; 04145 thres = 15.62; 04146 break; 04147 case 3: 04148 hyst = 7.78; 04149 thres = 7.81; 04150 break; 04151 case 4: 04152 hyst = 3.89; 04153 thres = 3.90; 04154 break; 04155 } 04156 04157 char val = ctrl->rr(1, BNO055P1_GYR_HR_Z_SET); 04158 04159 hyst *= (float)((val & 0x60) * 1.0); 04160 thres *= (float)((val & 0x1F) * 1.0); 04161 } 04162 04163 /* ================================================================== 04164 * 角速度センサーのHighRate割り込み設定(Z軸のみ)を設定する 04165 * ------------------------------------------------------------------ 04166 * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値 04167 * ------------------------------------------------------------------ 04168 * returns: 04169 * -1 失敗 04170 * 1 成功 04171 */ 04172 char BOARDC_BNO055::setGyroHighRateZsetting(char setting){ 04173 return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, setting); 04174 } 04175 04176 /* ================================================================== 04177 * 角速度センサーのHighRate割り込み設定(Z軸のみ)を設定する 04178 * ------------------------------------------------------------------ 04179 * 引数hystVal: ヒステリシス 04180 * 引数thresVal: スレッショルド 04181 * ------------------------------------------------------------------ 04182 * returns: 04183 * -1 失敗 04184 * 1 成功 04185 */ 04186 char BOARDC_BNO055::setGyroHighRateZsetting_dps(float hystVal, float thresVal){ 04187 char r = getGyroConfig_0(); 04188 float hyst = 0.0f; 04189 float thres = 0.0f; 04190 04191 switch(r & 0x07){ 04192 case 0: 04193 hyst = 62.26; 04194 thres = 62.5; 04195 break; 04196 case 1: 04197 hyst = 31.13; 04198 thres = 31.25; 04199 break; 04200 case 2: 04201 hyst = 15.56; 04202 thres = 15.62; 04203 break; 04204 case 3: 04205 hyst = 7.78; 04206 thres = 7.81; 04207 break; 04208 case 4: 04209 hyst = 3.89; 04210 thres = 3.90; 04211 break; 04212 } 04213 04214 char hystChar = (char)((hystVal / hyst) + 0.5); 04215 char thresChar = (char)((thresVal / thres) + 0.5); 04216 04217 return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, ((hystChar << 5) | thresChar)); 04218 } 04219 04220 /* ================================================================== 04221 * 角速度センサーのHighRate割り込み継続発生閾値(Z軸のみ)を取得する 04222 * ------------------------------------------------------------------ 04223 * returns: 04224 * HighRate割り込み継続発生閾値[単位:ミリ秒] 04225 */ 04226 float BOARDC_BNO055::getGyroHighRateZduration(){ 04227 return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_Z)) * 2.5; 04228 } 04229 04230 /* ================================================================== 04231 * 角速度センサーのHighRate割り込み継続発生閾値(Z軸のみ)を設定する 04232 * ------------------------------------------------------------------ 04233 * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒] 04234 * ------------------------------------------------------------------ 04235 * returns: 04236 * -1 失敗 04237 * 1 成功 04238 */ 04239 char BOARDC_BNO055::setGyroHighRateZduration(float duration){ 04240 return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, (char)(((duration / 2.5) - 1.0) + 0.5)); 04241 } 04242 04243 /* ================================================================== 04244 * 角速度センサーのAnyMotion割り込み閾値を取得する 04245 * ------------------------------------------------------------------ 04246 * returns: 04247 * AnyMotion割り込み閾値[単位:dps] 04248 */ 04249 float BOARDC_BNO055::getGyroAnyMotionThreashold(){ 04250 char r = getGyroConfig_0(); 04251 float scale = 0.0f; 04252 04253 switch(r & 0x07){ 04254 case 0: 04255 scale = 1.0f; 04256 break; 04257 case 1: 04258 scale = 0.5; 04259 break; 04260 case 2: 04261 scale = 0.25; 04262 break; 04263 case 3: 04264 scale = 0.125; 04265 break; 04266 case 4: 04267 scale = 0.0625; 04268 break; 04269 } 04270 04271 return (1.0f * ctrl->rr(1, BNO055P1_GYR_AM_THRES)) * scale; 04272 } 04273 04274 /* ================================================================== 04275 * 角速度センサーのAnyMotion割り込み閾値を設定する 04276 * ------------------------------------------------------------------ 04277 * 引数threashold: AnyMotion割り込み閾値[単位:dps] 04278 * ------------------------------------------------------------------ 04279 * returns: 04280 * -1 失敗 04281 * 1 成功 04282 */ 04283 char BOARDC_BNO055::setGyroAnyMotionThreashold(float threashold){ 04284 char r = getGyroConfig_0(); 04285 float scale = 0.0f; 04286 04287 switch(r & 0x07){ 04288 case 0: 04289 scale = 1.0f; 04290 break; 04291 case 1: 04292 scale = 0.5; 04293 break; 04294 case 2: 04295 scale = 0.25; 04296 break; 04297 case 3: 04298 scale = 0.125; 04299 break; 04300 case 4: 04301 scale = 0.0625; 04302 break; 04303 } 04304 04305 return ctrl->wr(1, BNO055P1_GYR_AM_THRES, (char)((threashold / scale) + 0.5)); 04306 } 04307 04308 /* ================================================================== 04309 * 加速度センサーのAnyMotion割り込み閾値を取得する 04310 * ------------------------------------------------------------------ 04311 * returns: 04312 * AnyMotion割り込み設定レジスタ値 04313 */ 04314 char BOARDC_BNO055::getAccAnyMotionSetting(){ 04315 return ctrl->rr(1, BNO055P1_GYR_AM_SET); 04316 } 04317 04318 /* ================================================================== 04319 * 加速度センサーのAnyMotion割り込み閾値を設定する 04320 * ------------------------------------------------------------------ 04321 * 引数setting: AnyMotion割り込み設定レジスタ値 04322 * ------------------------------------------------------------------ 04323 * returns: 04324 * -1 失敗 04325 * 1 成功 04326 */ 04327 char BOARDC_BNO055::setAccAnyMotionSetting(char setting){ 04328 return ctrl->wr(1, BNO055P1_GYR_AM_SET, setting); 04329 }
Generated on Mon Aug 8 2022 20:27:09 by
