ブログ/こばさんの wakwak 山歩き Twitter

2017-02-03 ESP-WROOM-32 (ESP32) 電池編

ESP-WROOM-32 (ESP32) 電池

| 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 でコンパイルせよ をどうぞ。

sakahoshisakahoshi 2018/04/12 23:59 こばさん

ESP32を電池で動かす方法を探していた所、こちらの記事で接続の仕方が分かりました。
電子工作を始めたばかりで、回路図が少し分かる程度なのですが、ボタン電池で同様の事ができずに困っております。
コンビニで市販されているCR2032(3V)を使用したのですが、通電はしているもののwifi接続などが機能しておりません。
単3電池を直列に繋いだ際の動作は確認しているため、電源が原因と考えています。

調べて見た所、以下の質問と同様の事象だと考えているのですが、対応方法をご存じでしたらご教示いただけないでしょうか。
https://esp32.com/viewtopic.php?t=975

よろしくお願いいたします。

こばさんこばさん 2018/04/13 07:45 おはようございます。
CR2012で駆動させようとは酔狂ですねぇ・・・
ところで何個かパラるんじゃなくて1個ですよね?

あれは内部抵抗が10Ωちょっとあって、0.1A を引いただけでも電圧降下が 1V 超えます。
規格上の標準電流は 0.2mA でして、無理させて10倍引いたところで 2mA が精々
とてもじゃないですが、単体では ESP32 が要求する 100〜200mA は賄えません。

スーパーキャパシタと呼ばれる巨大なコンデンサを CR2012 との間に付けて、かつキャパシタの充電が完了するまでは起動しないよう EN ピンを遅延させれば、なんとか起動&短時間の動作は可能でしょうけど、さっさと処理を終えてディープスリープに入らないとキャパシタの電池が尽きてしまいます。

常用は逆立ちしても不可能で、精々できても間欠動作までですけど・・

sakahoshisakahoshi 2018/04/13 09:11 早速のご回答ありがとうございます。
同じ3Vでも電池の種類で耐えられる負荷が違うんですね。。。

ご想像の通り1個で動かすつもりでした。
落し物タグのようなものを作ろうとしており、
ボタン・抵抗・電池・ESP32のみで部品数・体積・値段を最小にしたいと考えています。

乾電池相当の出力のボタン電池など、乾電池2個よりも体積を小さくする方法はないでしょうか。
よろしくお願いいたします。

こばさんこばさん 2018/04/14 10:28 なんか手段と目的が入れ替わっちゃってる気がしないでもないですが、ESP32 は超オーバースペックすぎる気がします。
落とし物タグと称するものが、どういう使われ方をするのか分かりませんが、ESP32だったら単4×2でも1日もたないし・・・

BLE系なタグとか、RFIDとか、そっち系を探された方がいいと思います。

sakahoshisakahoshi 2018/04/15 03:11 なるほど、そうなんですね。。。

素人質問にも丁寧に回答くださりありがとうございます。
基礎知識の勉強もしつつ、アドバイス通りに別の方向で探してみたいと思います。

改めてありがとうございます。