マスタリングWireライブラリ その4 温度/湿度/気圧センサBME280 接続

 湿度を測る時、相対湿度は温度に依存するので、温度も同時に取得できます。加えて気圧が測れれば、台風が近づいたときに役立つ情報が得られます。それらが一つのセンサで測定できるのがボッシュのBME280です。ここではI2Cの実験を行いますが、SPIのインターフェースも選べます。ここでは秋月電子通商のボードを利用しました。ラズパイでの利用は、こちらを参照ください。

BME280の動作電圧

 電源電圧は1.71~3.6Vなので5VのArduino UNOでは使えないですが、検索すると、つないでいる事例がたくさん見つかります。BME280の電源はArduino UNOの3.3V電源を使っているのでよいのですが、I/OのI2Cポートは5Vが発生します。BME280のI2Cポートを3.3Vにプルアップすればよいという判断かもしれません。

 クロックSCLはマスタであるArduinoから出力されるので、抵抗やダイオードで電圧を下げるという対処方法があります。しかしデータのSDAラインは、マスタもスレーブも信号を出します。マスタが信号を出すとき、HIGHは5Vです。3.3Vにプルアップしている状態のラインをHIGHにするとどうなるのでしょうか。また、スレーブがHIGHを出すとき、3.3Vですが、これは、I2Cの規格のVih=3.5Vを満たさないので、ArduinoはHIGHを認識できないかもしれません。

 実際につないで実験をしました。

 接続です。スケッチはI2CScannerを動かします。0x76に見つけています。

 オシロスコープで電圧を観測します。HIGHは4.2V、ピークは4.35Vでした。BEM280のマニュアルによると、I/O電圧の最大値は4.25+0.3=4.55Vです。超えてはいけない電圧(Absolute maximum)内に収まっています。しかし、スペックぎりぎりの使い方はしないのが普通ですが、次の展示会で動かさないといけない、という場合はありでしょう。

電源電圧の対応

 BME280の電源電圧はArduino UNOの3.3Vを使えばOKです。I2Cの二つの信号を、BME280から信号を出すときに3.3->5V変換、Arduinoから信号をBME280へ出すときは、5->3.3Vへ電圧レベルを変換する回路が必要です。

 このようなとき、MOSFETで電源を切り替える回路と、専用のICを使う2通りの方法があります。どちらでもかまいません。Adafluitの製品はレベル変換回路を含んだブレーク・アウト・ボードを出しています。

 PCA9515ADを使います。

接続

 レベル変換PCA9515ADの電源は3.3Vへつなぎます。3.3V側のプルアップ抵抗は、BME280基板のJ1、J2ジャンパをショートすると有効になります。5V側のプルアップ抵抗は6.8kΩを取り付けました。BME280のSDO端子をGNDへつなぐと、スレーブ・アドレスは0x76になります。BME280基板のJ3をショートするとI2Cインターフェースになります。

 信号を見ます。データSDAの信号です。いずれも規定の電圧でやり取りができています。

BME280の主なスペック

 温度の測定範囲は-40~+85℃、0~+65℃の確度は±1℃、25℃のときは±0.5℃です。分解能0.01℃です。

 相対湿度の測定範囲は0~100%で、そのときの温度条件は0~+60℃です。25℃時20~80%RH時の確度は±3%です。

 気圧の測定範囲は300~1100hPaで、そのときの温度条件は0~+65℃です。確度は±1.0hPaです。

I2Cのやり取り

 データ転送を確認するために、デバイスのIDが0x60なので、このデータを読み出します。レジスタのアドレスは0xd0です。データ長は8ビットです。

#include <Wire.h>
unsigned char BME280_address = 0x76;
unsigned char ID_register = 0xd0;

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("start ");
Wire.beginTransmission(BME280_address);
Wire.write(ID_register);
Wire.endTransmission();
Wire.requestFrom(BME280_address, 1);
int ID = Wire.read();
Serial.println(String(ID,HEX));
}

void loop() {
}

 実行結果は0x60です。オーソドックスなWireライブラリの利用でデータを取得できます。

前へ

マスタリングWireライブラリ その3 温度センサMCP9808のアラート

次へ

マスタリングWireライブラリ その5 温度/湿度/気圧センサBME280 ライブラリの利用