BNO055とBME280を統合した基板を使用するためのサンプルプログラム。それぞれをI2C,SPI,UARTで使用することができますがUARTモードは非常に不安定のためI2CまたはSPIでの使用を推奨。

Dependencies:   BOARDC_BME280 BOARDC_BNO055 mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #include "BNO055.h"
00004 #include "BME280.h"
00005 
00006 //PCへのシリアル通信
00007 Serial pc(USBTX, USBRX);
00008 
00009 //mbed Nucleoのユーザーボタン
00010 DigitalIn btn(USER_BUTTON);
00011 
00012 //mbed LED1
00013 DigitalOut led(LED1);
00014 
00015 //両方のセンサーに使用するI2C
00016 I2C ifaceI2C(I2C_SDA, I2C_SCL);
00017 
00018 //RawSerial ifaceUART(D8, D2); //BNO055にUARTを使う場合
00019 //SPI ifaceSPI(SPI_MOSI, SPI_MISO, SPI_SCK); //BME280にSPIを使う場合
00020 //DigitalOut scs(D7); //BME280にSPIを使う場合
00021 
00022 //両方のセンサーをI2Cで使用する
00023 BOARDC_BNO055 sensor1(&ifaceI2C);
00024 BOARDC_BME280 sensor2(&ifaceI2C);
00025 
00026 //BOARDC_BNO055 sensor1(&ifaceUART); //BNO055にUARTを使う場合
00027 //BOARDC_BME280 sensor2(&ifaceSPI, &scs); //BME280にSPIを使う場合
00028 
00029 int main(){
00030 
00031     //挨拶表示
00032     pc.printf("mbed READY\r\n");
00033 
00034     while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
00035 
00036     wait_ms(1000);
00037     led = 1;
00038 
00039     pc.printf("Start Comm - -- ---- --------\r\n");
00040 
00041     //I2Cインターフェースで2つのセンサーを使用する(200KHz)
00042     ifaceI2C.frequency(200000);
00043     sensor1.initialize(false);
00044     sensor2.initialize(false);
00045 
00046     //それぞれのセンサーを独立して使用する場合は、initialize関数の引数をtrue(または引数なし)にすることで自動設定する
00047     //sensor1.initialize();
00048     //sensor2.initialize();
00049 
00050     //各センサーのチップIDなどを表示するステートメント
00051     {
00052         char chipID = sensor1.getChipID();
00053         char AccChipID = sensor1.getAccChipID();
00054         char MagChipID = sensor1.getMagChipID();
00055         char GyroChipID = sensor1.getGyroChipID();
00056         char bootLoader = sensor1.getBootRevision();
00057 
00058         char bme280chip = sensor2.getChipID();
00059 
00060         pc.printf("BNO055 (9DOF sensor) ---- ---- ---- ---- ---- ---- ---- ---- ----\r\n");
00061         pc.printf("chipID = 0x%02X, bootLoader = %d\r\n", chipID, bootLoader);
00062         pc.printf("Acc    = 0x%02X\r\nMag    = 0x%02X\r\nGyro   = 0x%02X\r\n\r\n", AccChipID, MagChipID, GyroChipID);
00063 
00064         pc.printf("BME280 (Temperature, Humidity, Pressure sensor) -- ---- ---- ----\r\n");
00065         pc.printf("chipID = 0x%02X\r\n\r\n", bme280chip);
00066 
00067     }
00068 
00069     while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
00070 
00071     wait_ms(1000);
00072     led = 0;
00073 
00074     //各センサーの現在の設定などを表示するステートメント
00075     {
00076         char mode = sensor1.getOperationMode();
00077         char sysStatus = sensor1.getSystemStatus();
00078         char testStatus = sensor1.getSelfTestResultAll();
00079         char errorStatus = sensor1.getSystemError();
00080         char calibST[4];
00081         sensor1.getCalibStatusAll(calibST[0], calibST[1], calibST[2], calibST[3]);
00082 
00083         char bme280mode_hum = sensor2.getCTRL_humidity();
00084         char bme280mode_meas = sensor2.getCTRL_measuring();
00085         char bme280mode_conf = sensor2.getConfig();
00086 
00087         pc.printf("BNO055 (9DOF sensor) ---- ---- ---- ---- ---- ---- ---- ---- ----\r\n");
00088         pc.printf("Mode = 0x%02X, sysStatus = 0x%02X, testStatus = 0x%02X\r\n", mode, sysStatus, testStatus);
00089         pc.printf("calibSys = %d [%%], calibAcc = %d [%%], calibMag = %d [%%], calibGyro = %d [%%]\r\n", calibST[0], calibST[1], calibST[2], calibST[3]);
00090         pc.printf("errorStatus = 0x%02X, err = 0x%02X, len = %d\r\n\r\n", errorStatus, sensor1.getIfaceLastError(), sensor1.getIfaceLastLength());
00091 
00092         pc.printf("BME280 (Temperature, Humidity, Pressure sensor) -- ---- ---- ----\r\n");
00093         pc.printf("CTRL_HUM = 0x%02X, CTRL_MEAS = 0x%02X, CONFIG = 0x%02X\r\n\r\n", bme280mode_hum, bme280mode_meas, bme280mode_conf);
00094     }
00095 
00096     while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
00097 
00098     wait_ms(1000);
00099     led = 1;
00100 
00101     //各センサーの値を格納するための変数宣言
00102     short dataBox[12];
00103     float scAcc, scMag, scGyro, scEUL, scTemp;
00104     float ax, ay, az, mx, my, mz, gx, gy, gz, yaw, roll, pitch, temp;
00105     float bme280_T = 0.0, bme280_P = 0.0, bme280_H = 0.0;
00106     char bme280_status = 0x00;
00107 
00108     //センサーのRAW値を実際の数値に変換するための倍率を取得する
00109     scAcc = sensor1.getAccScale();
00110     scMag = sensor1.getMagScale();
00111     scGyro = sensor1.getGyroScale();
00112     scEUL = sensor1.getEulerScale();
00113     scTemp = sensor1.getTempScale();
00114 
00115     //ボタンが押されるまで繰り返し続ける(Nucleo専用)
00116     //ボタンがない場合はwhile(1)の無限ループで代用
00117     while(btn){
00118         //配列dataBoxに、9軸の値とオイラー角(yaw roll pitch)を格納(計12個の値)
00119         sensor1.get9AxisAndEUL(dataBox);
00120 
00121         //倍率をかけてRaw値を実際の値に変換
00122         ax = (float)dataBox[0] * scAcc;
00123         ay = (float)dataBox[1] * scAcc;
00124         az = (float)dataBox[2] * scAcc;
00125         mx = (float)dataBox[3] * scMag;
00126         my = (float)dataBox[4] * scMag;
00127         mz = (float)dataBox[5] * scMag;
00128         gx = (float)dataBox[6] * scGyro;
00129         gy = (float)dataBox[7] * scGyro;
00130         gz = (float)dataBox[8] * scGyro;
00131         yaw = (float)dataBox[9] * scEUL;
00132         roll = (float)dataBox[10] * scEUL;
00133         pitch = (float)dataBox[11] * scEUL;
00134 
00135         //BNO055内のセンサーの参考温度を取得して実際の値に変換
00136         temp = (float)sensor1.getTemperature() * scTemp;
00137 
00138         //温湿度センサーより、温度、湿度、気圧、現在の状態を取得して変数に格納
00139         bme280_T = sensor2.getTemp();
00140         bme280_P = sensor2.getPress_hPa();
00141         bme280_H = sensor2.getHum();
00142         bme280_status = sensor2.getStatus();
00143 
00144         //温湿度センサーの補正データが更新されていたなら、計算用数値を更新
00145         if(sensor2.isReady()){
00146             sensor2.updateCalib();
00147         }
00148 
00149         pc.printf(
00150             "Acc = X[%06.5f], Y[%06.5f], Z[%06.5f]\r\nMag = X[%06.5f], Y[%06.5f], Z[%06.5f]\r\nGyr = X[%06.5f], Y[%06.5f], Z[%06.5f]\r\n",
00151             ax, ay, az, mx, my, mz, gx, gy, gz
00152         );
00153 
00154         pc.printf(
00155             "yaw\t\t = %05.4f[deg], data = %0d\r\nroll\t\t = %05.4f[deg], data = %0d\r\npitch\t\t = %05.4f[deg], data = %0d\r\n",
00156             yaw, dataBox[9], roll, dataBox[10], pitch, dataBox[11]
00157         );
00158 
00159         pc.printf(
00160             "Temperature\t = %03.3f[degC] (BNO055 -> %03.3f[degC])\r\nPressure\t = %06.3f[hPa]\r\nHumidity\t = %03.3f[%%RH]\r\nStatus\t = 0x%02X\r\n",
00161             bme280_T, temp, bme280_P, bme280_H, bme280_status
00162         );
00163 
00164         wait_ms(1000);
00165     }
00166 }