hogehoge, world.

米国カリフォルニアのソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

ESP-WROOM-02(Arduino)によるWiFiネットワーキング (12) ~ Amedesの省電力化

前回説明した降水確率予報システム "Amedes" は、一日数回しか稼働しないにも関わらず、スマフォ用バッテリーが5日程度で空になってしまうものであった。これはちょっともったいない。ESP8266と8連LEDが常時30mA近い電流を消費しながら、やっていることは人感センサーへの入力をひたすら待っているだけなのだ。

ならば「普段は電源を切っておいて、人感センサーに入力があったらONするようにできないのか?」と考えたくなるのが人情である。データシートによれば人感センサーの消費電流は12μAらしいので、これが実現できれば計算上は2500倍もの効率向上になるはずだ。というわけでやってみよう。テッテッテー テッテッテテー♪

回路の修正

試行錯誤の末たどりついた回路がこれである。黄色い枠は「本来こうすべきだが(右)手抜きしちゃったよん(左)」の意味である。

f:id:tomoto335:20160625131530p:plain

詳細な動作は後で解説するので、大きなポイントだけ言っておくと:

  • EN: 今まで常に3V3につないでいたが、これを外して(S5で遮断し)、人感センサーのVOUTとIO13によってHIGHに引き上げるようにする。また、コンデンサC2と抵抗R3による「クッション」をGNDとの間に入れる。
  • 人感センサーのVOUT: IO14に加えて、整流用ダイオードD1を通してENにつなぐ。
  • IO13: 抵抗R4を通してENにつなぐ。
  • 8連LEDの電源: ENがHIGHになったときだけ電源が入るように、MOS-FETによるスイッチをかます。本来はPチャネルとNチャネルのMOS-FETを組み合わせてVDC側を開閉する必要があるが、部品がなかったので手抜きしてNチャネルMOS-FET 1個でGND側を開閉する回路にしてしまった。AdafruitのベストプラクティスにはちゃんとGNDを先につなげと書いてあって、これはお行儀の悪い使い方であり、壊れても文句は言えない。
  • S5: プログラム書き込み時に、センサーやIO13の状態に関わりなく強制的にENをHIGHにするためのスイッチである。あまり使わないので、実際にはスイッチではなくジャンパー線を抜き差ししている。

ソフトウェアの修正

とりあえず回路動作の理解のためにはこれだけ理解しておけばよい:

  • 起動時に直ちにIO13を出力モードにしてHIGHを出力する
  • 起動後数分後に自分自身をシャットダウンする(無期限のdeep sleepに入る)

How it works?

普段は黙って3V3につないでおくだけのENを今回は活用する。ENはenableの意味で、これがHIGHでないとESP8266は動作を停止する。もともと電力管理のためのピンらしいので今回の目的にはピッタリである。

  1. システム全体の電源を入れた時点では、ENはLOWであり、ESP8266はシャットダウン状態である。このときの待機電流は公称60μAほどになる。
  2. 人感センサーが人を検知すると、VOUTに3Vが出力され、C2に電荷がたまってENがHIGHになる。
  3. ESP8266が起動する。ほぼ同時にIO13がHIGHになる。
  4. 人感センサーのVOUTは2~3秒後にLOWに落ちるが、今度はIO13がC2を充電し続けるため、ENはHIGHのままとなる。(ここでダイオードD1が活きてくるのがわかるだろう; これがLOW状態の人感センサーのVOUTに電荷が吸い込まれるのを防ぐ。)
  5. ESP8266は天気予報取得&表示を行ない、数分後に自分自身をシャットダウンする。
  6. IO13からの電荷の供給が止まるため、C2の電荷がR3を通じて放電され、ENがLOWに落ちる。
  7. 最初に戻る。

8連LEDも待機電流が5mAとばかにならないので、ENに同期して電源がON/OFFされるように MOS-FETのスイッチをかます。先述の通り現在は手抜き回路で動かしている。

また、プログラム書き込みモード時にもENをHIGHに保つ必要があるが(そうしないと人感センサーがオフになったら電源が切れてしまう)、これはENがIO13に接続されていることで達成される。理由はよくわからないが、実測するとプログラム書き込みモード時にはIO12~14にはHIGH(と見做せる電圧)が出ており、これがC2の電荷を維持してくれるのである。もしうまく働かなければスイッチS5を入れるという最終手段を使えばよい。

結果発表!

期待通りに電源がON/OFFされるようになり、待機中の電流がなんと0.2mAまで下がった!人感センサー+ESP8266+スイッチング電源の待機電流の合計としてはまあそんなものだろう。

ただ、デメリットも幾つかある:

  • 天気予報が表示されるのが遅くなった。従来は常に起動済み・ネットワーク接続済みだったため、人を感知してから2秒程度で表示できていたが、毎回起動とネットワーク接続処理を行うようになり、5秒程度追加でかかるようになった。
  • スマフォ用バッテリーが使えなくなった。通常のスマフォ用バッテリーは負荷がなくなると自分自身の電源を切るようになっており、待機電流が微弱になったことでこの機能が働くようになってしまった。そのため今は単三乾電池4本で駆動している。ちなみに「電子工作やIoTやってるお前らgeek野郎のために作ってやったぜ!」とばかりに電流が微弱でも電源を切らないバッテリーというニッチな商品がCheeroから出ている。Cheeroへのお布施として是非皆でひとつずつ買おう。

    www.cheero.net

  • HTTPによる設定変更をする場合、人感センサーの前に行って電源を入れ、それが切れないうちに設定を完了させねばならなくなった。

これで乾電池がどの程度もつかが見ものであるが、単三乾電池の容量を2000mAhとして試算すると…

  • 待機だけなら一日 0.2[mA] x 24[h] = 4.8[mAh]
  • 天気予報表示は一回あたり概ね (100[mA] * 60[s] + 30mA * 240[s]) / 3600[s/h] = 3.7[mAh]、一日5回表示したとして 18.5[mAh]
  • 2000[mAh] / (4.8[mAh] + 18.5[mAh]) = 85.8[日]

ほほう、二ヶ月くらいはいけそうだ!