BNO055とBME280を統合した基板を使用するためのサンプルプログラム。それぞれをI2C,SPI,UARTで使用することができますがUARTモードは非常に不安定のためI2CまたはSPIでの使用を推奨。
Dependencies: BOARDC_BME280 BOARDC_BNO055 mbed
main.cpp@0:34e54ee64777, 2016-11-29 (annotated)
- Committer:
- Yajirushi
- Date:
- Tue Nov 29 02:59:37 2016 +0000
- Revision:
- 0:34e54ee64777
FIRST COMMIT
Who changed what in which revision?
User | Revision | Line number | New 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 | } |