技適対応のカメラOV2640付きESP32-WROVERボードを発見...(ん?技適番号、該当ない?)、とりあえずライブカメラを自作してみた話。
技適がなくて残念だったESP32-CAMとほぼ同額程度というのが、また嬉しいところ。
SDカードスロットはないものの、自身は、なんちゃらカメラ上のSDカード機能はむしろ、嬉しくなく、なんなら、例えば、サーバ上のPythonとOpenCVなどでカメラ映像のパスから各種加工・処理及びNASサーバ上への保存などの方が望ましいと思っているので痛くもありませんが。
と思いきや、リンク先に追記の通り、このカメラ付きESP32-WROVER-DEVボードは、標準ESP32ボードの技適番号が刻印されたものでした...。
そこで送料込みで価格は倍以上も、自作予定の実用品用として今度こそと技適番号201-220052が刻印されているカメラ付きESP32-S3-WROOM-1開発ボードを購入。
というわけでOV2640付きESP32-WROVERボード含め、SDカードやSPIFFSに保存ではなく、自作の見守り・防犯カメラにおいては、複数カメラ表示・管理、モーション検知機能などイベント監視エリア指定や各種イベントに応じた保存機能などもある超高機能な監視カメラシステムZoneMinderを使っているので、これによる機能か、カメラサーバ上のPython/OpenCVでストリーム映像/画像の表示・保存などのようにしてみようかと。
自作と言ってもハード的には電源をつなげただけ、スケッチもサンプルスケッチをちょっといじって加工しただけ、ライブなのでスリープもなく、他にセンサーも使っていませんが。
ESP32-WROVERボードは、無線LANルータの外部アンテナがあったので、そこにUSBケーブル部を100均のコードクリップ小で留めただけ。
スリープしないのでランニングコストはともかく、イニシャルコストは安価なので外から、家でも視界にない自作スマート家電の稼働確認とかに使ってもいいかなと。
スマート家電と併せてですが、無線LANルータ(アクセスポイント)機器の対応台数上限以内なら、いくつでも設置できるので。
今回使った材料と準備、プログラムのアップ、実行、使えたUSB充電器情報などについては、基本、ESP32-WROVER-DEV動作確認の通り。
今回、USB充電器とUSBケーブルは100均のものを使用、5V/3A、5V/2.1A、5V/2Aなどいくつか試しましたが、ダイソーの昔あったキューブ型含め、5V/1Aでもいけたので、とりあえず、これを使いました。
様子を見て必要なら、交換しますが。
AliExpressならOV2640カメラ付きESP32-WROVERが700〜800円、100円ショップでUSB充電器とUSBケーブル220〜550円と電源込みでも1つ1000円ちょい。
気軽に導入できちゃいますが、ネットにもつながるカメラだけにくれぐれもプライバシーには十分注意しましょう。
今回、Arduino IDEサンプルスケッチCameraWebServerをまるごとコピーし、ベースにしました。
Androidデバイスからも操作するので固定IPのみ、mDNSと併用は迷っており、容量的にOTAは無理っぽいのでArduinoOTA(無線アップロード)は使えません。
というわけでSSID/PASSPHRASEを適宜編集、[#define CAMERA_MODEL_WROVER_KIT]行を有効にしただけなのでスケッチは省きます。
尚、ボード設定は、[ESP32 Wrover Module]、Partition Schemeに[Huge APP(3MB No OTA/1MB SPIFFS)]を選択しただけです。
そのままだとブラウザでアクセス時、メニューは表示される一方、映像は表示されておらず、[Start Stream]ボタン押下で映像が表示されるようになっています。
ここでは、ESP32-CAMの時と同様、URLアクセス時にカメラ映像を表示しつつ、メニューは隠しておくことにしました。
そのためには、CSS/JavaScript込みHTMLファイルを編集、gzip、xxd -i src > camera_index.hし、他ファイルを編集するのも面倒なのでサンプルスケッチにあるcamera_index.hを開いて名前を合わせます。
HTMLファイルについては、このようにgzipしたものをCヘッダファイル形式としたcamera_index.hはありますが、テキストエディタで開いて普通に読めるものは、CameraWebServerのスケッチフォルダにはありません。
よって必要箇所を変更したサンプルスケッチを一度アップロード、シリアルモニタでIPアドレスを確認、ブラウザでアクセス、画面を右クリックして[view page source]とか、[ページのソースを表示]といったメニューで表示させ、コピーするとよいでしょう。
変更箇所については、今回、JavaScriptの最終行である"})"行の前行でstartStream()をコール、HTMLソースの[<input type="checkbox" id="nav-toggle-cb" checked="checked">]の[ checked="checked"]を外しただけです。
後者については、CSSでid値nav-toggle-cbに対して(#nav-toggle-cb{}内で)display: hidden;とすることで同じことができます。
このOV2640付きESP32-WROVERボード、起動後、最初に一度、ボード上のリセットボタンを押さないとアドレスにアクセスしても映像が表示されませんでした。
スリープもせず、延々とライブしている分には、最初の1回なんで運用でどうにでもなるんですが、スリープを使いたい場合などは困るケースが出てきます。
そこで原因を探る中、アクセス時のブラウザ上の挙動を、しばらく観察してみるとサーバの準備はできているのにカメラの起動に失敗している模様であることが判明。
対策としてCameraWebServer.inoにもある[esp_err_t err = esp_camera_init(&config);]の戻り値判定[if (err != ESP_OK) {}]内にESP32のソフトウェアリセット[ESP.restart()]を追記してあげることで初回ボード上のハードウェアリセットを回避できることがわかりました。
電源投入時については、ESP32のソフトウェアリセット[ESP.restart()]では回避できておらず、ボード上のボタン押下によるハードウェアリセットが必要でした...。