低電圧で遊んでたら ESP32 の WiFi が死亡

 乾電池2本で動くことを確認した ものの、電気を搾り取るらしく、NiMH 充電池と組み合わせるにあたり過放電防止が必要と分かったので、どの程度のカットオフ電圧にしたら良いか低電圧域で動作実験をしていました。
 その過程で不幸が。。。


 仕様的には 2.2V〜 というはずなのですが、どうも 2.2V に達するより以前にフリーズするぽいことを突き止めました。
 可変電源を使って 電池編で使ったサンプルソース を動かしつつ色々試してみたところ

  • 起動時には 2.7V くらいないと起動できない(ただちに Halt)
  • 2.4V 前後を下回るとフリーズ
  • 2.2V〜 ってのは無線を使わない場合のみ限定?

という風。(WiFiを使う前提)


 法則が分かってきたところで、今度は再起しないようになっちまった。
 3.3V を投入しても起動せず。


 シリアルには 115,200bps で以下のとおり

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0008,len:8
load:0x3fff0010,len:1760
load:0x40078000,len:6668
load:0x40080000,len:252
entry 0x40080034
abort() was called at PC 0x401006be
Guru Meditation Error: Core  0 panic'ed (abort)

Backtrace: 0x4000beb4:0x3ffc96c0 0x400835f7:0x3ffc96e0 0x400f6c63:0x3ffc9700 0x400f7858:0x3ffc9720 0x400f7932:0x3ffc9790 0x400f7fe8:0x3ffc97f0 0x400f681c:0x3ffc9850 0x400f64da:0x3ffc98a0 0x400f6526:0x3ffc98c0 0x400d21bf:0x3ffc98e0 0x400d1086:0x3ffc9900 0x400d224c:0x3ffc9930 0x40100722:0x3ffc9950 0x400d9c0d:0x3ffc9980

CPU halted.

 完璧に壊れた?と思いきや、そうでもないみたい。


 動くソース

void setup() {
  Serial.begin(115200, SERIAL_8N1);
}

void loop() {
  static int SEQ = 0;
  Serial.println(SEQ++);
}

 CPU halted になるソース

#include <WiFi.h>

void setup() {
  Serial.begin(115200, SERIAL_8N1);
}

void loop() {
  static int SEQ = 0;
  Serial.println(SEQ++);
}

 WiFi.h を include するだけで、漏れなく halt してしまう ESP32 に成り果ててしまいました(涙)
 やったことは、2.2〜2.8V 付近の電圧で起動と停止を繰り返しただけ。(それぞれ数秒ずつ置いて)


 電源の逆接とかハード的なミスならば自業自得で諦めますが、仕様範囲内の電圧で起動しなくなるってのはどうよ。
 動作中に電圧を弄ったとは言え、Δ0.1V/秒 くらいの、超ゆっくりな操作だったのに。
(ハードな試験をしていたわけでもなく、実運用中にも起きえる程度の動作条件下で壊れた)


 とりあえず試してみたこと

  • 0x00001000〜 bootloader.bin
  • 0x00008000〜 partitions_singleapp.bin
  • 0x3FF90000〜 rom1.bin
  • 0x40000000〜 rom.bin

を焼き直してみたものの全く変化なし。
 ファーム的なところじゃなくて、WiFiのパラメータが壊れた?
(動作中に、どこか書き換えていて、そのタイミング悪いところでフリーズして不整合発生?)


 「動作中に書き換わる部分」を含めて、完全に工場出荷時に戻す方法はないものかい
 仕方ないので予備を開封するか


(追記)
 自分の備忘

#include "esp_wifi.h"

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

  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  Serial.println((String)cfg.rx_buf_num);
  Serial.println((String)esp_wifi_init(&cfg));
}

 esp_wifi_init() が 0x1101 で失敗のステータス。
 esp_err.h 内には 0x1101 に該当するエラーがないが、0x101 ESP_ERR_NO_MEM の派生か?と思いきや、壊れていない別の ESP32 でも 0x1101 を吐く模様


(追記)2017/02/25
 この1号機とは状態が違うのですが、3号機と呼んでる個体も WiFi が死亡しました。
 ハード的な故障ではなくソフト的な不整合が原因ぽい部分は一緒なのですが、ほんと壊れやすい気がします。
 愚痴しか書いてませんが、続くは こちら をどうぞ


(追記)2017/02/28
 NiMH×2 程度の低電圧で動かすときには、40MHz でコンパイルしたほうがいいみたいです。
(「したほうがいい」というよりも「するべし」と言い換えた方が良いレベルで)


 ESP32に対してSPIで繋がっている外部フラッシュメモリが、そのチップの仕様を超えた低電圧で無理矢理に動作させられているぽく、40MHz にクロックダウンさせることで低電圧の粘りが増して2.2Vでもフリーズしなくなりました。
(相次いで無線が死んだのは、デフォルトのまま80MHzで低電圧駆動させていたことが原因かもしれない)


 詳しくは こちら からどうぞ