自宅留守番用の 監視カメラ が急遽必要になったので、3年前に購入して少し遊んだだけの ESP32-CAM を取り出し、製造元のEspressif社で用意されているCameraWebServerサンプルスケッチを Arduino IDE で焼いてみました。
ESP32-CAM
2020年当時RMB34程度で購入したこのESP-CAMも、2023年現在はRMB23前後まで値下がりしているようです。
搭載されているESP32-Sのメタルケースには技適表示はなく、
その下には、IPUS社のIPS6404LSQ 64Mbit PSRAMが実装されています(データシートはこちら)。
基板上にはPCBアンテナパターンと共にIPXコネクタもあり、どちらを使うかはその付近の抵抗R1(PCBアンテナ)・R2(外部アンテナ)どちらを実装するかで区別。
付属のカメラは、OmniVision社のOV2640 2Mピクセルカメラで、その仕様は以下の通り。
- 1,600×1,200px
- 200万画素
- 1/4″センサ
- 66°標準画角レンズ
ちなみに、まっさらの状態で通電させたときのシリアル出力は、このような感じでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:5656 load:0x40078000,len:0 ho 12 tail 0 room 4 load:0x40078000,len:13920 entry 0x40078fd8 I (30) boot: ESP-IDF v3.1-dev-463-g77eae33a-dirty 2nd stage bootloader I (30) boot: compile time 10:52:13 I (32) boot: Enabling RNG early entropy source... I (37) boot: SPI Speed : 40MHz I (41) boot: SPI Mode : DIO I (45) boot: SPI Flash Size : 4MB I (49) boot: Partition Table: I (53) boot: ## Label Usage Type ST Offset Length I (60) boot: 0 nvs WiFi data 01 02 00009000 00004000 I (68) boot: 1 otadata OTA data 01 00 0000d000 00002000 I (75) boot: 2 phy_init RF data 01 01 0000f000 00001000 I (83) boot: 3 factory factory app 00 00 00010000 00100000 I (90) boot: 4 ota_0 OTA app 00 10 00110000 00100000 I (97) boot: 5 ota_1 OTA app 00 11 00210000 00100000 I (105) boot: End of partition table I (109) boot: Defaulting to factory image I (114) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x17178 ( 94584) map I (156) esp_image: segment 1: paddr=0x000271a0 vaddr=0x3ffb0000 size=0x031d8 ( 12760) load I (161) esp_image: segment 2: paddr=0x0002a380 vaddr=0x40080000 size=0x00400 ( 1024) load I (163) esp_image: segment 3: paddr=0x0002a788 vaddr=0x40080400 size=0x05888 ( 22664) load I (181) esp_image: segment 4: paddr=0x00030018 vaddr=0x400d0018 size=0x6fcf0 (457968) map I (340) esp_image: segment 5: paddr=0x0009fd10 vaddr=0x40085c88 size=0x053e0 ( 21472) load I (349) esp_image: segment 6: paddr=0x000a50f8 vaddr=0x400c0000 size=0x00000 ( 0) load I (356) boot: Loaded app from partition at offset 0x10000 I (356) boot: Disabling RNG early entropy source... I (361) cpu_start: Pro cpu up. I (364) cpu_start: Starting app cpu, entry point is 0x4008122c I (356) cpu_start: App cpu up. I (375) heap_init: Initializing. RAM available for dynamic allocation: I (382) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM I (388) heap_init: At 3FFB9980 len 00026680 (153 KiB): DRAM I (394) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM I (400) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM I (407) heap_init: At 4008B068 len 00014F98 (83 KiB): IRAM I (413) cpu_start: Pro cpu start user code I (207) cpu_start: Starting scheduler on PRO CPU. I (0) cpu_start: Starting scheduler on APP CPU. I (249) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=8 I (249) I2S: PLL_D2: Req RATE: 78125, real rate: 78125.000, BITS: 16, CLKM: 8, BCK: 8, MCLK: 20000000.000, SCLK: 2500000.000000, diva0 I (259) camera_xclk: PIN_CTRL before:7fff I (259) camera_xclk: PIN_CTRL after:7fff I (4329) camera_demo: Detected OV2640 camera, using JPEG format I (4549) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE I (4549) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE |
Arduino IDE ボードマネージャの更新
Arduino IDEは3年前に環境設定で、Espressif社のESP32用ボードマネージャURLを追加済みでした(ver.1.8.12を使用)。
1 |
https://dl.espressif.com/dl/package_esp32_index.json |
作業前に ツール の現在のボード名から、ボードマネージャを開いて最新の状態へ更新します。
ESP32 CAM WEBSERVER サンプルスケッチを編集
Arduino IDEのメニューから、Expressif ESP32 CameraWebServerのスケッチ例を開きます。
編集事項は以下の通り、カメラモデルとWiFi接続情報のみです。
1 2 3 4 5 6 7 8 9 10 11 12 |
// =================== // Select camera model // =================== //#define CAMERA_MODEL_ESP_EYE // Has PSRAM #define CAMERA_MODEL_AI_THINKER // Has PSRAM // =========================== // Enter your WiFi credentials // =========================== const char* hostname = "HOSTNAME"; const char* ssid = "SSID"; const char* password = "PASSPHRASE"; |
Arduino IDE ボードの書き込み設定
編集を終えたら、書き込みの前にボード設定を確認します。デフォルトではこの AI-Thinker ESP32-CAM になっているかも知れませんが、これで書き込むとストリーミング開始後、徐々に取りこぼしが発生して数分でフリーズしてしまいます(おそらくPSRAMを使っていない!?)。
そこで、より汎用性の高い ESP32Dev Module へ変更して、その下に表示されるオプションを細かく設定します。
書き込みサイズが2MBを少し超えてしまうので、Partition SchemeをHuge APPとしました。
スケッチの書き込み
GPIO0をGNDに落としてFlashモードにしたESP32-CAMが、USBシリアルコンバータを介してPCと繋いであることを確認したら、コンパイルの上、ボードへ書き込みます。
次のような状態になれば書き込み成功です。GPIO0をGNDに落としたジャンパを外し、ESP32-CAM上のRSTボタンを押して再起動させます。
ESP32-CAM始動
ESP32-CAM CameraWebserverのUIはこのようになっていて、映像に関する設定項目がずらりと並んでいます。
はじめは解像度 Resolution がQVGAなのでこれを高いものへ変更、 Quality は画像の圧縮率を意味するようで、数値が低いほど高品質な画像になる反面、データ量が増えるので電源供給やWiFi信号が貧弱な場合は、映像に横線ノイズが入ることも。
左下のAdovanced Settingsを開くと、この辺はかなりマイナーな項目が。
なお、上図のUIページの他、ストリームや静止画を直接取得するために、次のURLが用意されています。
1 2 3 4 5 6 7 8 |
操作) http://IPADDRESS/ ストリーム受信) http://IPADDRESS:81/stream 静止画取得) http://IPADDRESS/capture |
しばらく使ってみて気になったことをまとめてみると…
- 設定は再起動後残らない。
- 映像の上下反転や左右反転はあるが、90°回転が無い。
- WebUI上でボードを再起動させる術がない。
- WiFi接続情報を変えるには、焼き直すしかない。
HomeAssistant ダッシュボードへ静止画の簡易登録
以前、仮想マシンとして構築したHomeAssistantのダッシュボードに画像カードを作成し、カメラ静止画取得URLを登録してみました(あくまで簡易的なものなので、画像リフレッシュとかは無し)。
VLCメディアプレイヤーでストリーミング受信
設定は固まってからの普段の映像監視は、ブラウザよりもVLCメディアプレイヤーの方が便利。
VLCでネットワークストリームを開く際、そのURL欄に先ほどのストリーム受信URLをそのまま入れるとエラーになるので、末尾の stream 抜きで入力する必要があります。
動きがないと静止画かと不安になりますが、メディア情報の統計欄の数値が動いているので、確かにストリーミング映像でした。
今回はメーカー謹製サンプルスケッチを使いましたが、ネット上には様々な工夫をこらした改良版スケッチを、有志の方々が公開されているので、Arduino IDEの使い方を忘れないうちに試してみたいと思います。