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

Dependencies:   BOARDC_BME280 BOARDC_BNO055 mbed

Committer:
Yajirushi
Date:
Tue Nov 29 02:59:37 2016 +0000
Revision:
0:34e54ee64777
FIRST COMMIT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yajirushi 0:34e54ee64777 1 #include "mbed.h"
Yajirushi 0:34e54ee64777 2
Yajirushi 0:34e54ee64777 3 #include "BNO055.h"
Yajirushi 0:34e54ee64777 4 #include "BME280.h"
Yajirushi 0:34e54ee64777 5
Yajirushi 0:34e54ee64777 6 //PCへのシリアル通信
Yajirushi 0:34e54ee64777 7 Serial pc(USBTX, USBRX);
Yajirushi 0:34e54ee64777 8
Yajirushi 0:34e54ee64777 9 //mbed Nucleoのユーザーボタン
Yajirushi 0:34e54ee64777 10 DigitalIn btn(USER_BUTTON);
Yajirushi 0:34e54ee64777 11
Yajirushi 0:34e54ee64777 12 //mbed LED1
Yajirushi 0:34e54ee64777 13 DigitalOut led(LED1);
Yajirushi 0:34e54ee64777 14
Yajirushi 0:34e54ee64777 15 //両方のセンサーに使用するI2C
Yajirushi 0:34e54ee64777 16 I2C ifaceI2C(I2C_SDA, I2C_SCL);
Yajirushi 0:34e54ee64777 17
Yajirushi 0:34e54ee64777 18 //RawSerial ifaceUART(D8, D2); //BNO055にUARTを使う場合
Yajirushi 0:34e54ee64777 19 //SPI ifaceSPI(SPI_MOSI, SPI_MISO, SPI_SCK); //BME280にSPIを使う場合
Yajirushi 0:34e54ee64777 20 //DigitalOut scs(D7); //BME280にSPIを使う場合
Yajirushi 0:34e54ee64777 21
Yajirushi 0:34e54ee64777 22 //両方のセンサーをI2Cで使用する
Yajirushi 0:34e54ee64777 23 BOARDC_BNO055 sensor1(&ifaceI2C);
Yajirushi 0:34e54ee64777 24 BOARDC_BME280 sensor2(&ifaceI2C);
Yajirushi 0:34e54ee64777 25
Yajirushi 0:34e54ee64777 26 //BOARDC_BNO055 sensor1(&ifaceUART); //BNO055にUARTを使う場合
Yajirushi 0:34e54ee64777 27 //BOARDC_BME280 sensor2(&ifaceSPI, &scs); //BME280にSPIを使う場合
Yajirushi 0:34e54ee64777 28
Yajirushi 0:34e54ee64777 29 int main(){
Yajirushi 0:34e54ee64777 30
Yajirushi 0:34e54ee64777 31 //挨拶表示
Yajirushi 0:34e54ee64777 32 pc.printf("mbed READY\r\n");
Yajirushi 0:34e54ee64777 33
Yajirushi 0:34e54ee64777 34 while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
Yajirushi 0:34e54ee64777 35
Yajirushi 0:34e54ee64777 36 wait_ms(1000);
Yajirushi 0:34e54ee64777 37 led = 1;
Yajirushi 0:34e54ee64777 38
Yajirushi 0:34e54ee64777 39 pc.printf("Start Comm - -- ---- --------\r\n");
Yajirushi 0:34e54ee64777 40
Yajirushi 0:34e54ee64777 41 //I2Cインターフェースで2つのセンサーを使用する(200KHz)
Yajirushi 0:34e54ee64777 42 ifaceI2C.frequency(200000);
Yajirushi 0:34e54ee64777 43 sensor1.initialize(false);
Yajirushi 0:34e54ee64777 44 sensor2.initialize(false);
Yajirushi 0:34e54ee64777 45
Yajirushi 0:34e54ee64777 46 //それぞれのセンサーを独立して使用する場合は、initialize関数の引数をtrue(または引数なし)にすることで自動設定する
Yajirushi 0:34e54ee64777 47 //sensor1.initialize();
Yajirushi 0:34e54ee64777 48 //sensor2.initialize();
Yajirushi 0:34e54ee64777 49
Yajirushi 0:34e54ee64777 50 //各センサーのチップIDなどを表示するステートメント
Yajirushi 0:34e54ee64777 51 {
Yajirushi 0:34e54ee64777 52 char chipID = sensor1.getChipID();
Yajirushi 0:34e54ee64777 53 char AccChipID = sensor1.getAccChipID();
Yajirushi 0:34e54ee64777 54 char MagChipID = sensor1.getMagChipID();
Yajirushi 0:34e54ee64777 55 char GyroChipID = sensor1.getGyroChipID();
Yajirushi 0:34e54ee64777 56 char bootLoader = sensor1.getBootRevision();
Yajirushi 0:34e54ee64777 57
Yajirushi 0:34e54ee64777 58 char bme280chip = sensor2.getChipID();
Yajirushi 0:34e54ee64777 59
Yajirushi 0:34e54ee64777 60 pc.printf("BNO055 (9DOF sensor) ---- ---- ---- ---- ---- ---- ---- ---- ----\r\n");
Yajirushi 0:34e54ee64777 61 pc.printf("chipID = 0x%02X, bootLoader = %d\r\n", chipID, bootLoader);
Yajirushi 0:34e54ee64777 62 pc.printf("Acc = 0x%02X\r\nMag = 0x%02X\r\nGyro = 0x%02X\r\n\r\n", AccChipID, MagChipID, GyroChipID);
Yajirushi 0:34e54ee64777 63
Yajirushi 0:34e54ee64777 64 pc.printf("BME280 (Temperature, Humidity, Pressure sensor) -- ---- ---- ----\r\n");
Yajirushi 0:34e54ee64777 65 pc.printf("chipID = 0x%02X\r\n\r\n", bme280chip);
Yajirushi 0:34e54ee64777 66
Yajirushi 0:34e54ee64777 67 }
Yajirushi 0:34e54ee64777 68
Yajirushi 0:34e54ee64777 69 while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
Yajirushi 0:34e54ee64777 70
Yajirushi 0:34e54ee64777 71 wait_ms(1000);
Yajirushi 0:34e54ee64777 72 led = 0;
Yajirushi 0:34e54ee64777 73
Yajirushi 0:34e54ee64777 74 //各センサーの現在の設定などを表示するステートメント
Yajirushi 0:34e54ee64777 75 {
Yajirushi 0:34e54ee64777 76 char mode = sensor1.getOperationMode();
Yajirushi 0:34e54ee64777 77 char sysStatus = sensor1.getSystemStatus();
Yajirushi 0:34e54ee64777 78 char testStatus = sensor1.getSelfTestResultAll();
Yajirushi 0:34e54ee64777 79 char errorStatus = sensor1.getSystemError();
Yajirushi 0:34e54ee64777 80 char calibST[4];
Yajirushi 0:34e54ee64777 81 sensor1.getCalibStatusAll(calibST[0], calibST[1], calibST[2], calibST[3]);
Yajirushi 0:34e54ee64777 82
Yajirushi 0:34e54ee64777 83 char bme280mode_hum = sensor2.getCTRL_humidity();
Yajirushi 0:34e54ee64777 84 char bme280mode_meas = sensor2.getCTRL_measuring();
Yajirushi 0:34e54ee64777 85 char bme280mode_conf = sensor2.getConfig();
Yajirushi 0:34e54ee64777 86
Yajirushi 0:34e54ee64777 87 pc.printf("BNO055 (9DOF sensor) ---- ---- ---- ---- ---- ---- ---- ---- ----\r\n");
Yajirushi 0:34e54ee64777 88 pc.printf("Mode = 0x%02X, sysStatus = 0x%02X, testStatus = 0x%02X\r\n", mode, sysStatus, testStatus);
Yajirushi 0:34e54ee64777 89 pc.printf("calibSys = %d [%%], calibAcc = %d [%%], calibMag = %d [%%], calibGyro = %d [%%]\r\n", calibST[0], calibST[1], calibST[2], calibST[3]);
Yajirushi 0:34e54ee64777 90 pc.printf("errorStatus = 0x%02X, err = 0x%02X, len = %d\r\n\r\n", errorStatus, sensor1.getIfaceLastError(), sensor1.getIfaceLastLength());
Yajirushi 0:34e54ee64777 91
Yajirushi 0:34e54ee64777 92 pc.printf("BME280 (Temperature, Humidity, Pressure sensor) -- ---- ---- ----\r\n");
Yajirushi 0:34e54ee64777 93 pc.printf("CTRL_HUM = 0x%02X, CTRL_MEAS = 0x%02X, CONFIG = 0x%02X\r\n\r\n", bme280mode_hum, bme280mode_meas, bme280mode_conf);
Yajirushi 0:34e54ee64777 94 }
Yajirushi 0:34e54ee64777 95
Yajirushi 0:34e54ee64777 96 while(btn); //ボタンが押されるまで待ち続ける(Nucleo専用)
Yajirushi 0:34e54ee64777 97
Yajirushi 0:34e54ee64777 98 wait_ms(1000);
Yajirushi 0:34e54ee64777 99 led = 1;
Yajirushi 0:34e54ee64777 100
Yajirushi 0:34e54ee64777 101 //各センサーの値を格納するための変数宣言
Yajirushi 0:34e54ee64777 102 short dataBox[12];
Yajirushi 0:34e54ee64777 103 float scAcc, scMag, scGyro, scEUL, scTemp;
Yajirushi 0:34e54ee64777 104 float ax, ay, az, mx, my, mz, gx, gy, gz, yaw, roll, pitch, temp;
Yajirushi 0:34e54ee64777 105 float bme280_T = 0.0, bme280_P = 0.0, bme280_H = 0.0;
Yajirushi 0:34e54ee64777 106 char bme280_status = 0x00;
Yajirushi 0:34e54ee64777 107
Yajirushi 0:34e54ee64777 108 //センサーのRAW値を実際の数値に変換するための倍率を取得する
Yajirushi 0:34e54ee64777 109 scAcc = sensor1.getAccScale();
Yajirushi 0:34e54ee64777 110 scMag = sensor1.getMagScale();
Yajirushi 0:34e54ee64777 111 scGyro = sensor1.getGyroScale();
Yajirushi 0:34e54ee64777 112 scEUL = sensor1.getEulerScale();
Yajirushi 0:34e54ee64777 113 scTemp = sensor1.getTempScale();
Yajirushi 0:34e54ee64777 114
Yajirushi 0:34e54ee64777 115 //ボタンが押されるまで繰り返し続ける(Nucleo専用)
Yajirushi 0:34e54ee64777 116 //ボタンがない場合はwhile(1)の無限ループで代用
Yajirushi 0:34e54ee64777 117 while(btn){
Yajirushi 0:34e54ee64777 118 //配列dataBoxに、9軸の値とオイラー角(yaw roll pitch)を格納(計12個の値)
Yajirushi 0:34e54ee64777 119 sensor1.get9AxisAndEUL(dataBox);
Yajirushi 0:34e54ee64777 120
Yajirushi 0:34e54ee64777 121 //倍率をかけてRaw値を実際の値に変換
Yajirushi 0:34e54ee64777 122 ax = (float)dataBox[0] * scAcc;
Yajirushi 0:34e54ee64777 123 ay = (float)dataBox[1] * scAcc;
Yajirushi 0:34e54ee64777 124 az = (float)dataBox[2] * scAcc;
Yajirushi 0:34e54ee64777 125 mx = (float)dataBox[3] * scMag;
Yajirushi 0:34e54ee64777 126 my = (float)dataBox[4] * scMag;
Yajirushi 0:34e54ee64777 127 mz = (float)dataBox[5] * scMag;
Yajirushi 0:34e54ee64777 128 gx = (float)dataBox[6] * scGyro;
Yajirushi 0:34e54ee64777 129 gy = (float)dataBox[7] * scGyro;
Yajirushi 0:34e54ee64777 130 gz = (float)dataBox[8] * scGyro;
Yajirushi 0:34e54ee64777 131 yaw = (float)dataBox[9] * scEUL;
Yajirushi 0:34e54ee64777 132 roll = (float)dataBox[10] * scEUL;
Yajirushi 0:34e54ee64777 133 pitch = (float)dataBox[11] * scEUL;
Yajirushi 0:34e54ee64777 134
Yajirushi 0:34e54ee64777 135 //BNO055内のセンサーの参考温度を取得して実際の値に変換
Yajirushi 0:34e54ee64777 136 temp = (float)sensor1.getTemperature() * scTemp;
Yajirushi 0:34e54ee64777 137
Yajirushi 0:34e54ee64777 138 //温湿度センサーより、温度、湿度、気圧、現在の状態を取得して変数に格納
Yajirushi 0:34e54ee64777 139 bme280_T = sensor2.getTemp();
Yajirushi 0:34e54ee64777 140 bme280_P = sensor2.getPress_hPa();
Yajirushi 0:34e54ee64777 141 bme280_H = sensor2.getHum();
Yajirushi 0:34e54ee64777 142 bme280_status = sensor2.getStatus();
Yajirushi 0:34e54ee64777 143
Yajirushi 0:34e54ee64777 144 //温湿度センサーの補正データが更新されていたなら、計算用数値を更新
Yajirushi 0:34e54ee64777 145 if(sensor2.isReady()){
Yajirushi 0:34e54ee64777 146 sensor2.updateCalib();
Yajirushi 0:34e54ee64777 147 }
Yajirushi 0:34e54ee64777 148
Yajirushi 0:34e54ee64777 149 pc.printf(
Yajirushi 0:34e54ee64777 150 "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",
Yajirushi 0:34e54ee64777 151 ax, ay, az, mx, my, mz, gx, gy, gz
Yajirushi 0:34e54ee64777 152 );
Yajirushi 0:34e54ee64777 153
Yajirushi 0:34e54ee64777 154 pc.printf(
Yajirushi 0:34e54ee64777 155 "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",
Yajirushi 0:34e54ee64777 156 yaw, dataBox[9], roll, dataBox[10], pitch, dataBox[11]
Yajirushi 0:34e54ee64777 157 );
Yajirushi 0:34e54ee64777 158
Yajirushi 0:34e54ee64777 159 pc.printf(
Yajirushi 0:34e54ee64777 160 "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",
Yajirushi 0:34e54ee64777 161 bme280_T, temp, bme280_P, bme280_H, bme280_status
Yajirushi 0:34e54ee64777 162 );
Yajirushi 0:34e54ee64777 163
Yajirushi 0:34e54ee64777 164 wait_ms(1000);
Yajirushi 0:34e54ee64777 165 }
Yajirushi 0:34e54ee64777 166 }