ESP-WROOM-32 (ESP32) 電池

 注目仕様のひとつに、電源電圧 2.2V〜 という項があります。
 最大電圧が 〜3.6V なのでリチウムイオン電池との相性は悪く、誰が見ても「どうぞ乾電池2つで遊んで下さいませ」っていう設計者の強い意図を感じずにはいられません。


 その意図を汲み取ったうえで究極の回路図を。


http://dl.ftrans.etr.jp/?c11da1a40d8745f4a1a28904f878cc937b1232b2.png
※これではプログラム書き込めません。書き込み済みの ESP32 を動かす前提です
※書き込むときの回路図例は 準備編 をどうぞ


 ESP8266 と違って、必須抵抗類が内蔵されているからね
 リセットボタンが必要なければ、ここまで簡略化させることができます。
(複数ある GND は内部で繋がっているようで、結線は省略できるぽい)


http://dl.ftrans.etr.jp/?efcfaad7a3324ddb816d8478c4dd218dd5db7d91.jpg


 秋月の 単3NiMH充電池 2本で試したところ、バッチリ動いちゃいました!
 それも、ただ通電させている状態じゃなくて。

#include <WiFi.h> 

const char *ssid = "<Set Your SSID>";
const char *pass = "<Set Your Password>";
const char *sendWriteKey = "<Set Your WriteKey>";

const char *sendServer = "api.logoole.etr.jp";

void send() {
    WiFiClient  client;
    Serial.print("connecting to ");
    Serial.println(sendServer);
    
    if(client.connect(sendServer, 80))  {
      static int SEQ = 0;
      String postData = "SEQ=" + (String)SEQ;

      String postMethod;
      postMethod.concat("POST /");
      postMethod.concat(sendWriteKey);
      postMethod.concat(".post HTTP/1.1\n");
      postMethod.concat("Host: ");
      postMethod.concat(sendServer);
      postMethod.concat("\n");
      postMethod.concat("Content-Type: application/x-www-form-urlencoded");
      postMethod.concat("\n");
      postMethod.concat("Content-Length: ");
      postMethod.concat(postData.length());
      postMethod.concat("\n\n");

      postMethod.concat(postData);
      postMethod.concat("\n\n");

      client.print(postMethod);
      Serial.print(" ");
      Serial.println(postData);
      
      SEQ++;
    }
}

void setup() {
  // put your setup code here, to run once: 
  Serial.begin(9600, SERIAL_8N1);

  Serial.print("WiFi connecting to ");
  Serial.print(ssid);
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected");
  Serial.print(" IP:");
  Serial.println(WiFi.localIP());
}

void loop() {
  // put your main code here, to run repeatedly:
  send();
  delay(1000);
}

 起動直後に WiFi 接続したうえで、1秒おきに HTTP POST(TCP送信) し続けるという、実運用では考えにくい過酷な条件を強いてみましたが、途中でリセットかかることなく安定して動作し続けております。


 昨日は夜遅く(というか今日の未明)まで弄っていて睡眠不足で、もう限界なので今日は寝ます。
 計算上は明日の未明まで動き続けると思うんですが動かしっぱなしで寝るので、気になる方は私の代わりに ログールの DataTable を見て 確認してくださいな。


 それでは、おすみなさい〜


(追記)2017/02/04 08:00
 おはようございます。
 昨夜からの、まだ動いてますね。


(追記)2017/02/04 09:30
 いま見たら9時頃に息絶えていたみたいです。
 37961回(0スタートなのでSEQの最大値に+1してる) POST できたみたいなので10時間30分くらい。


 電池電圧は監視してませんでしたが、取り外しての開放電圧は 2.38V くらい。
 負荷を取り外して電圧が復元しただけで実容量は殆ど残ってないと思いますが、NiMH電池の寿命に影響するほどの「電気の搾り取り」はやってない予感がします。
(後悔:取り外す前にも電圧測定しておくべきだった)


 あえて外部で過放電防止する必要が要らないかも!


 Bluetooth を使う予定なくても、乾電池2本で直結運用できるという利点だけで ESP8266 じゃなく ESP32 を選択する価値もあるように思います。


 これから 散髪 and/or 献血 に行ってきますが、帰ってきたら Bluetooth で遊んでみようかな
 また続き書きますねー


(追記)2017/02/04 14:00
 送信が途絶えたときの、負荷を切り離す前の電圧(NiMHから電気を搾り取りすぎてないか)を測り損ねたため 違う API キーを取得して 再測定をすることにしました。
http://api.logoole.etr.jp/CmeyBttxh0WAJzqOhgJuQw/datatable.html


(追記)2017/02/04 23:00
 気がつかなかったのですが、2017/02/04 19:06:35 に WiFi が切れたか何かで送信が停止してました。
 最後の SEQ は 17648 で、OFF/ON し直したら、また動き始めました。
 送信エラーのチェック(エラー時の再接続処理とか)してないし、きっと私がテキトーに作ったサンプルのせいでしょう。
 POST は失敗してましたが、通電状態を維持していたので電気は食ってます。
 よって SEQ の値(持続時間)には意味がなくなりました。


(追記)2017/02/05 08:30
 当然にして止まっていたので、取り外す前に電圧測定してみましたら、なんと 1.46V!
 1本あたりじゃなくて、2直列で1.46V!!
(もっと放置しておいたら、もっと下がると思われ)


 だめですやん


 NiMH 充電池を使うならば
 外部で過放電防止しないとあかん!!


 以上で電池を使った実験は終了としまーす。


(追記)2017/02/11
 それほどハードなことはやってないのですが、実運用中にあり得る程度の「低電圧実験」中に WiFi が死亡しました。
 2.2V〜 を謳っているものの、WiFi 使用中はもう少し高い電圧が必要で、電圧が下がると漏れなくフリーズするぽいことを発見したのですが、我々が触れられないところで動いている内部のファームウェアが動作中にバックグラウンドで WiFi 関係の何かをどっかに書き込んでいるぽく、フリーズのタイミング次第で不整合が起きて壊れた気がします。
(すべて憶測ではありますがハード的な故障ではなく、ソフト的な原因での故障状態と思う)


 そこら辺の顛末を 低電圧で遊んでたら ESP32 の WiFi が死亡 で記事にしました。


(追記)2017/02/26
 電源電圧を自己測定し、ソフト的に過放電を防止する仕組みについて記事を書きました。
 わずか 4μA しか消費しない Hibernation mode と呼ばれる Deep Sleep の究極モードを使って過放電を最小限に抑えます。
 
 詳しくは こちら をどうぞ


(追記)2017/02/28
 2.2V 付近で動かないと嘆きましたが、それはデフォルトのまま 80MHz でコンパイルしたせいで、40MHz 指定でコンパイルし直すと 2.0V 近くでもシッキリ動いてくれました。
 電池で運用する人は、40MHz でコンパイルせよ をどうぞ。