技適対応 Wi-Fi カメラモジュール WT-ESP32-CAM で撮影してみる
ゴーヤのタイムラプス撮影をしようと思い立ち、WT-ESP32-CAM というカメラ付きマイコンモジュールを買ってみた。今回の内容は、以下のブログ記事を参考にしている。
製造元 Wireless-Tag 社の公式ページと、データシートは以下のとおり。
- WT-ESP32-CAM – One-stop solution provider for wireless modules
- http://www.wireless-tag.com/wp-content/uploads/2020/09/WT-ESP32-CAM-Datasheet_v1.1.0_EN.pdf
ちなみに、Amazon でも ESP32-CAM はいろいろ売っている(例)が、どれも技適に通っていない。技適対応でタイムラプス用途だと、M5Stack の ESP32 PSRAM Timer Camera X (OV3660) が初心者の自分には扱いやすそうだったが、どこのサイトでも品切れ・入荷未定だったので、WT-ESP32-CAM を使ってみることにした。
購入
AliExpress で 565 円。念のため 2 つ購入し、配送は AliExpress Standard Shipping(507 円)にした。しめて 1,638 円。
2 週間ほどで到着した。
組み立て
パッケージを開けると、以下の 3 つが入っている。
- WT-ESP23-CAM 本体
- カメラ(OV2640)
- 外付けアンテナ
カメラのケーブルを WT-ESP32-CAM 上のコネクタに接続。
付属の外付けアンテナは技適に通っていないので、秋月電子で売っているこちらアンテナの方を使う必要があるらしい。なるほど。
デモ用のプログラムでカメラ撮影してみる
WT-ESP32-CAM は、デモ用のプログラムが出荷時に書き込み済みなので、電源をつなげるだけでカメラ撮影を試すことができる。USB-シリアル変換モジュールを使って、PC と接続。
USB-シリアル | WT-ESP32-CAM | (上の写真では) |
---|---|---|
5V | 5V | 紫色 |
GND | GND | 青色 |
TXD | U0R | 緑色 |
RXD | U0T | 灰色 |
シリアルモニターを 115,200 baud に設定して接続すると、ログを確認することができる。基板左下の RST ボタンを押して再起動。
起動ログ
21:28:15.921 -> ⸮g⸮=⸮ҐL⸮⸮'⸮ҕSH؊⸮њ⸮e⸮ u⸮⸮⸮ʽ⸮⸮J⸮E⸮b⸮⸮:⸮ų³U⸮F⸮*⸮e1⸮ 21:28:15.921 -> ⸮=⸮⸮J#⸮⸮⸮V⸮ͩi⸮⸮ *E]⸮:⸮⸮Ս⸮⸮k⸮⸮⸮⸮⸮a0⸮\Eɶ'⸮A⸮ ⸮⸮.⸮⸮⸮⸮,⸮.zѲ⸮¸⸮⸮h⸮%⸮v⸮⸮a⸮i⸮_⸮.⸮⸮⸮⸮ ⸮[⸮՚T⸮q⸮,⸮;⸮⸮&k⸮1C!⸮⸮d⸮⸮m⸮⸮a0⸮⸮lY⸮⸮ ⸮⸮⸮d⸮⸮mf⸮,⸮ծ⸮⸮#⸮⸮i0⸮⸮0b⸮9K⸮⸮⸮⸮⸮!⸮⸮⸮⸮Q⸮⸮,⸮)K⸮⸮⸮j⸮Y⸮ɹ⸮x⸮⸮8⸮⸮SH⸮⸮a;⸮⸮+A⸮ӊ⸮⸮⸮њ⸮i⸮RնZ⸮⸮⸮⸮̣⸮⸮⸮⸮⸮ړ⸮+A⸮ʀ⸮⸮ѿ⸮⸮⸮⸮⸮ᩁr⸮Wk⸮˂1⸮⸮ž ⸮⸮⸮⸮Ť9⸮⸮A⸮)Wk⸮⸮K⸮⸮j5 21:28:15.961 -> [0;32mI (38) boot: ESP-IDF v4.0-276-g57a5a486f 2nd stage bootloader[0m 21:28:15.961 -> [0;32mI (38) boot: compile time 18:36:27[0m 21:28:15.961 -> [0;32mI (38) boot: Enabling RNG early entropy source...[0m 21:28:15.961 -> [0;32mI (44) qio_mode: Enabling default flash chip QIO[0m 21:28:15.961 -> [0;32mI (49) boot: SPI Speed : 80MHz[0m 21:28:16.116 -> [0;32mI (53) boot: SPI Mode : QIO[0m 21:28:16.116 -> [0;32mI (57) boot: SPI Flash Size : 4MB[0m 21:28:16.116 -> [0;32mI (61) boot: Partition Table:[0m 21:28:16.116 -> [0;32mI (65) boot: ## Label Usage Type ST Offset Length[0m 21:28:16.116 -> [0;32mI (72) boot: 0 factory factory app 00 00 00010000 003c0000[0m 21:28:16.116 -> [0;32mI (80) boot: 1 nvs WiFi data 01 02 003d0000 00004000[0m 21:28:16.116 -> [0;32mI (87) boot: End of partition table[0m 21:28:16.116 -> [0;32mI (91) boot_comm: chip revision: 1, min. application chip revision: 0[0m 21:28:16.116 -> [0;32mI (98) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x3010c (196876) map[0m 21:28:16.116 -> [0;32mI (160) esp_image: segment 1: paddr=0x00040134 vaddr=0x3ffb0000 size=0x041a8 ( 16808) load[0m 21:28:16.116 -> [0;32mI (166) esp_image: segment 2: paddr=0x000442e4 vaddr=0x40080000 size=0x00400 ( 1024) load[0m 21:28:16.116 -> [0;32mI (167) esp_image: segment 3: paddr=0x000446ec vaddr=0x40080400 size=0x0b924 ( 47396) load[0m 21:28:16.116 -> [0;32mI (191) esp_image: segment 4: paddr=0x00050018 vaddr=0x400d0018 size=0x86610 (550416) map[0m 21:28:16.245 -> [0;32mI (339) esp_image: segment 5: paddr=0x000d6630 vaddr=0x4008bd24 size=0x107e4 ( 67556) load[0m 21:28:16.315 -> [0;32mI (379) boot: Loaded app from partition at offset 0x10000[0m 21:28:16.315 -> [0;32mI (379) boot: Disabling RNG early entropy source...[0m 21:28:16.315 -> [0;32mI (380) psram: This chip is ESP32-D0WD[0m 21:28:16.315 -> [0;32mI (384) spiram: Found 64MBit SPI RAM device[0m 21:28:16.315 -> [0;32mI (389) spiram: SPI RAM mode: flash 80m sram 40m[0m 21:28:16.315 -> [0;32mI (394) spiram: PSRAM initialized, cache is in low/high (2-core) mode.[0m 21:28:16.315 -> [0;32mI (401) cpu_start: Pro cpu up.[0m 21:28:16.365 -> [0;32mI (405) cpu_start: Application information:[0m 21:28:16.365 -> [0;32mI (410) cpu_start: Project name: camera_web_server[0m 21:28:16.365 -> [0;32mI (416) cpu_start: App version: 2470e47[0m 21:28:16.365 -> [0;32mI (421) cpu_start: Compile time: Jun 23 2020 18:36:23[0m 21:28:16.365 -> [0;32mI (427) cpu_start: ELF file SHA256: 657db6d4b907e61e...[0m 21:28:16.365 -> [0;32mI (433) cpu_start: ESP-IDF: v4.0-276-g57a5a486f[0m 21:28:16.365 -> [0;32mI (439) cpu_start: Starting app cpu, entry point is 0x400814e4[0m 21:28:16.365 -> [0;32mI (0) cpu_start: App cpu up.[0m 21:28:17.238 -> [0;32mI (1329) spiram: SPI SRAM memory test OK[0m 21:28:17.238 -> [0;32mI (1329) heap_init: Initializing. RAM available for dynamic allocation:[0m 21:28:17.272 -> [0;32mI (1330) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM[0m 21:28:17.272 -> [0;32mI (1336) heap_init: At 3FFBD660 len 000229A0 (138 KiB): DRAM[0m 21:28:17.272 -> [0;32mI (1342) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM[0m 21:28:17.272 -> [0;32mI (1349) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM[0m 21:28:17.272 -> [0;32mI (1355) heap_init: At 4009C508 len 00003AF8 (14 KiB): IRAM[0m 21:28:17.272 -> [0;32mI (1361) cpu_start: Pro cpu start user code[0m 21:28:17.321 -> [0;32mI (1366) spiram: Adding pool of 4096K of external SPI memory to heap allocator[0m 21:28:17.321 -> [0;32mI (1387) spi_flash: detected chip: generic[0m 21:28:17.321 -> [0;32mI (1387) spi_flash: flash io: qio[0m 21:28:17.321 -> [0;32mI (1387) cpu_start: Starting scheduler on PRO CPU.[0m 21:28:17.321 -> [0;32mI (0) cpu_start: Starting scheduler on APP CPU.[0m 21:28:17.321 -> [0;32mI (1396) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations[0m 21:28:17.360 -> I (1446) wifi:wifi driver task: 3ffcceb0, prio:23, stack:3584, core=0 21:28:17.360 -> [0;32mI (1446) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m 21:28:17.360 -> [0;32mI (1446) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m 21:28:17.407 -> I (1466) wifi:wifi firmware version: 101cee8 21:28:17.407 -> I (1466) wifi:config NVS flash: enabled 21:28:17.407 -> I (1466) wifi:config nano formating: disabled 21:28:17.407 -> I (1466) wifi:Init dynamic tx buffer num: 32 21:28:17.407 -> I (1476) wifi:Init data frame dynamic rx buffer num: 32 21:28:17.407 -> I (1476) wifi:Init management frame dynamic rx buffer num: 32 21:28:17.449 -> I (1486) wifi:Init management short buffer num: 32 21:28:17.449 -> I (1486) wifi:Init static tx buffer num: 16 21:28:17.449 -> I (1496) wifi:Init static rx buffer size: 1600 21:28:17.449 -> I (1496) wifi:Init static rx buffer num: 10 21:28:17.449 -> I (1496) wifi:Init dynamic rx buffer num: 32 21:28:17.449 -> [0;32mI (1506) camera wifi: wifi_init_softap finished.SSID:wireless-tag password:wireless-tag[0m 21:28:17.521 -> [0;32mI (1596) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0[0m 21:28:17.521 -> I (1596) wifi:mode : softAP (30:ae:a4:96:af:75) 21:28:17.521 -> I (1606) wifi:Total power save buffer number: 8 21:28:17.521 -> I (1606) wifi:Init max length of beacon: 752/752 21:28:17.521 -> I (1606) wifi:Init max length of beacon: 752/752 21:28:17.556 -> I (1616) wifi:Set ps type: 0 21:28:17.556 -> 21:28:17.556 -> [0;32mI (1616) sccb: pin_sda 26 pin_scl 27 21:28:17.556 -> [0m 21:28:17.556 -> [0;32mI (1616) gpio: GPIO[32]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m 21:28:17.665 -> [0;32mI (1746) camera: Detected OV2640 camera[0m 21:28:17.665 -> [0;32mI (1756) gpio: GPIO[35]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.699 -> [0;32mI (1756) gpio: GPIO[34]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.699 -> [0;32mI (1766) gpio: GPIO[39]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.699 -> [0;32mI (1776) gpio: GPIO[36]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.699 -> [0;32mI (1786) gpio: GPIO[21]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.734 -> [0;32mI (1786) gpio: GPIO[19]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.734 -> [0;32mI (1796) gpio: GPIO[18]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.734 -> [0;32mI (1806) gpio: GPIO[5]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.734 -> [0;32mI (1816) gpio: GPIO[25]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.772 -> [0;32mI (1826) gpio: GPIO[23]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.772 -> [0;32mI (1836) gpio: GPIO[22]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 [0m 21:28:17.772 -> [0;32mI (1846) camera: Allocating 2 frame buffers (750 KB total)[0m 21:28:17.807 -> [0;32mI (1906) camera: Allocating 375 KB frame buffer in OnBoard RAM[0m 21:28:17.906 -> [0;32mI (2006) camera: Allocating 375 KB frame buffer in OnBoard RAM[0m 21:28:18.271 -> [0;32mI (2356) camera_httpd: Starting web server on port: '80'[0m 21:28:18.271 -> [0;32mI (2356) camera_httpd: Starting stream server on port: '81'[0m 21:28:18.271 -> [0;32mI (2356) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m
このログの中に
21:28:17.449 -> [0;32mI (1506) camera wifi: wifi_init_softap finished.SSID:wireless-tag password:wireless-tag[0m 21:28:17.521 -> [0;32mI (1596) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0[0m 21:28:17.521 -> I (1596) wifi:mode : softAP (30:ae:a4:96:af:75)
とあるとおり、SoftAP モードで動いていて WT-ESP32-CAM 自身が Wi-Fi アクセスポイントの役割もしているので、スマホや PC から
- SSID:
wireless-tag
- パスワード:
wireless-tag
で接続することができる。 WT-ESP32-CAM に外部アンテナを付けていない状態でも、近距離であれば問題なく接続できた。
このアクセスポイントに接続し、ブラウザで http://192.168.4.1/ にアクセスすると、カメラ撮影用の Web インターフェイスを使うことができる。[Get Still] ボタンをクリックすると静止画が撮影される。
最大で 1600 px × 1200 px の画像が撮影できる。小さくて安いのにすごい。
トラブルシューティング
起動時、最初は
21:26:03.260 -> [0;31mE (2056) camera: Failed to set frame size[0m 21:26:03.260 -> [0;31mE (2066) camera: Camera init failed with error 0x20002[0m 21:26:03.260 -> [0;31mE (2066) app_camera: Camera init failed with error 0x20002[0m
というカメラ関連のエラーが出たが、何回かリセットボタンで再起動したら直った。
ちなみに、カメラが接続されていない場合には、以下のような別のエラーが出る。
21:14:10.916 -> [0;31mE (1686) camera: Detected camera not supported.[0m 21:14:10.916 -> [0;31mE (1686) camera: Camera probe failed with error 0x20004[0m 21:14:10.916 -> [0;31mE (1686) app_camera: Camera init failed with error 0x20004[0m
また、1台の WT-ESP32-CAM に、複数台のクライアントから同時にアクセスすることはできない様子。
21:31:16.681 -> I (180716) wifi:max connection, deauth!