BNO055をI2CとUARTで使用するためのライブラリ。UARTはmbedにて不安定なため使用できるボードとできないボードがある模様。

Dependents:   BNO055_BME280_ Yabusame2_gyro GRhanawaizman test_deg_read

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BNO055.h Source File

BNO055.h

00001 #ifndef BNO055_H
00002 #define BNO055_H
00003 
00004 #include "mbed.h"
00005 
00006 //UART通信に使用するバッファの最大サイズ
00007 #define BNO055_UART_BUF_MAXLEN      24      //[byte]
00008 //I2Cデフォルトスレーブアドレス
00009 #define BNO055_I2C_DEFADDR          0x28
00010 
00011 #define BNO055_PAGE_ID              0x07
00012 
00013 #define BNO055P0_CHIP_ID            0x00
00014 #define BNO055P0_ACC_ID             0x01
00015 #define BNO055P0_MAG_ID             0x02
00016 #define BNO055P0_GYR_ID             0x03
00017 #define BNO055P0_SW_REV_ID_LSB      0x04
00018 #define BNO055P0_SW_REV_ID_MSB      0x05
00019 #define BNO055P0_BL_REV_ID          0x06
00020 #define BNO055P0_ACC_DATA_X_LSB     0x08
00021 #define BNO055P0_ACC_DATA_X_MSB     0x09
00022 #define BNO055P0_ACC_DATA_Y_LSB     0x0A
00023 #define BNO055P0_ACC_DATA_Y_MSB     0x0B
00024 #define BNO055P0_ACC_DATA_Z_LSB     0x0C
00025 #define BNO055P0_ACC_DATA_Z_MSB     0x0D
00026 #define BNO055P0_MAG_DATA_X_LSB     0x0E
00027 #define BNO055P0_MAG_DATA_X_MSB     0x0F
00028 #define BNO055P0_MAG_DATA_Y_LSB     0x10
00029 #define BNO055P0_MAG_DATA_Y_MSB     0x11
00030 #define BNO055P0_MAG_DATA_Z_LSB     0x12
00031 #define BNO055P0_MAG_DATA_Z_MSB     0x13
00032 #define BNO055P0_GYR_DATA_X_LSB     0x14
00033 #define BNO055P0_GYR_DATA_X_MSB     0x15
00034 #define BNO055P0_GYR_DATA_Y_LSB     0x16
00035 #define BNO055P0_GYR_DATA_Y_MSB     0x17
00036 #define BNO055P0_GYR_DATA_Z_LSB     0x18
00037 #define BNO055P0_GYR_DATA_Z_MSB     0x19
00038 #define BNO055P0_EUL_HEADING_LSB    0x1A
00039 #define BNO055P0_EUL_HEADING_MSB    0x1B
00040 #define BNO055P0_EUL_ROLL_LSB       0x1C
00041 #define BNO055P0_EUL_ROLL_MSB       0x1D
00042 #define BNO055P0_EUL_PITCH_LSB      0x1E
00043 #define BNO055P0_EUL_PITCH_MSB      0x1F
00044 #define BNO055P0_QUA_DATA_W_LSB     0x20
00045 #define BNO055P0_QUA_DATA_W_MSB     0x21
00046 #define BNO055P0_QUA_DATA_X_LSB     0x22
00047 #define BNO055P0_QUA_DATA_X_MSB     0x23
00048 #define BNO055P0_QUA_DATA_Y_LSB     0x24
00049 #define BNO055P0_QUA_DATA_Y_MSB     0x25
00050 #define BNO055P0_QUA_DATA_Z_LSB     0x26
00051 #define BNO055P0_QUA_DATA_Z_MSB     0x27
00052 #define BNO055P0_LIA_DATA_X_LSB     0x28
00053 #define BNO055P0_LIA_DATA_X_MBS     0x29
00054 #define BNO055P0_LIA_DATA_Y_LSB     0x2A
00055 #define BNO055P0_LIA_DATA_Y_MBS     0x2B
00056 #define BNO055P0_LIA_DATA_Z_LSB     0x2C
00057 #define BNO055P0_LIA_DATA_Z_MBS     0x2D
00058 #define BNO055P0_GRV_DATA_X_LSB     0x2E
00059 #define BNO055P0_GRV_DATA_X_MSB     0x2F
00060 #define BNO055P0_GRV_DATA_Y_LSB     0x30
00061 #define BNO055P0_GRV_DATA_Y_MSB     0x31
00062 #define BNO055P0_GRV_DATA_Z_LSB     0x32
00063 #define BNO055P0_GRV_DATA_Z_MSB     0x33
00064 #define BNO055P0_TEMP               0x34
00065 #define BNO055P0_CALIB_STAT         0x35
00066 #define BNO055P0_ST_RESULT          0x36
00067 #define BNO055P0_INT_STA            0x37
00068 #define BNO055P0_SYS_CLK_STATUS     0x38
00069 #define BNO055P0_SYS_STATUS         0x39
00070 #define BNO055P0_SYS_ERR            0x3A
00071 #define BNO055P0_UNIT_SEL           0x3B
00072 #define BNO055P0_OPR_MODE           0x3D
00073 #define BNO055P0_PWR_MODE           0x3E
00074 #define BNO055P0_SYS_TRIGGER        0x3F
00075 #define BNO055P0_TEMP_SOURCE        0x40
00076 #define BNO055P0_AXIS_MAP_CONFIG    0x41
00077 #define BNO055P0_AXIS_MAP_SIGN      0x42
00078 #define BNO055P0_ACC_OFFSET_X_LSB   0x55
00079 #define BNO055P0_ACC_OFFSET_X_MSB   0x56
00080 #define BNO055P0_ACC_OFFSET_Y_LSB   0x57
00081 #define BNO055P0_ACC_OFFSET_Y_MSB   0x58
00082 #define BNO055P0_ACC_OFFSET_Z_LSB   0x59
00083 #define BNO055P0_ACC_OFFSET_Z_MSB   0x5A
00084 #define BNO055P0_MAG_OFFSET_X_LSB   0x5B
00085 #define BNO055P0_MAG_OFFSET_X_MSB   0x5C
00086 #define BNO055P0_MAG_OFFSET_Y_LSB   0x5D
00087 #define BNO055P0_MAG_OFFSET_Y_MSB   0x5E
00088 #define BNO055P0_MAG_OFFSET_Z_LSB   0x5F
00089 #define BNO055P0_MAG_OFFSET_Z_MSB   0x60
00090 #define BNO055P0_GYR_OFFSET_X_LSB   0x61
00091 #define BNO055P0_GYR_OFFSET_X_MSB   0x62
00092 #define BNO055P0_GYR_OFFSET_Y_LSB   0x63
00093 #define BNO055P0_GYR_OFFSET_Y_MSB   0x64
00094 #define BNO055P0_GYR_OFFSET_Z_LSB   0x65
00095 #define BNO055P0_GYR_OFFSET_Z_MSB   0x66
00096 #define BNO055P0_ACC_RADIUS_LSB     0x67
00097 #define BNO055P0_ACC_RADIUS_MSB     0x68
00098 #define BNO055P0_MAG_RADIUS_LSB     0x69
00099 #define BNO055P0_MAG_RADIUS_MSB     0x6A
00100 
00101 #define BNO055P1_ACC_CONFIG         0x08
00102 #define BNO055P1_MAG_CONFIG         0x09
00103 #define BNO055P1_GYR_CONFIG_0       0x0A
00104 #define BNO055P1_GYR_CONFIG_1       0x0B
00105 #define BNO055P1_ACC_SLEEP_CONFIG   0x0C
00106 #define BNO055P1_GYR_SLEEP_CONFIG   0x0D
00107 #define BNO055P1_INT_MSK            0x0F
00108 #define BNO055P1_INT_EN             0x10
00109 #define BNO055P1_ACC_AM_THRES       0x11
00110 #define BNO055P1_ACC_INT_SETTINGS   0x12
00111 #define BNO055P1_ACC_HG_DURATION    0x13
00112 #define BNO055P1_ACC_HG_THRES       0x14
00113 #define BNO055P1_ACC_NM_THRES       0x15
00114 #define BNO055P1_ACC_NM_SET         0x16
00115 #define BNO055P1_GYR_INT_SETING     0x17
00116 #define BNO055P1_GYR_HR_X_SET       0x18
00117 #define BNO055P1_GYR_DUR_X          0x19
00118 #define BNO055P1_GYR_HR_Y_SET       0x1A
00119 #define BNO055P1_GYR_DUR_Y          0x1B
00120 #define BNO055P1_GYR_HR_Z_SET       0x1C
00121 #define BNO055P1_GYR_DUR_Z          0x1D
00122 #define BNO055P1_GYR_AM_THRES       0x1E
00123 #define BNO055P1_GYR_AM_SET         0x1F
00124 
00125 
00126 class BNO055_CTRL{
00127 public:
00128     BNO055_CTRL();
00129     virtual ~BNO055_CTRL();
00130 protected:
00131     bool page1;
00132     char *ary;
00133     char lastError;
00134     char lastLength;
00135 public:
00136     char getNowPage();
00137     char getLastError();
00138     char getLastLength();
00139     virtual void init();
00140     virtual char rr(bool isPage1, char regAddr);
00141     virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
00142     virtual char wr(bool isPage1, char regAddr, char wBytes);
00143     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00144 };
00145 
00146 class BNO055_UART_CTRL : public BNO055_CTRL{
00147 public:
00148     BNO055_UART_CTRL(RawSerial *uart);
00149     virtual ~BNO055_UART_CTRL();
00150 private:
00151     RawSerial *iface;
00152     short rxd;
00153     bool read_mark;
00154 
00155     void rxInterrupt();
00156 public:
00157     virtual void init();
00158     virtual char rr(bool isPage1, char regAddr);
00159     virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
00160     virtual char wr(bool isPage1, char regAddr, char wBytes);
00161     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00162 };
00163 
00164 class BNO055_I2C_CTRL : public BNO055_CTRL{
00165 public:
00166     BNO055_I2C_CTRL(I2C *iic, char addr, unsigned int freq);
00167     virtual ~BNO055_I2C_CTRL();
00168 private:
00169     I2C *iface;
00170     char i2c_writeAddr;
00171     char i2c_readAddr;
00172     unsigned int i2c_freq;
00173 public:
00174     virtual void init();
00175     virtual char rr(bool isPage1, char regAddr);
00176     virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
00177     virtual char wr(bool isPage1, char regAddr, char wBytes);
00178     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00179 };
00180 
00181 class BOARDC_BNO055{
00182 public:
00183     BOARDC_BNO055(PinName tx, PinName rx);
00184     BOARDC_BNO055(RawSerial *uart);
00185     BOARDC_BNO055(PinName scl, PinName sda, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
00186     BOARDC_BNO055(I2C *iic, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
00187     ~BOARDC_BNO055();
00188 
00189 private:
00190     BNO055_CTRL *ctrl;
00191     float scaleACC;
00192     float scaleMAG; //fixed
00193     float scaleGYRO;
00194     float scaleTEMP;
00195     float scaleEuler;
00196     float scaleLIA; //=scaleACC
00197     float scaleGV; //=scaleACC
00198     double scaleQuaternion; //fixed
00199     unsigned char axisRemap;
00200     unsigned char axisSign;
00201     bool clkExt;
00202 
00203 public:
00204     char initialize(bool resetIface=true);
00205     char getIfaceLastError();
00206     char getIfaceLastLength();
00207 
00208     char customRead(bool isPage1, char regAddr);
00209     char customReadC(bool isPage1, char startRegAddr, unsigned char *receiveBytes, unsigned char length);
00210     char customWrite(bool isPage1, char regAddr, char wBytes);
00211     char customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length);
00212 
00213     char getPage();
00214     void setPage(unsigned char pageNo);
00215 
00216     char getChipID();
00217     char getAccChipID();
00218     char getMagChipID();
00219     char getGyroChipID();
00220 
00221     short getRevision();
00222     char getBootRevision();
00223 
00224     float getAccScale();
00225     float getMagScale();
00226     float getGyroScale();
00227     float getTempScale();
00228     float getEulerScale();
00229     float getLinearScale();
00230     float getGVScale();
00231     double getQuaternionScale();
00232 
00233     void getAccDataAll(short &accX, short &accY, short &accZ);
00234     short getAccDataX();
00235     short getAccDataY();
00236     short getAccDataZ();
00237 
00238     void getMagDataAll(short &magX, short &magY, short &magZ);
00239     short getMagDataX();
00240     short getMagDataY();
00241     short getMagDataZ();
00242 
00243     void getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ);
00244     short getGyroDataX();
00245     short getGyroDataY();
00246     short getGyroDataZ();
00247 
00248     void getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch);
00249     short getEulerDataHeading();
00250     short getEulerDataYaw();
00251     short getEulerDataRoll();
00252     short getEulerDataPitch();
00253 
00254     void get9Axis(short *box);
00255     void get9AxisAndEUL(short *box);
00256 
00257     void getQuaternion(short &q1, short &q2, short &q3, short &q4);
00258     void getEulerFromQ(double &E_heading, double &E_roll, double &E_pitch);
00259 
00260     void getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ);
00261     short getLinearAccDataX();
00262     short getLinearAccDataY();
00263     short getLinearAccDataZ();
00264 
00265     void getGVectorDataAll(short &gvX, short &gvY, short &gvZ);
00266     short getGVectorDataX();
00267     short getGVectorDataY();
00268     short getGVectorDataZ();
00269 
00270     char getTemperature();
00271 
00272     void getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro);
00273     char getCalibStatusSys();
00274     char getCalibStatusAcc();
00275     char getCalibStatusMag();
00276     char getCalibStatusGyro();
00277 
00278     char getSelfTestResultAll();
00279     bool getSelfTestResultMCU();
00280     bool getSelfTestResultAcc();
00281     bool getSelfTestResultMag();
00282     bool getSelfTestResultGyro();
00283 
00284     char triggeredIntALL();
00285     bool triggeredACC_NM();
00286     bool triggeredACC_AM();
00287     bool triggeredACC_HIGH_G();
00288     bool triggeredGYR_HIGH_RATE();
00289     bool triggeredGYRO_AM();
00290 
00291     bool isSystemClockFixed();
00292 
00293     char getSystemStatus();
00294     char getSystemError();
00295 
00296     char getUNIT_SEL();
00297     char setUNIT_SEL(char selectValue);
00298     char setUNIT_AccUnit(bool isMeterPerSec2=true);
00299     char setUNIT_GyroUnit(bool isDps=true);
00300     char setUNIT_EulerUnit(bool isDegrees=true);
00301     char setUNIT_Temperature(bool isCelsius=true);
00302     char setUNIT_OrientationMode(bool ori_Android=true);
00303 
00304     char getOperationMode();
00305     char setOperationMode(char modeValue);
00306     char setOperation_CONFIG();
00307     char setOperation_ACCONRY();
00308     char setOperation_MAGONRY();
00309     char setOperation_GYROONRY();
00310     char setOperation_ACCMAG();
00311     char setOperation_ACCGYRO();
00312     char setOperation_MAGGYRO();
00313     char setOperation_AMG();
00314     char setOperation_Fusion_IMU();
00315     char setOperation_Fusion_COMPASS();
00316     char setOperation_Fusion_M4G();
00317     char setOperation_Fusion_NDOF_FMC_OFF();
00318     char setOperation_Fusion_NDOF();
00319 
00320     char getPowerMode();
00321     char setPowerMode(unsigned char modeValue);
00322     char setPowerMode_Normal();
00323     char setPowerMode_LowPower();
00324     char setPowerMode_Suspend();
00325 
00326     char setSysTrigger(char regVal);
00327     char setSys_ExternalCrystal(bool isExternal=true);
00328     char resetInterrupt();
00329     char soft_reset();
00330     char execSelfTest();
00331 
00332     char getTempSource();
00333     char setTempSource(bool Accelerometer=true);
00334 
00335     char getAxisMapConfig();
00336     char setAxisMapConfig(char val);
00337     char getAxisMapSign();
00338     char setAxisMapSign(char val);
00339     char setAxisRemap_topview_topleft();
00340     char setAxisRemap_topview_topright();
00341     char setAxisRemap_topview_bottomleft();
00342     char setAxisRemap_topview_bottomright();
00343     char setAxisRemap_bottomview_topleft();
00344     char setAxisRemap_bottomview_topright();
00345     char setAxisRemap_bottomview_bottomleft();
00346     char setAxisRemap_bottomview_bottomright();
00347     char getAxisRemap_type();
00348 
00349     void getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00350     float getAccOffsetX();
00351     float getAccOffsetY();
00352     float getAccOffsetZ();
00353     char setAccOffsetAll(float offsetX, float offsetY, float offsetZ);
00354     char setAccOffsetX(float offset);
00355     char setAccOffsetY(float offset);
00356     char setAccOffsetZ(float offset);
00357 
00358     void getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00359     float getMagOffsetX();
00360     float getMagOffsetY();
00361     float getMagOffsetZ();
00362     char setMagOffsetAll(float offsetX, float offsetY, float offsetZ);
00363     char setMagOffsetX(float offset);
00364     char setMagOffsetY(float offset);
00365     char setMagOffsetZ(float offset);
00366 
00367     void getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00368     float getGyroOffsetX();
00369     float getGyroOffsetY();
00370     float getGyroOffsetZ();
00371     char setGyroOffsetAll(float offsetX, float offsetY, float offsetZ);
00372     char setGyroOffsetX(float offset);
00373     char setGyroOffsetY(float offset);
00374     char setGyroOffsetZ(float offset);
00375 
00376     short getAccRadius();
00377     char setAccRadius(short LSB);
00378 
00379     short getMagRadius();
00380     char setMagRadius(short LSB);
00381 
00382     char getAccConfig();
00383     char setAccConfig(char regVal);
00384     char setAccConfig(char gRange, char bandWidth, char powMode);
00385     char setAccRange(unsigned char G);
00386 
00387     char getMagConfig();
00388     char setMagConfig(char regVal);
00389     char setMagConfig(char rate, char oprMode, char powMode);
00390 
00391     char getGyroConfig_0();
00392     char setGyroConfig_0(char regVal);
00393     char setGyroConfig_0(char range, char bandWidth);
00394     char getGyroConfig_1();
00395     char setGyroConfig_1(char powMode);
00396     char setGyroRange(unsigned short dps);
00397 
00398     char getAccSleepConfig();
00399     char setAccSleepConfig(char regVal);
00400     char setAccSleepConfig(char duration, char mode);
00401 
00402     char getGyroSleepConfig();
00403     char setGyroSleepConfig(char regVal);
00404     char setGyroSleepConfig(char autoSleepDuration, char duration);
00405 
00406     char getInterruptMask();
00407     char setInterruptMask(char mask);
00408 
00409     char getInterruptEnable();
00410     char setInterruptEnable(char mask);
00411 
00412     float getAccAnyMotionThreashold(bool ismg=true);
00413     char setAccAnyMotionThreashold(bool ismg, float threashold);
00414 
00415     char getAccInterruptSettings();
00416     char setAccInterruptSettings(char settings);
00417 
00418     unsigned short getAccHighGduration();
00419     char setAccHighGduration(short ms);
00420 
00421     float getAccHighGThreashold(bool ismg=true);
00422     char setAccHighGThreashold(bool ismg, float threashold);
00423 
00424     float getAccNMThreashold(bool ismg=true);
00425     char setAccNMThreashold(bool ismg, float threashold);
00426 
00427     char getAccNMsetting();
00428     char setAccNMsetting(char setting);
00429 
00430     char getGyroInterruptSettings();
00431     char setGyroInterruptSettings(char settings);
00432 
00433     char getGyroHighRateXsetting();
00434     void getGyroHighRateXsetting_dps(float &hyst, float &thres);
00435     char setGyroHighRateXsetting(char setting);
00436     char setGyroHighRateXsetting_dps(float hystVal, float thresVal);
00437     float getGyroHighRateXduration();
00438     char setGyroHighRateXduration(float duration);
00439 
00440     char getGyroHighRateYsetting();
00441     void getGyroHighRateYsetting_dps(float &hyst, float &thres);
00442     char setGyroHighRateYsetting(char setting);
00443     char setGyroHighRateYsetting_dps(float hystVal, float thresVal);
00444     float getGyroHighRateYduration();
00445     char setGyroHighRateYduration(float duration);
00446 
00447     char getGyroHighRateZsetting();
00448     void getGyroHighRateZsetting_dps(float &hyst, float &thres);
00449     char setGyroHighRateZsetting(char setting);
00450     char setGyroHighRateZsetting_dps(float hystVal, float thresVal);
00451     float getGyroHighRateZduration();
00452     char setGyroHighRateZduration(float duration);
00453 
00454     float getGyroAnyMotionThreashold();
00455     char setGyroAnyMotionThreashold(float threashold);
00456 
00457     char getAccAnyMotionSetting();
00458     char setAccAnyMotionSetting(char setting);
00459 };
00460 
00461 #endif