kusano kiyoshige / Mbed 2 deprecated 17robo_tokyo_kaede

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 kusano kiyoshige

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bno055_use.h Source File

bno055_use.h

00001 /*************************************************
00002 [使い方]
00003 1.  #include "bno005_lib.h"     //BNO055 本家ライブラリ
00004     #include "bno005_use.h"     //BNO055 データ取得用Class
00005     を読み込ませる
00006 2.  bno055_use.hの#defineでI2Cピン指定をする
00007 3.  main()内での初期設定を行う
00008         wait(1);        //センサの位置取得待ち時間
00009         .begin();       //センサ起動処理
00010         wait(1);        //センサの位置取得待ち時間
00011         .firstRead();   //初期値設定
00012         
00013 [Function] 
00014     .begin()        //センサ起動処理
00015     .firstRead()    //初期値設定(センサ正面を0度設定)
00016     .getYaw()       //Yawセンサ値(回転角上限なし)  値取得   (返り値 float)
00017     .getYaw180()    //Yaw(-180~0~180)           値取得   (返り値 float)
00018     .getYaw360()    //Yaw(0~360)(時計回り)       値取得   (返り値 float)
00019     .getYaw360Rev() //Yaw(0~360)(反時計回り)     値取得   (返り値 float)
00020     .init()
00021     .yaw_origin()
00022     
00023 **************************************************/
00024 //p28 p27 or p9 p10
00025 
00026 #define BNO005_SDA p9
00027 #define BNO005_SCL p10
00028 #define timer_dt 0.010
00029 #define ifaceI2C_frequency 200000
00030 
00031 I2C ifaceI2C(BNO005_SDA,BNO005_SCL);//BNO055用 I2C宣言
00032 BOARDC_BNO055 sensor1(&ifaceI2C);   //BNO055用 ライブラリ使用宣言
00033 
00034 class Bno055 {
00035 public  :
00036         Bno055(){
00037             shortdata_yaw = 0;
00038             count = 0;
00039             data_scEUL = 0;
00040             data_yaw = 0;
00041             data_firstYaw = 0;
00042             data_yaw180 = 0;
00043             data_yaw360 = 0;
00044             data_yaw360Rev = 0;
00045             data_yawRad = 0;
00046         }
00047         
00048         void begin(){
00049             cal_timer.attach(this, &Bno055::getData, timer_dt);
00050             ifaceI2C.frequency(ifaceI2C_frequency);
00051             sensor1.initialize(true);
00052             init();
00053         }
00054         
00055         void init(){
00056             yaw_state = 1;
00057             shortdata_yaw = 0;
00058             count = 0;
00059             data_scEUL = 0;
00060             data_yaw = 0;
00061             data_firstYaw = 0;
00062             data_yaw180 = 0;
00063             data_yaw360 = 0;
00064             data_yaw360Rev = 0;
00065             data_yawRad = 0;   
00066         }
00067         
00068         void firstRead(){
00069             data_scEUL = sensor1.getEulerScale();
00070             shortdata_yaw = sensor1.getEulerDataHeading();
00071             data_firstYaw = (float)shortdata_yaw * data_scEUL;
00072         }
00073         
00074         void yaw_origin(){
00075             data_firstYaw = data_yaw;
00076         }
00077         
00078         float getYaw(){
00079             return data_yaw;
00080         }
00081         
00082         float getFirstYaw(){
00083             return data_firstYaw;
00084         }
00085         
00086         float getscEUL(){
00087             return data_scEUL;
00088         }
00089         
00090         float getYaw180(){
00091             //正面0基準変換
00092             if(data_yaw < data_firstYaw){
00093                 data_yaw180 = 360.0 + data_yaw - data_firstYaw;   
00094             }else{
00095                 data_yaw180 = data_yaw - data_firstYaw;
00096             }
00097             //-180~0~180に変換
00098             if(data_yaw180 >= 180){
00099                 data_yaw180 = (360 - data_yaw180) * -1;
00100             }
00101             return data_yaw180;
00102         }
00103         
00104         float getYaw360(){
00105             //正面0基準変換
00106             if(data_yaw < data_firstYaw){
00107                 data_yaw360 = 360.0 + data_yaw - data_firstYaw;   
00108             }else{
00109                 data_yaw360 = data_yaw - data_firstYaw;
00110             }
00111             return data_yaw360;
00112         }
00113         
00114         float getYaw360Rev(){
00115             //正面0基準変換
00116             if(data_yaw < data_firstYaw){
00117                 data_yaw360Rev = 360.0 + data_yaw - data_firstYaw;   
00118             }else{
00119                 data_yaw360Rev = data_yaw - data_firstYaw;
00120             }
00121             //反時計周りに増加
00122             data_yaw360Rev = 360 - data_yaw360Rev;
00123             return data_yaw360Rev;
00124         }
00125         
00126         float getYawRad(){
00127             return data_yawRad;
00128         }
00129         
00130         int getYawState(){
00131             return yaw_state;
00132         }
00133         
00134         void calc_yawRad(){
00135             switch(yaw_state){
00136                 
00137                 case 1:
00138                     if(data_yaw180 >= 90){
00139                         yaw_state = 2;
00140                     }else if(data_yaw180 <= -90){
00141                         yaw_state = 3;
00142                     }
00143                     data_yawRad = 360.0 * count + data_yaw180;
00144                     break;
00145                 
00146                 case 2:
00147                     if(data_yaw360 > 270){
00148                         yaw_state = 1;
00149                         count++;
00150                     }else if(data_yaw360 < 90){
00151                         yaw_state = 1;
00152                     }
00153                     data_yawRad = 360.0 * count + data_yaw360;
00154                     break;
00155                     
00156                 case 3:
00157                     if(data_yaw360 < 90){
00158                         yaw_state = 1;
00159                         count--;
00160                     }else if(data_yaw360 > 270){
00161                         yaw_state = 1;
00162                     }
00163                     data_yawRad = 360.0 * count - data_yaw360Rev;
00164                     break;
00165             }
00166         }
00167         
00168         int getCount(){
00169             return count;
00170         }
00171         
00172         int getYaw_state(){
00173             return yaw_state;    
00174         }
00175         
00176         
00177 private :
00178     Ticker cal_timer;
00179     
00180     short BNO055_dataBox[12];
00181     short shortdata_yaw;
00182     int   count;
00183     int   yaw_state;
00184     float data_scAcc, data_scMag, data_scGyro, data_scEUL, data_scTemp;
00185     float data_ax, data_ay, data_az,
00186           data_mx, data_my, data_mz,
00187           data_gx, data_gy, data_gz,
00188           data_yaw, data_roll, data_pitch,
00189           data_temp,
00190           data_firstYaw, data_yaw180, data_yaw360, data_yaw360Rev
00191           ,data_yawRad;
00192         
00193     void getData(){
00194         shortdata_yaw = sensor1.getEulerDataHeading();
00195         data_yaw = (float)shortdata_yaw * data_scEUL;
00196         getYaw180();
00197         getYaw360();
00198         getYaw360Rev();
00199         calc_yawRad();
00200     }
00201 };