BNO055とBME280を統合した基板を使用するためのサンプルプログラム。それぞれをI2C,SPI,UARTで使用することができますがUARTモードは非常に不安定のためI2CまたはSPIでの使用を推奨。
Dependencies: BOARDC_BME280 BOARDC_BNO055 mbed
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 }
Generated on Sun Jul 17 2022 22:06:00 by 1.7.2