ベランダで使っていた以下の構成のIoT温湿度計のバッテリーの持ちがすごく悪くて、だいたい2週間毎にバッテーリーを取り外して充電することが続いていたのでうんざりしていました。
- ATOM Lite
- M5Stack用温湿度気圧センサユニット Ver.3(ENV Ⅲ)
- 中古モバイルバッテリー(5,000mAh)
(次の記事のセンサーをENV IIIに変えたものです。)
この構成の本当の問題は中古モバイルバッテリーが経たっていたせいかもしれないのですが、モバイルバッテリーにはディープスリープ中に電力を止めてしまうものもあり、購入して実際に動作確認してみないと使えるかどうかわからないというリスクがあります。
また、充電にある程度時間がかかるため、ずっと動作させるとなると2つ用意することになってしまいます。
このような背景があって、最初はディープスリープ時の消費電力に定評のあるESP32とニッケル水素充電池の組み合わせを考えていました。
マイコンが動くのに必要な電圧
ESP32のデータシートに「Recommended Operating Conditions」という項目があり、ATOM LiteやM5Stamp Picoで使われているESP32-PICO-D4(フラッシュメモリ付き)のチップの推奨動作電圧は3.0から3.6Vとなっています。
そこで、電圧を変えられる電源とテスターを使って実際の下限電圧を調べてみました。
使用した電源は秋月電子通商の次のキットです。
M5Stamp Pico 動作下限電圧
WiFi接続が「なし」と「あり」で分けて書いているのは、電圧が低いと起動はしてもWiFiアクセスポイント接続中に「Brownout detector was triggered」と表示されてリセットがかかるからです。
んー、イマイチの結果ですね。これではディープスリープ中の消費電力が10μAでも電池駆動時間の伸びは期待できません。
では、ESP8266だとどうなのでしょうか? ESP-WROOM-02でも調べてみました。
ESP-WROOM-02 動作下限電圧
お、さすが!ESP8266のディープスリープ中の消費電力は20μAですが、これなら長期の電池駆動が期待できます。
ニッケル水素充電池
ニッケル水素充電池の公称電圧は1.2Vですが、実際にテスターで測ってみると多少前後していたりします。
たまたまコードレス半田ごて用に買った2,800mAhの単3ニッケル水素充電池は、満充電で1.3V程度になりました。
1.3V...、ESP32の最大電圧は3.6V...、公称電圧は1.2Vなので3本の3.6Vで使える筈ですが1.3Vだと3本で3.9Vと最大電圧をオーバーしてしまいます!
物理的に3本だと結構大きくて取り付け難い感じがあったこともあり、電池は2本で使うことにしました。電池ボックスに取り付けてテスターで電圧を測定したら2.74Vも出ていました。
ESP32を電池2本で使う秘策「昇圧DCDCコンバーター」
使おうとしているニッケル水素充電池2本の満充電電圧が「2.74V」のため、そのままではM5Stamp PicoのWiFi動作下限電圧「2.77V」を下回るため動きません。
そこで、電池ボックスを3.3V出力の昇圧DCDCコンバーターの入力として使うことができるのかを知るために、昇圧DCDCコンバーターを使ったときの動作下限電圧を調べてみることにしました。
使用したのは秋月電子通商の次のキットです。
M5Stamp Pico 動作下限電圧(昇圧DCDCコンバーター使用時)
WiFi接続あり/なしの差が激しくなりましたが、素晴らしい結果です。
これなら電池2本での動作は確実ですし、長期の電池駆動が望めそうなのですがメリットをもたらすものにはその代償が必要になるものです。この昇圧DCDCコンバーターの場合は効率が犠牲となります。
XCL103のデータシートによると低電圧時の効率は80%程度で、電力の約2割が失われてしまう計算になります。
ESP32(M5Stamp Pico) vs ESP8266(ESP-WROOM-02)
これで、戦いの準備は整いました。部屋のベランダの窓枠にへばり付いて戦っている勇姿をご覧ください!
この戦いの舞台は南米の発祥らしいUbidotsで行われています。
プログラムには電池の電圧をモニタリングする仕組みを用意していますが、ESP8266とESP32ではその仕組みが違っています。
ESP8266の電圧モニタリングの仕組み
ESP8266にはESP.getVcc()
というマイコンの電源電圧を取得する命令が用意されています。
ESP-WROOM-02のブレッドボード写真を見ると、ESP-WROOM-02の3V3端子に直接電池ボックスのプラスが繋がれていることがわかります。そのため、ESP.getVcc()で電池ボックスの電圧を取得することができます。
ESP32の電圧モニタリングの仕組み
ESP32では昇圧DCDCコンバーターの入力端子に電池ボックスのプラスを繋げているので、その端子とADC機能を持つESP32の端子(GPIO36)を繋げて、ミリボルトで指定の端子の電圧を取得する命令analogReadMilliVolts(36)
で電池ボックスの電圧を取得しています。
テスターの計測値と電圧モニタリング値の違い
ESP8266とESP32の電圧モニタリングの値は、実際のテスターの計測値とは差異があるため気をつける必要があります。
先の動作下限電圧の電圧モニタリング値は次のようになりました。
M5Stamp Pico
- 動作下限電圧:1,931mV
- 電圧モニタリング値:1,892mV
- 動作下限電圧:2,110mV
- 電圧モニタリング値:2,282mV
中間結果
8月4日に計測を始めて9月になったので、8月の状況をまとめてみることにしました。
温度と湿度
実は普通に温度と湿度も測っていたので、まずはそのグラフから。
M5Stamp PicoとESP-WROOM-02に付けた2つのDHT20は概ね同じ値になっていました。(微妙に2色ごとのグラフになっているのがわかりますか?)
電圧
どちらも開始時の電池ボックスのテスター計測値は同じで2,740mVです。
ESP-WROOM-02の電圧モニタリング値が現実よりかなり高くなっていて、M5Stamp Picoの電圧モニタリング値の方が現実に近くなっています。
M5Stamp Pico
棘のような揺らぎがありますが、急激に下がった後は緩やかな傾斜になっています。
急激に下がった後は、下がらない期間があって激しい揺らぎが来るとガクンと下がる階段状のグラフになっています。
予測日数
なんと当初の予想と違い、昇圧回路の付いたM5Stamp PicoがESP-WROOM-02を上回っています!しかも、両方とも2ヶ月半を上回るペースで決着が付くのは当分先になりそうです。
ディープスリープの時間の誤差
あと、もう一つ気付いたことがありました。
ESP8266を使っていてディープスリープで60分眠ると1、2分早く起きることを知っていたのですが、このディープスリープの時間の誤差がESP8266よりESP32の方が断然少ないのです。
クラウドにデータが届いた時間の誤差(10回平均)を出したところ次のようになりました。
ディープスリープの時間の誤差(60分指定時)
- ESP32: 15秒
- ESP8266: 77秒
結果発表
勝者:ESP-WROOM-02 (ESP8266)
M5Stamp Pico (ESP32)が予想に反して9月16日に止まってしまったため、開始から42日目で決着がつきました。
M5Stamp Picoから送られた最後の電圧モニタリング値は「2,088mV」で、これは事前テストで得られた下限の電圧モニタリング値の「1,892mV」より200mV程度高い電圧です。
その時点での予測日数56日より実際の経過日数が大幅に短い42日となった理由は、電圧の下がり方が急激になったためです。
M5Stamp Picoの電圧モニタリンググラフ
一方、ESP-WROOM-02は予測日数が9月19日時点で4ヶ月を超える130日となっていてとんでもない値になっています。
これは、M5Stamp Picoとは逆でほとんど電圧モニタリング値が下がらなくなっているためで、最近はあり得ないことに少し上がっていることが影響しているようです。
ESP-WROOM-02の電圧モニタリンググラフ
ものいいがつく
M5Stamp Picoで使用していた電池ボックスを回収してテスターで電圧を測ったらたったの0.93Vしかなかったため、電池単体で電圧を測り直してみたら片方の電池の電圧が測定できなくなっていました。
後半の急速な電圧低下の原因は電池に起因していた可能性があるため、勝負にものいいがついた状態となってしまいました。
後日談
回路が露出した状態での窓枠への設置は「仮設」の予定でしたが、なんとお盆に東京に襲来した台風をしのいでしまいました...。この勝負の勝者は壊れるまで窓枠に居続けることになりそうです。
回路図とプログラムは次の記事に書きました。