【BME280】ArduinoでI2CタイプBME280を使い倒す

Arduino

はじめに

今回はBME280を使用していこうと思います。BME280とは何ぞやというと【温度・気圧・湿度の複合センサー】でメーカーはドイツのBOSCH製になります。

本来はチップとして単体の製品ですが、様々なメーカーからデバイスとして販売されております。本記事で紹介するのはAmazonで売られていた基板上にレギュレータとプルアップの抵抗が既に実装されているタイプの物を使用しております。

レギュレーターがない裸のチップのまま使用する場合の定格電源電圧は【1.71V~3.6V】なので注意してください。

また、BM”P“280という似たような名前のチップが存在しますが、気圧オンリーのセンサなので買う時には注意してください。私も一回間違って購入の経験ありです。

通信インターフェースはI2CとSPの両方に対応しております。今回はI2Cタイプを購入しております。

本記事を書くにあたり日本語訳のデータシートを参照させていただきました。有志の皆様ありがとうございました。リンクは最後にまとめております。

なお、Arduinoでの使用ならば<Wire.hライブラリ>と<BME280ライブラリ>を使用すればすぐにデータを取り出すことが可能ですが、レジスタの機能から使用方法まで掘り下げていくので<Wire.hライブラリ>のみの使用になるのでご承知おきください。

ではどうぞ!

BME280概要

1.モード

BME280は【スリープ】【強制測定】【ノーマル】の3つのモードを保有しています。modeレジスタにより変更可能です。

  • スリープ:測定は実行されない待機状態
  • 強制測定:手動による単発測定
  • ノーマル:待機と測定の繰り返し。待機時間は0.5ms~1000msで設定可能。後述のIIRフィルタ使用の際はノーマルモードを使用することで外乱を抑えることができる。

消費電力を抑える必要があるのであれば定期的な強制測定モードを行い、測定していないときはスリープモードにすると消費電力が抑えられると思われます。

2. 測定フロー

BME280の測定はオーバーサンプリングによるAD変換⇒IIRフィルタによるノイズ除去で構成されています。オーバーサンプリングというのは簡単に言うとサンプリングレートを早くしてノイズを広範囲に分散できるのでノイズ低減の効果が期待できる。落としきれなかったノイズは内蔵フィルタで処理するのですがBME280ではIIRフィルタというのを使用しているようです。

分解能については以下の通りです。

  • 湿度:16bit
  • 圧力:IIRフィルタ有効なら20bit。無効なら16+(osrs_p – 1)bit。
  • 温度:IIRフィルタ有効なら20bit。無効なら16+(osrs_p – 1)bit。

BME280使用手順

制御レジスタ設定

温度測定の前に制御レジスタを設定する必要があります。レジスタ番号としてはF2h, F4h, F5hが該当します。

  • F2h湿度のオーバーサンプリング設定。この設定が有効になるタイミングはF4h(ctrl_meas)の書き込み後。

  • F4hステータスレジスタ。温度と圧力のオーバーサンプリングの設定。及び、モードの設定を行う。

  • F5hデバイスの設定レジスタ。通常モードでの待機時間の設定とIIRフィルタの有効無効設定、及びフィルタ係数の設定を行います。0bit目ではSPI使用時の設定を行う。

今回設定するパラメータは【屋内環境のモニタリング】用に使用するのでデータシートを参考に以下のようなパラメータに設定します。

測定生データ読み取り

BME280は測定データをF7h~FEhの8byteに格納されています。データシートによると各レジスタに対して読み込みコマンドを送るのではなく連続して読み出した方が良いと記載されています。今回はそれにならってF7h~FEhを連続で読み取っていきます。読み取った後にbitシフトでデータを組み合わせていきます。実際のArduinoでの手順としてはWire.requestFromを使用して開始アドレスをF7hとして読み取りbyte数を8byteとします。

測定データ補償

読み取りの生データでは値を正確に読むことが不可能なのでBME280に内蔵されている補償パラメータにより補償することが必要です。補償パラメータはレジスタアドレス88h~E7hに格納されており、データシート中の表にまとめられております。

よってBME280を使用する場合には一旦補償パラメータを配列に読み出して格納する必要があります。補償式に関してもデータシート中にコードが載せられているのでそのまま使用します。

■温度補償式

■圧力補償式

■湿度の補償式

サンプルコード

今までの設定を踏まえてサンプルコードを載せたいと思います。

コードが長くなってしまっていますが、ほとんどは補償式と補償パラメータが占めております。基本的にBME280の制御設定を書き込んでレジスタに格納されている値を読み取り補償式により温度、気圧、湿度に変換しているだけです。

  1. Wire.beginTransmissionにより制御パラメータ設定(F2h, F4h, F5h)
  2. Wire.requestFromにより補償係数を引き出す(88h~E7h)
  3. Wire.requestFromにより値を連続で読み出す(F7h~FE)
  4. 補償式により読み取り値を計算

コード中で補償係数を読み取るのに25byte分と7byte分で分けて読み出しています。当初は32byte分一気に読みだしたのですがうまくいきませんでした。調べていませんが、 Wire.requestFromのバッファ量が25byteまでなのかもしれません。

また、読み取った値は配列に格納されてビットシフトとOR及び&により値を抽出・接合しています。下記記事にbit演算についてまとめてありますので役に立つかもしれません。

組み込み開発でよく使うbit演算子まとめ
bit演算式のまとめと組み込みの時にレジスタ操作などでよく使用するbit演算子の使用方法を紹介していきます。ATtiny13のPORTBを使用して実際にLEDを光らせながら紹介いたします。

おわりに

今回はライブラリ不使用でのBME280使用を紹介しました。

参考のコードではノーマルモードでの一定間隔の読み取りを行いましたが、消費電力を抑えたり、そこまでリアルタイムの値が欲しくない場合は強制測定を一定間隔で回すのもありかと思います。例えばタイマ割り込みで強制測定を行い、それ以外はスリープモードにするなど。

せっかくなのでBME280を使用した電子工作をどこかでやれればと思います。

今回はこれで失礼いたします。

ではでは~

参考

BME280日本語データシート

コメント

タイトルとURLをコピーしました