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

Dependents:   BNO055_BME280_ Yabusame2_gyro GRhanawaizman test_deg_read

BNO055.h

Committer:
Yajirushi
Date:
2019-05-13
Revision:
5:64b033b30802
Parent:
3:363ec3772dce

File content as of revision 5:64b033b30802:

#ifndef BNO055_H
#define BNO055_H

#include "mbed.h"

//UART通信に使用するバッファの最大サイズ
#define BNO055_UART_BUF_MAXLEN      24      //[byte]
//I2Cデフォルトスレーブアドレス
#define BNO055_I2C_DEFADDR          0x28

#define BNO055_PAGE_ID              0x07

#define BNO055P0_CHIP_ID            0x00
#define BNO055P0_ACC_ID             0x01
#define BNO055P0_MAG_ID             0x02
#define BNO055P0_GYR_ID             0x03
#define BNO055P0_SW_REV_ID_LSB      0x04
#define BNO055P0_SW_REV_ID_MSB      0x05
#define BNO055P0_BL_REV_ID          0x06
#define BNO055P0_ACC_DATA_X_LSB     0x08
#define BNO055P0_ACC_DATA_X_MSB     0x09
#define BNO055P0_ACC_DATA_Y_LSB     0x0A
#define BNO055P0_ACC_DATA_Y_MSB     0x0B
#define BNO055P0_ACC_DATA_Z_LSB     0x0C
#define BNO055P0_ACC_DATA_Z_MSB     0x0D
#define BNO055P0_MAG_DATA_X_LSB     0x0E
#define BNO055P0_MAG_DATA_X_MSB     0x0F
#define BNO055P0_MAG_DATA_Y_LSB     0x10
#define BNO055P0_MAG_DATA_Y_MSB     0x11
#define BNO055P0_MAG_DATA_Z_LSB     0x12
#define BNO055P0_MAG_DATA_Z_MSB     0x13
#define BNO055P0_GYR_DATA_X_LSB     0x14
#define BNO055P0_GYR_DATA_X_MSB     0x15
#define BNO055P0_GYR_DATA_Y_LSB     0x16
#define BNO055P0_GYR_DATA_Y_MSB     0x17
#define BNO055P0_GYR_DATA_Z_LSB     0x18
#define BNO055P0_GYR_DATA_Z_MSB     0x19
#define BNO055P0_EUL_HEADING_LSB    0x1A
#define BNO055P0_EUL_HEADING_MSB    0x1B
#define BNO055P0_EUL_ROLL_LSB       0x1C
#define BNO055P0_EUL_ROLL_MSB       0x1D
#define BNO055P0_EUL_PITCH_LSB      0x1E
#define BNO055P0_EUL_PITCH_MSB      0x1F
#define BNO055P0_QUA_DATA_W_LSB     0x20
#define BNO055P0_QUA_DATA_W_MSB     0x21
#define BNO055P0_QUA_DATA_X_LSB     0x22
#define BNO055P0_QUA_DATA_X_MSB     0x23
#define BNO055P0_QUA_DATA_Y_LSB     0x24
#define BNO055P0_QUA_DATA_Y_MSB     0x25
#define BNO055P0_QUA_DATA_Z_LSB     0x26
#define BNO055P0_QUA_DATA_Z_MSB     0x27
#define BNO055P0_LIA_DATA_X_LSB     0x28
#define BNO055P0_LIA_DATA_X_MBS     0x29
#define BNO055P0_LIA_DATA_Y_LSB     0x2A
#define BNO055P0_LIA_DATA_Y_MBS     0x2B
#define BNO055P0_LIA_DATA_Z_LSB     0x2C
#define BNO055P0_LIA_DATA_Z_MBS     0x2D
#define BNO055P0_GRV_DATA_X_LSB     0x2E
#define BNO055P0_GRV_DATA_X_MSB     0x2F
#define BNO055P0_GRV_DATA_Y_LSB     0x30
#define BNO055P0_GRV_DATA_Y_MSB     0x31
#define BNO055P0_GRV_DATA_Z_LSB     0x32
#define BNO055P0_GRV_DATA_Z_MSB     0x33
#define BNO055P0_TEMP               0x34
#define BNO055P0_CALIB_STAT         0x35
#define BNO055P0_ST_RESULT          0x36
#define BNO055P0_INT_STA            0x37
#define BNO055P0_SYS_CLK_STATUS     0x38
#define BNO055P0_SYS_STATUS         0x39
#define BNO055P0_SYS_ERR            0x3A
#define BNO055P0_UNIT_SEL           0x3B
#define BNO055P0_OPR_MODE           0x3D
#define BNO055P0_PWR_MODE           0x3E
#define BNO055P0_SYS_TRIGGER        0x3F
#define BNO055P0_TEMP_SOURCE        0x40
#define BNO055P0_AXIS_MAP_CONFIG    0x41
#define BNO055P0_AXIS_MAP_SIGN      0x42
#define BNO055P0_ACC_OFFSET_X_LSB   0x55
#define BNO055P0_ACC_OFFSET_X_MSB   0x56
#define BNO055P0_ACC_OFFSET_Y_LSB   0x57
#define BNO055P0_ACC_OFFSET_Y_MSB   0x58
#define BNO055P0_ACC_OFFSET_Z_LSB   0x59
#define BNO055P0_ACC_OFFSET_Z_MSB   0x5A
#define BNO055P0_MAG_OFFSET_X_LSB   0x5B
#define BNO055P0_MAG_OFFSET_X_MSB   0x5C
#define BNO055P0_MAG_OFFSET_Y_LSB   0x5D
#define BNO055P0_MAG_OFFSET_Y_MSB   0x5E
#define BNO055P0_MAG_OFFSET_Z_LSB   0x5F
#define BNO055P0_MAG_OFFSET_Z_MSB   0x60
#define BNO055P0_GYR_OFFSET_X_LSB   0x61
#define BNO055P0_GYR_OFFSET_X_MSB   0x62
#define BNO055P0_GYR_OFFSET_Y_LSB   0x63
#define BNO055P0_GYR_OFFSET_Y_MSB   0x64
#define BNO055P0_GYR_OFFSET_Z_LSB   0x65
#define BNO055P0_GYR_OFFSET_Z_MSB   0x66
#define BNO055P0_ACC_RADIUS_LSB     0x67
#define BNO055P0_ACC_RADIUS_MSB     0x68
#define BNO055P0_MAG_RADIUS_LSB     0x69
#define BNO055P0_MAG_RADIUS_MSB     0x6A

#define BNO055P1_ACC_CONFIG         0x08
#define BNO055P1_MAG_CONFIG         0x09
#define BNO055P1_GYR_CONFIG_0       0x0A
#define BNO055P1_GYR_CONFIG_1       0x0B
#define BNO055P1_ACC_SLEEP_CONFIG   0x0C
#define BNO055P1_GYR_SLEEP_CONFIG   0x0D
#define BNO055P1_INT_MSK            0x0F
#define BNO055P1_INT_EN             0x10
#define BNO055P1_ACC_AM_THRES       0x11
#define BNO055P1_ACC_INT_SETTINGS   0x12
#define BNO055P1_ACC_HG_DURATION    0x13
#define BNO055P1_ACC_HG_THRES       0x14
#define BNO055P1_ACC_NM_THRES       0x15
#define BNO055P1_ACC_NM_SET         0x16
#define BNO055P1_GYR_INT_SETING     0x17
#define BNO055P1_GYR_HR_X_SET       0x18
#define BNO055P1_GYR_DUR_X          0x19
#define BNO055P1_GYR_HR_Y_SET       0x1A
#define BNO055P1_GYR_DUR_Y          0x1B
#define BNO055P1_GYR_HR_Z_SET       0x1C
#define BNO055P1_GYR_DUR_Z          0x1D
#define BNO055P1_GYR_AM_THRES       0x1E
#define BNO055P1_GYR_AM_SET         0x1F


class BNO055_CTRL{
public:
    BNO055_CTRL();
    virtual ~BNO055_CTRL();
protected:
    bool page1;
    char *ary;
    char lastError;
    char lastLength;
public:
    char getNowPage();
    char getLastError();
    char getLastLength();
    virtual void init();
    virtual char rr(bool isPage1, char regAddr);
    virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
    virtual char wr(bool isPage1, char regAddr, char wBytes);
    virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
};

class BNO055_UART_CTRL : public BNO055_CTRL{
public:
    BNO055_UART_CTRL(RawSerial *uart);
    virtual ~BNO055_UART_CTRL();
private:
    RawSerial *iface;
    short rxd;
    bool read_mark;

    void rxInterrupt();
public:
    virtual void init();
    virtual char rr(bool isPage1, char regAddr);
    virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
    virtual char wr(bool isPage1, char regAddr, char wBytes);
    virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
};

class BNO055_I2C_CTRL : public BNO055_CTRL{
public:
    BNO055_I2C_CTRL(I2C *iic, char addr, unsigned int freq);
    virtual ~BNO055_I2C_CTRL();
private:
    I2C *iface;
    char i2c_writeAddr;
    char i2c_readAddr;
    unsigned int i2c_freq;
public:
    virtual void init();
    virtual char rr(bool isPage1, char regAddr);
    virtual char rrc(bool isPage1, char startRegAddr, unsigned char *receiveBytes, char length);
    virtual char wr(bool isPage1, char regAddr, char wBytes);
    virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
};

class BOARDC_BNO055{
public:
    BOARDC_BNO055(PinName tx, PinName rx);
    BOARDC_BNO055(RawSerial *uart);
    BOARDC_BNO055(PinName scl, PinName sda, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
    BOARDC_BNO055(I2C *iic, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
    ~BOARDC_BNO055();

private:
    BNO055_CTRL *ctrl;
    float scaleACC;
    float scaleMAG; //fixed
    float scaleGYRO;
    float scaleTEMP;
    float scaleEuler;
    float scaleLIA; //=scaleACC
    float scaleGV; //=scaleACC
    double scaleQuaternion; //fixed
    unsigned char axisRemap;
    unsigned char axisSign;
    bool clkExt;

public:
    char initialize(bool resetIface=true);
    char getIfaceLastError();
    char getIfaceLastLength();

    char customRead(bool isPage1, char regAddr);
    char customReadC(bool isPage1, char startRegAddr, unsigned char *receiveBytes, unsigned char length);
    char customWrite(bool isPage1, char regAddr, char wBytes);
    char customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length);

    char getPage();
    void setPage(unsigned char pageNo);

    char getChipID();
    char getAccChipID();
    char getMagChipID();
    char getGyroChipID();

    short getRevision();
    char getBootRevision();

    float getAccScale();
    float getMagScale();
    float getGyroScale();
    float getTempScale();
    float getEulerScale();
    float getLinearScale();
    float getGVScale();
    double getQuaternionScale();

    void getAccDataAll(short &accX, short &accY, short &accZ);
    short getAccDataX();
    short getAccDataY();
    short getAccDataZ();

    void getMagDataAll(short &magX, short &magY, short &magZ);
    short getMagDataX();
    short getMagDataY();
    short getMagDataZ();

    void getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ);
    short getGyroDataX();
    short getGyroDataY();
    short getGyroDataZ();

    void getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch);
    short getEulerDataHeading();
    short getEulerDataYaw();
    short getEulerDataRoll();
    short getEulerDataPitch();

    void get9Axis(short *box);
    void get9AxisAndEUL(short *box);

    void getQuaternion(short &q1, short &q2, short &q3, short &q4);
    void getEulerFromQ(double &E_heading, double &E_roll, double &E_pitch);

    void getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ);
    short getLinearAccDataX();
    short getLinearAccDataY();
    short getLinearAccDataZ();

    void getGVectorDataAll(short &gvX, short &gvY, short &gvZ);
    short getGVectorDataX();
    short getGVectorDataY();
    short getGVectorDataZ();

    char getTemperature();

    void getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro);
    char getCalibStatusSys();
    char getCalibStatusAcc();
    char getCalibStatusMag();
    char getCalibStatusGyro();

    char getSelfTestResultAll();
    bool getSelfTestResultMCU();
    bool getSelfTestResultAcc();
    bool getSelfTestResultMag();
    bool getSelfTestResultGyro();

    char triggeredIntALL();
    bool triggeredACC_NM();
    bool triggeredACC_AM();
    bool triggeredACC_HIGH_G();
    bool triggeredGYR_HIGH_RATE();
    bool triggeredGYRO_AM();

    bool isSystemClockFixed();

    char getSystemStatus();
    char getSystemError();

    char getUNIT_SEL();
    char setUNIT_SEL(char selectValue);
    char setUNIT_AccUnit(bool isMeterPerSec2=true);
    char setUNIT_GyroUnit(bool isDps=true);
    char setUNIT_EulerUnit(bool isDegrees=true);
    char setUNIT_Temperature(bool isCelsius=true);
    char setUNIT_OrientationMode(bool ori_Android=true);

    char getOperationMode();
    char setOperationMode(char modeValue);
    char setOperation_CONFIG();
    char setOperation_ACCONRY();
    char setOperation_MAGONRY();
    char setOperation_GYROONRY();
    char setOperation_ACCMAG();
    char setOperation_ACCGYRO();
    char setOperation_MAGGYRO();
    char setOperation_AMG();
    char setOperation_Fusion_IMU();
    char setOperation_Fusion_COMPASS();
    char setOperation_Fusion_M4G();
    char setOperation_Fusion_NDOF_FMC_OFF();
    char setOperation_Fusion_NDOF();

    char getPowerMode();
    char setPowerMode(unsigned char modeValue);
    char setPowerMode_Normal();
    char setPowerMode_LowPower();
    char setPowerMode_Suspend();

    char setSysTrigger(char regVal);
    char setSys_ExternalCrystal(bool isExternal=true);
    char resetInterrupt();
    char soft_reset();
    char execSelfTest();

    char getTempSource();
    char setTempSource(bool Accelerometer=true);

    char getAxisMapConfig();
    char setAxisMapConfig(char val);
    char getAxisMapSign();
    char setAxisMapSign(char val);
    char setAxisRemap_topview_topleft();
    char setAxisRemap_topview_topright();
    char setAxisRemap_topview_bottomleft();
    char setAxisRemap_topview_bottomright();
    char setAxisRemap_bottomview_topleft();
    char setAxisRemap_bottomview_topright();
    char setAxisRemap_bottomview_bottomleft();
    char setAxisRemap_bottomview_bottomright();
    char getAxisRemap_type();

    void getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
    float getAccOffsetX();
    float getAccOffsetY();
    float getAccOffsetZ();
    char setAccOffsetAll(float offsetX, float offsetY, float offsetZ);
    char setAccOffsetX(float offset);
    char setAccOffsetY(float offset);
    char setAccOffsetZ(float offset);

    void getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
    float getMagOffsetX();
    float getMagOffsetY();
    float getMagOffsetZ();
    char setMagOffsetAll(float offsetX, float offsetY, float offsetZ);
    char setMagOffsetX(float offset);
    char setMagOffsetY(float offset);
    char setMagOffsetZ(float offset);

    void getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
    float getGyroOffsetX();
    float getGyroOffsetY();
    float getGyroOffsetZ();
    char setGyroOffsetAll(float offsetX, float offsetY, float offsetZ);
    char setGyroOffsetX(float offset);
    char setGyroOffsetY(float offset);
    char setGyroOffsetZ(float offset);

    short getAccRadius();
    char setAccRadius(short LSB);

    short getMagRadius();
    char setMagRadius(short LSB);

    char getAccConfig();
    char setAccConfig(char regVal);
    char setAccConfig(char gRange, char bandWidth, char powMode);
    char setAccRange(unsigned char G);

    char getMagConfig();
    char setMagConfig(char regVal);
    char setMagConfig(char rate, char oprMode, char powMode);

    char getGyroConfig_0();
    char setGyroConfig_0(char regVal);
    char setGyroConfig_0(char range, char bandWidth);
    char getGyroConfig_1();
    char setGyroConfig_1(char powMode);
    char setGyroRange(unsigned short dps);

    char getAccSleepConfig();
    char setAccSleepConfig(char regVal);
    char setAccSleepConfig(char duration, char mode);

    char getGyroSleepConfig();
    char setGyroSleepConfig(char regVal);
    char setGyroSleepConfig(char autoSleepDuration, char duration);

    char getInterruptMask();
    char setInterruptMask(char mask);

    char getInterruptEnable();
    char setInterruptEnable(char mask);

    float getAccAnyMotionThreashold(bool ismg=true);
    char setAccAnyMotionThreashold(bool ismg, float threashold);

    char getAccInterruptSettings();
    char setAccInterruptSettings(char settings);

    unsigned short getAccHighGduration();
    char setAccHighGduration(short ms);

    float getAccHighGThreashold(bool ismg=true);
    char setAccHighGThreashold(bool ismg, float threashold);

    float getAccNMThreashold(bool ismg=true);
    char setAccNMThreashold(bool ismg, float threashold);

    char getAccNMsetting();
    char setAccNMsetting(char setting);

    char getGyroInterruptSettings();
    char setGyroInterruptSettings(char settings);

    char getGyroHighRateXsetting();
    void getGyroHighRateXsetting_dps(float &hyst, float &thres);
    char setGyroHighRateXsetting(char setting);
    char setGyroHighRateXsetting_dps(float hystVal, float thresVal);
    float getGyroHighRateXduration();
    char setGyroHighRateXduration(float duration);

    char getGyroHighRateYsetting();
    void getGyroHighRateYsetting_dps(float &hyst, float &thres);
    char setGyroHighRateYsetting(char setting);
    char setGyroHighRateYsetting_dps(float hystVal, float thresVal);
    float getGyroHighRateYduration();
    char setGyroHighRateYduration(float duration);

    char getGyroHighRateZsetting();
    void getGyroHighRateZsetting_dps(float &hyst, float &thres);
    char setGyroHighRateZsetting(char setting);
    char setGyroHighRateZsetting_dps(float hystVal, float thresVal);
    float getGyroHighRateZduration();
    char setGyroHighRateZduration(float duration);

    float getGyroAnyMotionThreashold();
    char setGyroAnyMotionThreashold(float threashold);

    char getAccAnyMotionSetting();
    char setAccAnyMotionSetting(char setting);
};

#endif