2022年6月18日土曜日

ESP32-CAMのWiFi自動再接続

 ESP32-CAM、お安いしバッテリつけてラジコンに乗せてFPVみたいにして遊ぶのも楽しいので、何人かの友人も使っているが(ESP-32S剥がすのも慣れた)WiFiルータを再起動すると自動で再接続してくれないのが不便なのでスケッチを修正してみた。

ベースのスケッチはマルチクライアント対応のものを使って、mDNSとSoftAP自動切り替え、SoftAP時のCaptivePortal、UPnPとかを盛り込んでいた。みんな色んな使い方しているので色々盛り込んだ感じ…
なんか問題あったときのファームウェアアップデートも面倒なのでOTAにも対応(ブラウザ上からbinファイルをアップロードする感じ)

本家のアップデートが止まっているようなので今回はついでにESP32 Arduino Core 2.0.4に対応させてみた。(そのままだと1.0.5か1.0.6じゃないとビルドできない)

バリエーションがあるんだけどいつもesp32-mjpeg-multiclient-espcam-driversの中のesp32-cam-rtosをベースに改良しているので、(いじっているのはinoファイルだけ)これで作業している前提でアップデート手順。

まずはこのフォルダ内の"esp32-cam-rtos.ino"ファイルと"camera_pins.h"の2つのファイルを残して他のファイルを削除。これ以外のファイルはESP32 Camera Driverなので今回はこれをアップデートするため、削除しておく感じ。

ESP32 Camera Driverから最新のカメラドライバをダウンロードしてくる。今回は2.0.1のZIPを使用した。ZIPをそのままエクスプローラで開いて"examples"フォルダと"test"フォルダを削除する。続いてesp32-camera-master/targetの中のesp32s2とesp32s3フォルダを削除。そんでもってこのZIPファイルをフォルダ構成なしで展開する。今回はWinRARを使って高度な設定でパスを無視にチェックを入れて解答することでいけた。

あとは解凍したファイルを"esp32-cam-rtos.ino"ファイルと"camera_pins.h"の2つのファイルと一緒のディレクトリにコピーしてビルドするだけ。これでArduino Core ESP32 2.0.4でもエラーなしでコンパイルすることができるようになった。

しかしArduino Core 2.0.4とCamera Driver 2.0.1の組み合わせだとメモリ不足でうまく起動しなくなってしまったのでxTaskCreatePinnedToCoreでマルチタスクを起動しているところの3箇所目、Start mainstreaming RTOS taskのスタックサイズを 2 * 1024 から 3 * 1024 に変更することでうまく動かすことができた。

とりあえずこれで最新の環境でビルドできるようになったところで、本題のWiFiのアクスポイントが再起動すると自動で再接続してくれない対策。おそらくESP32-CAMにかぎらず常時APに接続して運用しているESP32搭載デバイスには使える手法かも。

方法は何種類かあると思うんだけど、定期的にWiFi.status()でWiFiの接続情報を確認して再接続する方法と、WiFiEventのWiFi切断されたときのイベントを使用して再接続する方法があるらしい。今回はWiFiEventを使用してみた。

Arduino Core 2.0.xと1.0.xでちょっとイベント名が変わったりしているので注意かも。今回は2.0.4用。

まずはWiFi切断イベントがトリガされたときに読み込まれる関数を作成。

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  //digitalWrite(LED_BUILTIN, LOW);
  Serial.println("Disconnected from WiFi access point");
  Serial.print("WiFi lost connection. Reason: ");
  Serial.println(info.wifi_sta_disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin();
  //digitalWrite(LED_BUILTIN, HIGH);
}

これをスケッチの何処かに入れておく。
そんでもってsetupの何処かに

WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

を入れる。(1行)この行が読み込まれた瞬間にESP32のWiFi切断イベントが有効になるのでWiFi接続後とかがいいかも。APモードでもWiFiに繋がってないときはトリガされてしまったので、SoftAPで起動するときは有効にしないような感じにしておいた。

一応これでAPを再起動しても何度かイベントが発生してしまうけど問題なくWiFiに再接続することができた。

そういえばESP32-CAM、何台か購入していると基板の厚みが1.6と1.0があったり、RSTがピンヘッダに出ていたり、カメラの縦横が違かったり、カメラの画質も違うんだよねぇ…
カメラの画質に関してはレンズなのかねぇ(ただしレンズも互換性なかったりしている)
技適対応用のESP-WROOM-32Dもディスコンだし、ESP32-WROVER版とかあるとスッキリしていいんだけどねぇ


0 件のコメント:

コメントを投稿