Raspberry Piや ESP8266 系列で環境センサを I2C 接続して長期運用していると、ごくたまーに計測不良に陥ることが有ります。中には機器を再起動しても復旧しないことから、機器を10分以上電源OFFにし、その後起動させてようやく復活する事例に何度か遭遇しました。計測不良の度に機器ごと再起動するのではなく、 I2C バスへの電力供給を絶つことでセンサを復帰させることが出来ないか、 MOSFET を使った制御方法を考察します。
まず、今回制御する電流の大きさを推算します。BME280はBosch社のデータシートによると、温度→気圧→湿度をシーケンシャルに計測し、各計測時の消費電流はそれぞれ、350、714、340μAであることから、最大でも1mA見込んでおけば良さそうです。
対してRohm社のBH1750は、単純にデータシートに記載されている最大消費電流190μAを鑑みればよいので、これら2つのセンサ合わせて1mAと言うことにしましょう。そして定番の冗長性運用でセンサ数が倍増したとしても、〜10mA程度を見込んでおけば十分と言えるでしょう。
次に電流を制御するMOSFETをGPIOと繋ぐ回路構成について、以前より漠然とした理解しか持っていなかったので、この機会に確認しておこうと思います。こちらの記事はゲートに入れる2つの抵抗の目的とおおよその目安など、シンプルにしてとてもわかりやすいものでした。
そして、ゲートキャパシタについては東芝のMOSFETゲート駆動回路に関するPDF資料が教科書になりました。下図はその抜粋。
以上より、今回ESP Easyで稼働している計測器に追加する回路はこのようにしてみました。
(回路図作成には、Digi-Key社のブラウザベース回路図エディタ「Scheme-it」を使用)
実際にブレッドボード上に製作してみます。下図、緑の小さな小島が今回追加した回路です。MOSFETは取り敢えず手元に有った2SK3992を使用しています。デバッグ用にLEDを追加設置しました。
ESP Easyをあれこれ調べたり試したりしましたが、GPIOのHIGH/LOW切替はコマンドを送り込むのが一番近道でした。
1 2 3 |
GPIO,14,0 # Set OFF GPIO,14,1 # Set ON status, GPIO,14 # Get Staus |
そして現在のGPIOの状態は、こちらのPin state bufferで確認することも出来ます。
そして1つ気をつけなければいけないのが、起動時のGPIO設定値。HardwareタブのGPIO boot statesで起動時のピン状態を設定します。デフォルトの振る舞いは機器のGPIOピンによって異なり、GPIO14は高インピーダンスなのでInputでしょう。このままでは起動時にI2Cバスへ通電されないので、ここをOutput Highへ変更しておきます。
ESP EasyではさらにDeviceタブにも、GPIOをスイッチとして追加出来るのですが、別にそれでGUI上にスイッチボタンが出現するわけでもなく、それでいてここに記憶されている状態が、上図でせっかく設定した初期値を上書きしてしまうような挙動を採るので、ここ使うのは止めました(よく見たらInput用)。
それでは実際に操作してみましょう。ESP Easyは、Tools –> Log で動作をリアルタイムで見ることが出来、普段はこのような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 |
242533: WD : Uptime 4 ConnectFailures 0 FreeMem 17472 WiFiStatus 3 272531: WD : Uptime 5 ConnectFailures 0 FreeMem 17768 WiFiStatus 3 302532: WD : Uptime 5 ConnectFailures 0 FreeMem 17792 WiFiStatus 3 331887: SYS : 3.00,-57.00 332532: WD : Uptime 6 ConnectFailures 0 FreeMem 17752 WiFiStatus 3 362532: WD : Uptime 6 ConnectFailures 0 FreeMem 17776 WiFiStatus 3 389978: BME280: dew point 13.54C 389989: BME280 : Address: 0x76 389990: BME280 : Temperature: 28.62 389990: BME280 : Humidity: 39.54 389990: BME280 : Barometric Pressure: 1010.39 390530: BH1750 Address: 0x23 Mode: 0x1 : Light intensity: 723.33 |
また、I2C Scanをすると次のような結果を得ます。
1 2 |
0x76 BME280 BMP280 MS5607 MS5611 HT16K33 0x23 PCF8574 MCP23017 LCD BH1750 |
ではここでGPIOをLowにするコマンドを送ると、ログは異常を発出するようになります。
1 2 3 4 |
1011976: BMx280 : Unable to detect chip ID 1011977: BMx280 : Unable to detect chip ID 1012976: BMx280 : Unable to detect chip ID 1012976: BMx280 : Unable to detect chip ID |
このときI2C Scanでは、すでにBH1750は消え、BME280のゴーストのみとなります(センサ異常時によくあるパターンと同じ)。
1 |
0x76 BME280 BMP280 MS5607 MS5611 HT16K33 |
ちょっと気持ち悪いので、上述のGPIO boot statesでOutput Lowにセットして再起動してみます。起動後、I2C Scanしてみましたが、No I2C devices foundとの結果で成功です。次に、ここからコマンドでONにしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
01079: BH1750 Address: 0x23 Mode: 0x1 : Light intensity: 0.00 302724: WD : Uptime 5 ConnectFailures 0 FreeMem 17552 WiFiStatus 3 332108: SYS : 2.99,-52.00 332725: WD : Uptime 6 ConnectFailures 0 FreeMem 17520 WiFiStatus 3 362725: WD : Uptime 6 ConnectFailures 0 FreeMem 17496 WiFiStatus 3 363676: BME280: dew point 13.05C 363687: BME280 : Address: 0x76 363688: BME280 : Temperature: 29.64 363688: BME280 : Humidity: 36.10 363688: BME280 : Barometric Pressure: 1010.65 392724: WD : Uptime 7 ConnectFailures 0 FreeMem 17496 WiFiStatus 3 422723: WD : Uptime 7 ConnectFailures 0 FreeMem 17520 WiFiStatus 3 |
正常にセンサを認識、計測開始しました。
今回、MOSFETによるI2Cバスへの電力供給制御が有効であることが分かりました。今後は既存システムへのMOSFET組み込みの最適化や、Raspberry Piで使っている冗長化システムでのMOSFET活用に向け、次回は小型汎用化に取り組んでみます。
参考と鳴謝)