Arduino勉強会
2015/04/29からのアクセス回数
スイッチサイエンスが販売しているBME280搭載 温湿度・気圧センサモジュールは、 1個のチップで気温、湿度、気圧が測れる便利なセンサーをブレッドボードでも使えるモジュールです。 Arduinoでの使い方も以下のページの「使い方」に紹介されています。
今回は、mbedの普及に努めている渡會さんが、BME280モジュールをmbedで使えるライブラリーを公開されたので、 これをlbeDuinoに移植してみました。
BME280とlbeDuinoとの接続は、渡會さんの資料を参考に以下の様に結線しました。
lbeDuino | BME280 |
---|---|
GND | 1, 5(SDO, GND) |
3.3V | 4, 6, 7(GSB, Vcore, Vio) |
D8(SDA) | 3(SDI) I2CではSDA |
D9(SCL) | 2(SCK) I2CではSCL |
今回も http://akizukidenshi.com/catalog/g/gT-06356/ を使って秋月の両面基板上に回路を描いています。
出来上がったMBE280シールドは、以下の様になります。
lbedは、mbedのインタフェースに合わせているので、ライブラリーの移植はインクルードファイルを mbed.hからlbed.hに変え、setup関数を追加するだけで良いのですが、そのままコンパイルするとサイズオーバーで、 LPC1114FNベースのlbeDuinoには載りませんでした。
そこで、i2cのポインタを止めて、デストラクターを削除して、コンストラクターもsda, sclを使用するものに修正しました。
}}
I2cLCDシールドを上に載せたテスト用のスケッチ(プログラム)は、渡會さんのmain関数を参考に以下の様にしました。
DigitalOut led(D13); AQCM0802 lcd(D8, D9); BME280 sensor(D8, D9);
DigitalIn sw1(D2); DigitalIn sw2(D3);
int last_mode = 0; char degree = 0xdf; void setup() {
}
void loop() {
} }}
lbeDuinoは、Arduino3.3V版でも同じように動くことを売りにしているので、 出来上がったBME280のライブラリをArduino版に入れて実行したところ、 湿度を除いて、気温、気圧の値がまったく違ってでてきました。
mbedは、ARMの32bitマイコンを使っているのに対し、Arduinoは、AVRの8bitのAtmega328Pを使っています。
ここで、注意が必要なのがintの評価をするときに、16bitでするか32bitで行うかという点です。 BME280では、気温と気圧は3バイトで返されるため、32bitのlongタイプが必要になります。
スイッチサイエンスで公開されているArduino版の温度センサーの処理は、以下の様になっています。 データの取り込み部分readData()では、Wire.read()で取り込んだ1バイトのデータをuint32_tのdataの配列に セットしています。これで、temp_rawに32bitのデータが正しくセットされます。
void readData() {
}
}}
次に温度に変換するcalibration_Tを見てみると、dig_T1, dig_T2, dig_T3に対して(signed long int)等のキャストが 執拗に施されています。ここが8bitマイコンで32bitデータを扱うときに注意が必要な部分なのです。
signed long int calibration_T(signed long int adc_T) {
}}
渡會さんのgetTemperatureでは、32bitマイコンなので、char cmdの配列をそのまま12bitシフトしても 問題なく、temp_rawにセットされ、dig_T1, dig_T2, dig_T3へのキャストも不要です。
float BME280::getTemperature() {
}
}}
そこで、lbeDuinoのArduino3.3V版では、以下の様に修正しました。読み込んだcmdをuint32_tのdataにコピーし、 キャストもArduino版と同じように入れています。
}}
BME280ライブラリが修正でき、最初のスケッチがArduino3.3V版でも無事動作するようになりました。
皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。
スパム防止に画像の文字列も入力してください。