ESP32を安定稼働(安定Wi-Fi接続)させるには
ESP32が定期的に動かなくなる!
「Wi-Fi経由で何か制御する電子工作をしたい」という時に、最もお手軽なのがESP32ではないかと思います。USB接続して数行のコードを書くだけで、WEBサーバーとして動作させることができます。
そのため我が家でも、シャッター制御の自動化などにESP32を活用しています。ところが、定期的にWi-Fiルーターと接続が切れて、電源をOFF→ONにしないと復帰しないという謎の現象が起こり、数か月悩まされました。
これを解決できた一番のポイントは、『安い(古い)ESP32は買わないこと』でした。
安定接続に必要なポイント
ポイントを1つずつ詳しくみていきます。
① 十分な電流を確保する
これは当たり前ですが、ESP32は最大で数百mAの電流が流れるそうなので、それに耐えられる電源を確保する必要があります。
ただ、問題になるのは電池数本で~とかの場合だけで、モバイルバッテリーやコンセントから給電という場合は、特に気にしないで大丈夫かと思います。
② WDT(ウォッチドッグタイマー)を活用する
どこで暴走するか分からないので、WDTを使います。WDTについて簡単に解説すると「自動的にカウントアップするタイマー(WDT=番犬タイマー)があって、カウンターがオーバーフローするとハードウェアリセットをかけるというものです。プログラムから定期的にタイマーのカウントをゼロにすることで、プログラムの正常動作中はリセットがかからない=暴走や意図しない動きをしたら再起動できる」という仕組みです。
WDTは、Arduinoでは以下のようなコードで利用できます。
#include "esp_task_wdt.h" // WDT用ライブラリ読み込み
void setup() {
// WDTの有効化
esp_task_wdt_config_t wdt_config = {
.timeout_ms = 180000, // 180秒でリセット ※適宜変える
.trigger_panic = true
};
esp_task_wdt_init(&wdt_config);
esp_task_wdt_add(NULL);
}
void loop() {
// WDTのカウントをゼロにする
// ※これを処理が正常に動いていると判別できる個所に入れる
// 例えばループ処理内での Wi-Fi接続のチェック通過後の位置など
// これをコメントアウトすると、指定時間毎にリセットがかかるのを確認できる
esp_task_wdt_reset();
}
WDTを有効化して、Wi-Fi接続がうまくいっている間だけカウントをゼロにしておけば、暴走またはWi-Fi接続が切れた際にハードウェアリセットをかけて再起動してくれるので、これで問題なくなるハズ!だったのですが、それでも数週間に1度は完全停止して、電源OFF/ONする必要がありました。
③ 安い(古い)ESP32は買わないこと
これが1番の落とし穴でした。
ESP32の値段は大分安くて、Amazonだと2個 2,000円(1個当たり1,000円)ぐらいで購入できたりします。
ただ、ESP-WROOM-32と書かれているものは、バージョンが相当古いもので、現時点ではメーカー非推奨となっていました。新しいものでは、安定動作性が上がっているという記載もあるので、モジュールの不具合で停止していた可能性があります。ここを見ると、ESP-WROOM-32→32D→32Eとバージョンアップしているので、ESP-WROOM-32Eと書かれたモジュールが搭載されたものを買うようにしましょう。
私は秋月電子で購入しました。
秋月で買った開発ボードを使ったら、それまでの問題が嘘のように無くなり、数か月経っても電源を入れっぱなしで安定動作してくれるようになりました。(たまに、ルーターと接続できなくなって、WDTによる再起動処理は発生しているようですが、私の用途では問題ないレベルです)
最後に
我が家で安定動作しなかったのは、Wi-Fi接続端末が多いとか、ノイズの発生がある場所だったとか、ルーター(HG8045Q)との相性が悪かったとか、特有の原因があった可能性もあります。
ただ、同じような現象にお悩みの方は、今回の内容を参考にしていただければと思います。