2017年10月25日水曜日

英PimoroniからガスセンサーBOSCH BME680が届いたのでRaspberry Piで使ってみた

ついに発見!ガスセンサー BOSCH BME680

英PimoroniのTwitterで知ったBOSCH BME680ボードの発売。
自宅のエアーコンディションを調べてみたく、以前からガスセンサーを探していました。
アナログセンサーが有ることは知っていたのですが、それをRaspberry Piで利用するためには数値化するためのADコンバーターというのが必要になります。
その手間を惜しんで今まで保留にしていたのですが、I²C接続可能なコレの実装ボードが発売になったので即注文。
ちょっと高かったんですけどね😭

写真の右側が英Pimoroni BOSCH BME680ボード
左側は、次いでに注文したボタンを追加するButton SHIMボードです。

ヘッダーピンを取り付け

英Pimoroni BOSCH BME680ボードには2種類のヘッダーピンが付属していて、利用方法に応じて選択できます。
ただ、うちの場合はセンサーをアクリル板でサンドイッチして保護し、ボード横からケーブルを挿したいので、自前で用意したL型ヘッダーピンを使います。
I²Cで使うのは4ピンのみなのですが、Raspberry PiのGPIOに直刺し出来るよう、間にNCピンが追加されているので5ピン使います。

ピンを挿す穴が若干上下にズレているのですが、これは取り付けの際にピン動かないようにするためだと思われます。
だから、はんだ付けの前に差し込んで浮かしても落ちたりしません。
また、各ピンの印刷も両面に書かれているので、どちらから見てもひと目でわかります。
英Pimoroniのこういう細かい心遣いある作りは、地味にとても嬉しいです😁

1列5ピンのヘッダーピンははんだ付け楽でいいですね😅
コテ先にハンダを軽く付けて下準備し、コテ先をピンに当ててからハンダ線を当てて流し込んでいくイメージで。
今回も、我ながら上出来。テスターは当てず、ぶっつけ本番でいきます。

英Pimoroniで以前買ったRaspberry Pi Zeroと繋ぎます。
いつもなら、どれがI²CのSDAでSCLで、どこに電源とかグランドとか取る?と迷うのですが、直刺し想定のピン配列なので電源ピンさえ間違えなければ、あとは順番に挿してくだけなので楽です。
もちろん、NCピンをスキップするのも忘れずに。繋いでもいいですが使われないピンなので。

Raspberry Piでセンサー値を読み取る

今回は、ブログ用にこの段階で最新のリリースデート2017-09-07からSDカードにOSを書き込んで使いました。
今のOSイメージって便利なもので、I²C関連のコマンドやPython Libは最初から入っているので、raspi-configでI²Cを有効にするだけで使えちゃいます。
念のため、下記コマンドで有効になってるかを確認します。
sudo i2cdetect -l⏎
そして、オプションを変えて下記コマンドで接続されてるI²Cのスレーブ機器のアドレスを確認します。
sudo i2cdetect -y 1⏎
画像のように76という数字が出ていればOKです。出てないとRaspberry Piが認識していない事になります。
このアドレスはボードにも書かれていて通常はOKなのですが、もし0x76アドレスが接続されてる他のI²Cスレーブ機器と同じようなら、ボードのADDRをショートさせれば0x77にする事が出来ます、多分。
多分というのは確認してないからなのですが、一応BME680の仕様では可能なので多分出来ると思うのですが。

今回は、英PimoroniGitHubで公開されてるPython Libを使わせて頂きます。
Clone or Downloadのボタンを押してZIPファイルをDownloadし、フォルダ解凍します。今回は、/home/pi/Downloads/bme680-masterと便宜上します。
GitHubのBME680 Python Libトップページ下のインストール手順に従ってLibをPythonにインストールします。
libraryディレクトリ直下にあるsetup.pyにinstallのオプションを付けて実行するだけです。
sudo python setup.py install⏎
出来たら、examplesディレクトリ直下の3つのコマンドどれか実行すればセンサー値が表示されます。
まずは簡単な所で、温度・気圧・湿度の表示コマンドから。
python temp-press-hum.py⏎
画像のように、すごい勢いでズラーと表示されていくと思います。

次は、ガスセンサーも含んだすべてのセンサー値を表示してみます。
こちらも下記コマンドを実行するだけです。
python read-all.py⏎
最初にキャリブレーションデータとかイニシャルリーディングとか色々出ますが、まぁ気にしないでください。BME680のデータシートを読むと何となくわかると思いますが、全部英語で頭痛くなると思うので😅
temp-press-hum.pyを実行した時のように温度・気圧・湿度が表示され、その後ろにOhmsという数値がありますが、これがガスセンサー値でΩ(オーム、抵抗)です。
最初のうちは、このガスセンサー値が時々取得出来なくて飛び飛びになることがあります。
他のセンサーと違ってウォームアップのために値が安定するまでに時間がかかります。
その辺の話は次のコマンドで説明します。

3つのサンプルコマンドの最後の1つindoor-air-quality.pyを実行します。
python indoor-air-quality.py⏎
画像には「sec」の値がありますが、私自身で追加した項目です。
実行直後にコレクティング ガス レジスタンス バーンイン データ 5ミンって英語表示されますが、これがウォームアップの事で5分間センサーを動かし続けてガスセンサー値が安定するのを待ちます。

5分後にガスセンサー値の基準値と湿度の基準値(こっちは決め打ちで40%RH)が確定するので、それからズラズラとガスセンサー値と湿度、内部的に算出したエアークオリティ値とその数字に対する状態(この画像ではアベレージ、平均的)が表示されます。
これは、ISO16000-29 VOC検知器評価法に基づいたもので、揮発性有機化合物(VOC)の待機中の濃度から大気が綺麗かどうかを評価しています。

システムに組み込んでいて気がついた不便な点

あらかじめ用意していたPythonスクリプトが役に立たない事がわかり、1から作り直してなんとかBME280と置き換えられました。
しかし、問題点も見つかりました。それは、ガス値を読み取る時に今の方法だと毎回5分もかかるということ。
その解決案として、デーモン(Windowsでいうサービス)で起動時に立ち上げてBME680の初期化と取得を行ない、センサー値の欲しいアプリはそこに問い合わせて拾ってくる方式。

Twitterをお休みして、こちらに全力投球中なのですが前途多難です。