ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ

 先に断っておきますが、今回の Tips は私の発見じゃなくて、Keynee さんから伝授して頂いた技 です。


 人様の手柄を自分のことのように書くのは忍びないのですが、ESP32 で遊ぼうとしている人、全員に知らしめないといけないという使命感が沸いてきましたため、公益!?のため恥を忍んで記事にさせて頂く次第であります。
アフェリエイトなし、(今年になって)広告も排除したブログなので許してください!


 電池でテスト(最初の実験その続き)を通して、公称電源電圧 2.2V〜 は嘘くさい、みたいなニュアンス気味に書いてしまったのですが、それは使い方を極めていなかっただけでした。


http://dl.ftrans.etr.jp/?2812c4dbd5334af4924830d1be9fc9516b4eecf3.png


 電池2本で運用の方は、40MHz でコンパイルしましょう!


Keyneeさん曰く

自分のところでは、Flash Frequency=40MHzにすれば 2.05VまでSNTPサンプルが動きましたよ。
SPI FlashからのReadはこの電圧が下限っぽいです。
キャッシュ内で動作できるようなプログラムなら、2.05V以上で起動後1.55Vまで電圧落としてもHaltせずに動作し続けます。

 NiMH の終止電圧は 1V(2本で2V)ほどなので、1.55V まで搾り取る必要もなく、とりあえず 2V まで粘ることが出来れば文句の一つも出ないというものです!!


http://dl.ftrans.etr.jp/?04bda2d9249847bcbd273d3daa513985f8c4d8e0.png
 充電し切れていない NiMH×2 を使ってテストしてみた結果が左です。


 1.93V(就寝していて実測はしてないが、たぶん2.00〜2.05V くらいと思われ)付近からシリアル出力も怪しくなり、1.90V を割り込んだところでフリーズ


 1秒おきに電圧値を出力させていたのですが、2.00→1.93V の変化は1分もかかってません。


 成り行き任せに挙動不審のまま終わせると Deep Sleep が効かず大電流のままとなるので

 if(voltage < 2.00)    // 40MHz
  {
    Serial.println("good night!");
//  必要に応じて
//  esp_deep_sleep_enable_timer_wakeup(30 * 60 * 1000 * 1000);
    esp_deep_sleep_start();
  }

という風で、制御できるうちに hibernation mode を発動させて、4μAモードに移行させたほうが安心かと思います。


 80MHz と比較して低電圧域の粘りが凄い 40MHz ですが、普段の消費電力も下がるのか?と気になりますが、電測してシリアル出力するだけのショボいサンプルだからかもしれませんけど

40MHz 80MHz
http://dl.ftrans.etr.jp/?40f7453ae17c42e2b534e52a6a7042c2468ded1e.jpg http://dl.ftrans.etr.jp/?092279442be6433a97012f999bd9306e08dc9225.jpg

 有為な違いはなし、という結論になりました。
(どちらの場合でも数値は動くんですが、1分ほど眺めた感じでは、80MHz のほうが精々 +0.5mA までかな?って程度)


 このクロックは外付けメモリーとのバスクロックで、読み書きが遅くなるだけで処理速度に影響するわけじゃないと思うので、積極的に 40MHz を使っていっていいと思います。


 では次回こそ、「自発的な再起動を諦める」 ことで得られる 1μA に満たない究極の過放電防止策を。。


(追記)2017/03/02
 究極の過放電防止策を記事にしました。
 ESP32 電源電圧を自己測定して過放電防止 (後編) をどうぞ