2019年6月22日土曜日

ESP32-CAM単体でWifi設定できるようにしてみた

前回技適対応にしたESP32-CAMですが、サンプルスケッチそのままだとSSIDとパスワードを変更するたびに書き換えなかったりしないといけなかったり少し不便なのでWiFiマネージャーを使用して少し便利にしてみた。

まずWiFiマネージャーっていうのはESP-WROOM-32などのWifi搭載マイコンで家のWifiに接続する際にSSIDとパスワードをスマホなどから設定できるようにできるライブラリ。仕組み的にはステーションモードで接続できなかった場合は自分自身がAPモードで立ち上がってWebサーバを立て、そこにスマホなどでWifi接続してSSIDとパスワードを設定できる。一旦設定すればあとは自動で家のWifiに接続してくれるようになる。接続できなくなると自動的にAPモードで立ち上がってまた設定できるようになるというすぐれもの。

ライブラリ自体は何種類かあるようだけど今回はAsyncに対応しているESPAsyncWiFiManagerを使用させてもらった。このライブラリを動作させるために必要なライブラリもあるので3つ入れる必要があった。

ESPAsyncWiFiManager
ESPAsyncWebServer
AsyncTCP

そんでもってCameraWebServerサンプルをベースに変更を加えていく。
ついでにmDNSにも対応してみた。
主に変更するのはスケッチの上の方なので変更する付近のみ紹介。(コピペする場合はサンプルを開いて相当する箇所に変更箇所のみ上書きしないと動かない)

#include "esp_camera.h"
#include <WiFi.h>
#include <ESPmDNS.h>//追加
#include <ESPAsyncWebServer.h>//追加
#include <ESPAsyncWiFiManager.h>//追加
AsyncWebServer server(80);//追加
DNSServer dns;//追加

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM  //コメントアウト
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM //コメント外す
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM

#include "camera_pins.h"

//const char* ssid = "*********"; //コメントアウト
//const char* password = "*********"; //コメントアウト

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  AsyncWiFiManager wifiManager(&server,&dns);//追加
  wifiManager.autoConnect("ESP32-CAM");//追加

中途半端なところで切ってるけど上の方はこんな感じで編集。
あとは下の方でWiFi.begin(ssid, password);してるところを変更。

  //WiFi.begin(ssid, password);//コメントアウト
  WiFi.begin();//追加
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  MDNS.begin("cam");//追加

これで完成。

あとはこれを書き込むとWiFiの設定がされていない場合はESP32-CAMというWifiネットワークが作成されるのでそれにスマホからアクセスして、http://192.168.4.1を開いて設定すればOK。ライブラリにはCaptive Portal機能も埋め込まれているのでiPhoneなどの対応機種であればAPに接続して少しすると自動で設定画面が開くはず。あとはSSIDとパスワードを設定画面から設定すれば完了である。

あとは家のWifiに接続されてからはmDNSが動くのでhttp://cam.localにアクセスすればmDNS対応(Windows 10やiOS)であればIPアドレスを調べる必要がないので便利。Androidの場合は.Local FinderとかでmDNSからIPアドレスを調べられるので便利かも?
エラーコード500が出る場合はESP32-CAMを一旦再起動すると良さそう…多分これはESPAsyncWiFiManagerのバグ?で初回設定時にポートが閉じられていなさそう。

とりあえずこのレベルでも結構使いやすくなったのであとはUPnPとかでポートも自動で開けられたりDDNSに自動で登録できるようにすれば完璧かな…

ちなみにESP-WROOM-32内に保存されたSSIDとパスワードを消去するときはsetup直下とかで一旦以下の2行を実行すれば良いらしい。(デバッグとかでよく使った…

WiFi.mode(WIFI_STA);
WiFi.disconnect(true,true);

一旦WiFiマネージャーで設定完了してしまうと勝手につながってWiFiマネージャーのテストができなくなってしまったときに多用した…

そういや小さいケースが欲しかったけどタカチとかのケースで基板ピッタリのサイズが無かったので設計してみた。電源はmicroUSBから取れるようにしてみた。

ESP32-CAM ケース
ケースに入れることによってハンドリングがしやすくなった反面、ファームの書き換えが面倒に。一応折れないギリギリでスナップフィットにしてみたのでかなり小型化できたと思う。
micro USBの穴とmicroSDの穴が開いてる。結構ぎりぎり突っ込んだのでmicro USB基板はESP-WROOM-32のシールドの上に乗ってる感じ。カプトンテープで一応絶縁しておいたけど。

0 件のコメント:

コメントを投稿