Raspberry PiとI2C接続された環境センサBME280の冗長化運用

図1. ブレッドボード上の実装例

Raspberry Piに環境センサBME280をI2Cバスで接続して実現する環境モニタをいくつか運用しているのですが、その中の1つがセンサ不良で取得不能になることがあります(母艦は特に問題無い)。すぐに素子交換出来るような場所ではない場合、これが致命的な欠陥に直結することから、環境センサの冗長化を考えます。

I2Cは一組のバス上に複数のデバイスを並列に連結して利用することが可能で、今回のBME280の場合はSDO端子を違えることで、固有の2つのアドレスに振り分けることが出来ます。

Adafruit製モジュールの場合:

  • 0x77 デフォルト
  • 0x76 SDO-GND接続

中華製GY-BME280-3.3の場合(こちらを使用):

  • 0x76 デフォルト
  • 0x77 SDO-VCC接続

 

まずはこの要領をブレッドボード上で実現してみましょう。

図1. ブレッドボード上の実装例
図1. ブレッドボード上の実装例

 

次に母艦Rspberry Pi上で、i2ctools を使ってバスの状況を確認してみます。

それぞれの素子を読み取れていることがわかります。

 

続いてシステムの実装です。既に稼働しているシステムでは、Adafruit製の「Adafruit_Python_BME280」ライブラリを愛用していて、この中のオブジェクトを生成するクラスの定義をよく読んでみると、

とあり、引数でI2Cアドレスを渡すだけで、目的の個体を呼び出すことが出来ます(ありがとう!)。

そこで、5分毎にデータを取得、それをThingSpeakに投げつける既存の仕組みをこの方法で拡張してみると
次のようになります(Pythonビギナーが見様見真似で書いたスクリプトにつきご勘弁を)。

 

一晩運転した結果はこのようになりました。

図2. 運転結果
図2. 運転結果

 

意外と数値に個体差があるようです。ここまでネタが揃えば、二つの計測結果の平均化や、何らかの不具合で数値の異常や取得不能に対する例外処理を追加することで精度と安定性を向上させることが可能でしょう。

また、同様にいくつか稼働している、ESP8266ベースのシステムにもこのセンサ冗長化の仕組みを展開したいと考えています。

 

 

参考)

 

2017.11.24 追記

課題のセンサ不具合対応を織り込んだ最終版。

 

2017.12.19 さらに追記

ブレッドボードを離れ、市販のコネクタを流用した汎用量産版を製作。分離すればシングル動作も可能に。

図3. BME280スタック量産版試験
図3. BME280スタック量産版試験
図4. BME280スタック量産仕上げ
図4. BME280スタック量産仕上げ

 

投稿者: ServerCan

香港在住の日本人技術者です。技適が無いのでのびのび創作しています。 twitter: @ryan_j23 Mastodon: servercan@servercan.xyz

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA