2025-11-22

使用 AI-Thinker ESP32-Cam 製作網絡監視器

最近在下幫助朋友設定網絡監視器
發現現在的網絡監視器,為了方便使用,大部分已經不再需要設定網絡
只需註冊產品官方的帳戶,再使用產品官方的網站或應用程式登入便可以觀看到內容
亦即是使用者必須提交個人資料給產品公司

另外,網絡監視器的影像內容是由產品公司以即時串流方式提供服務
即是技術上,產品公司能夠觀看、保存使用者的影像內容,可能會有私隱泄漏風險
因此在下嘗試尋找能夠自己控制的網絡監視器的工具

預覽

AI-Thinker ESP32-Cam

AI-Thinker ESP32-Cam 是一款使用 ESP32 為微控制器並能夠連接到 小型鏡頭 的模組

ESP32 具備 WiFi 及 BLE 功能,能夠將鏡頭的影像透過 WiFi 及 BLE 方式傳送

外觀

ESP32-Cam 的正面

ESP32-Cam 具備 高亮度LED ,與 IO4 連接,高電壓時亮著,具備 8位元PWM

FPC連接器,可連接 扁平絲帶線 (Ribbon Cable)
ESP32-Cam 支援多種鏡頭:

  • OV2640
  • OV3660
  • OV5640
  • OV7670
  • OV7725
  • NT99141
  • GC032A
  • GC0308
  • GC2145
  • BF3005
  • BF20A6
  • SC101IOT
  • SC030IOT
  • SC031GS

ESP32-Cam 提供 Micro SD卡模組 ,方便將資料儲存

ESP32-Cam 有一支 電壓輸出引腳
預設利用 0Ω電阻器 連接並輸出 3.3V
有需要可以將 電阻器 除焊,更改輸出電壓為 5V

ESP32-Cam 的背面

重設按鈕

ESP32-Cam 使用 ESP-32S 微控制器,具備 WiFi 及 BLE 功能

除了高亮度LED,還有一粒 普通LED,與 IO33 連接,低電壓亮著;具備 8位元PWM

ESP32-Cam 提供 電路板天線IPEX外接天線
預設利用 0Ω電阻器 連接並使用電路板天線
有需要可以將 電阻器 除焊,更改使用 外接天線 來增強訊號

ESP32-Cam 焊接 ESP-PSRAM32 額外提供 32Mb(4MB) 的記憶體空間,能夠寫入更多資料

引腳
SD卡
左排引腳 右排引腳
5V 1 16 3V3
GND 2 15 IO16
IO12 3 14 IO0
IO13 4 13 GND
IO15 5 12 VCC
IO14 6 11 RX
IO2 7 10 TX
IO4 8 9 GND
編號 引腳 方向 功能
1 5V 5V 輸入
2 GND 接地
3 IO12 輸入輸出 第12數碼引腳;SD DATA2引腳
4 IO13 輸入輸出 第13數碼引腳;SD DATA3引腳
5 IO15 輸入輸出 第15數碼引腳;SD CMD引腳
6 IO14 輸入輸出 第14數碼引腳;SD SCK引腳
7 IO2 輸入輸出 第2數碼引腳;SD DATA0引腳
8 IO4 輸入輸出 第4數碼引腳;SD DATA1引腳;高亮度LED引腳
9 GND 接地
10 U0T 輸出 第1數碼引腳, UART TX引腳
11 U0R 輸入 第3數碼引腳, UART RX引腳
12 VCC 根據選擇輸出 3.3V 或 5V ,預設 3.3V
13 GND 接地
14 IO0 輸入輸出 第0引腳; FPC XCLK引腳;起動時接地進入寫入模式
15 IO16 輸入輸出 第16引腳
16 3V3 3.3V 輸入
LED1 IO33 輸出 第33數碼引腳;LED1引腳
FPC_HREF IO23 第23數碼引腳;FPC HREF引腳;不佔用引出引腳
FPC_PCLK IO22 第22數碼引腳;FPC PCLK引腳;不佔用引出引腳
FPC_PWDN IO32 第32數碼引腳;FPC PWDN引腳;不佔用引出引腳 (鏡頭電源)
FPC_SIOC IO27 第27數碼引腳;FPC SIOC引腳;不佔用引出引腳
FPC_SIOD IO26 第26數碼引腳;FPC SIOD引腳;不佔用引出引腳
FPC_VSYNC IO25 第25數碼引腳;FPC VSYNC引腳;不佔用引出引腳
FPC_Y2 IO5 第5數碼引腳;FPC Y2引腳;不佔用引出引腳
FPC_Y3 IO18 第18數碼引腳;FPC Y3引腳;不佔用引出引腳
FPC_Y4 IO19 第19數碼引腳;FPC Y4引腳;不佔用引出引腳
FPC_Y5 IO21 第21數碼引腳;FPC Y5引腳;不佔用引出引腳
FPC_Y6 IO36 第36數碼引腳;FPC Y6引腳;不佔用引出引腳
FPC_Y7 IO39 第39數碼引腳;FPC Y7引腳;不佔用引出引腳
FPC_Y8 IO34 第34數碼引腳;FPC Y8引腳;不佔用引出引腳
FPC_Y9 IO35 第35數碼引腳;FPC Y9引腳;不佔用引出引腳

燒錄方法

由於 ESP32-Cam 沒有 USB插孔,因此需要外接燒錄器才能將資料寫入到 ESP32-Cam

使用Arduino
引腳連接

先將 Arduino 燒錄成 ArduinoISP ,然後連接線路,再透過 ArduinoISP 將資料寫入到 ESP32-Cam
連接時要注意, Arduino Nano TX1引腳 連接到 ESP32-Cam U0T引腳

Arduino Nano 引腳 ESP32-Cam 引腳
5V 5V
GND GND
TX1 U0T
RX0 U0R
RST GND
GND IO0
線路原型

需要留意得是 Arduino Nano 的 RST引腳 需要接駁到 GND
而 ESP32-Cam 的 IO0 必須在起動前連接到 GND 才能載入到寫入模式

實際線路

線路簡單,與線路原型大致上相同

使用USB轉TTL

另一種方法是使用 RS232 將 USB訊號 轉換成 TTL訊號 經 UART協定 將資料寫入到 ESP32-Cam

外觀

在下過去曾經使用 FTDI 的 FT232燒錄器 ,由於 FT232燒錄器 使用 Mini USB Type-B 插孔連接
但現在已經很少裝置使用 Mini USB Type-B 插孔,因此在下改用由 LaskaKit 製作的 CH9102燒錄器

CH9102燒錄器 的 背面

CH9102燒錄器 的 正面

CH9102燒錄器 同時支援 Micro USB Type-B 及 USB Type-C 兩種常見的 USB插孔

使用 WCH 的 CH9102F 是一款 USB轉TTL 晶片

CH9102燒錄器 使用 切換器 而非 引腳連接器 ,方便切換輸出電壓

再使用另一切換器作為電源開關,避免電壓設定錯誤而燒毀目標裝置

電源連接綠色LED

電源啟動綠色LED

當資料寫入時 TX LED 及 RX LED 會閃動,均為橙色

引腳
編號 引腳 方向 功能
1 VCC
2 GND
3 TX 輸出 UART TX引腳
4 RX 輸入 UART RX引腳
5 DTR 輸入輸出 數據終端就緒 (Data Terminal Ready) 引腳
6 RTS 輸入輸出 發送請求 (Request To Send) 引腳
引腳連接

使用USB轉TTL燒錄時要注意,燒錄器的TX引腳 連接到 裝置的RX引腳
同樣 ESP32-Cam IO0引腳 需要連接到 GND引腳

CH9102 引腳 ESP32-Cam 引腳
5V 5V
GND GND
TX U0R
RX U0T
GND IO0
線路原型

與 ArduinoISP 的線路相似

實際線路

與 線路原型 相同

使用專用燒錄器
外觀

ESP32-Cam 專用燒錄器 (ESP32-Cam-MB) 的 正面

ESP32-Cam-MB 的 電源顯示LED

ESP32-Cam-MB 的 起動按鈕,連接到 ESP32-Cam 的 IO0引腳,當按下後會將 IO0 連接到 GND
當 ESP32-Cam 啟動前將 IO0 拉地,便會載入到 起動模式

ESP32-Cam-MB 的 重設按鈕,連接到 ESP32-Cam 的重設引腳

ESP32-Cam-MB 使用 Micro USB Type-B 插孔

ESP32-Cam 安裝到 ESP32-Cam-MB
ESP32-Cam-MB 最大好處就是不需要使用跳線便可以將資料寫入

寫入資料

線路連接後,可以使用 Arduino IDE 寫入資料

到 Additional Boards Manager URLs: 加入

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

並尋找及安裝 ESP32

安裝後,燒錄前,建議使用以下設定值:

  • Board: "AI Thinker ESP32-CAM"
  • CPU Frequency: "240MHz (WiFi/BT)"
  • Flash Frequency: "80MHz"
  • Flash Mode: "DIO"
  • Partition Scheme: "Huge APP (3MB No OTA/1MB SPIFFS)"
  • Core Debug Level: "None"
  • Erase All Flash Before Sketch Upload: "Disabled"

設定正確後可以編寫程式及上載

測試

測試普通LED (IO33),連接電源時亮著

測試高亮度LED (IO4),接地時亮著

普通LED 及 高亮度LED 都支援 PWM

OV2640 攝影鏡頭

OV2640 是一種輕量、低功耗攝影鏡頭,只需要 1.7V 至 3.3V 便能夠運作

外觀

OV2640 使用 軟性印刷電路板 (Flexible Printed Circuit (FPC))
比較輕、電路板可以有一定程度彎曲(摺疊會損壞電路)

OV2640 的正面

OV2640 的背面

OV2640 共有 24支引腳

引腳
編號 引腳 方向 功能
1 STROBE 輸入輸出 控制閃光燈(高亮度LED)
2 AGND 類比數碼轉換器(Analog/Digital Converter (ADC))接地
3 SIOD 輸入輸出 序列鏡頭控制總線(Serial Camera Control BUS (SCCB)) 資料訊號
4 AVDD 2.8V 類比數碼轉換器(Analog/Digital Converter (ADC))電源
5 SIOC 輸入 序列鏡頭控制總線(Serial Camera Control BUS (SCCB)) 時脈訊號
6 RESETB 輸入 晶片選擇,低電壓啟動
7 VSYNC 輸出 垂直同步輸出
8 PWDN 輸入 電源啟動,高電壓啟動
9 HREF 輸出 水平參考輸出
10 DVDD 1.3V 數碼電路電源
11 DOVDD 2.8V 數碼影像輸出電源
12 DATA9 輸出 第9位元數碼影像輸出
13 XCLK1 輸入 石英晶體振盪器時脈輸入
14 DATA8 輸出 第8位元數碼影像輸出
15 DGND 數碼影像接地
16 DATA7 輸出 第7位元數碼影像輸出
17 PCLK 輸出 像素時脈輸出
18 DATA6 輸出 第6位元數碼影像輸出
19 DATA2 輸出 第2位元數碼影像輸出
20 DATA5 輸出 第5位元數碼影像輸出
21 DATA3 輸出 第3位元數碼影像輸出
22 DATA4 輸出 第4位元數碼影像輸出
23 DATA1 輸出 第1位元數碼影像輸出
24 DATA0 輸出 第0位元數碼影像輸出
安裝

雖然 OV2640 的引腳又多又密,但只要使用 ESP32-Cam ,便可以簡單地透過 FPC連接器 連接

將 FPC連接器 的固定鎖向上拉開 (需要輕微用力)

將 OV2640 的引腳向下安置到 FPC連接器 ,並推至最入

將 FPC連接器 的固定鎖向下推回 (需要輕微用力) ,固定並壓著 OV2640 的引腳

測試

選擇 Example > ESP32 > Camera > CameraWebServer

示範中提供大量不同型號的鏡頭設定,將不適用的資料更改為注釋

將適用的資料取消注釋,例如 AI-Thinker ESP32-Cam 使用 CAMERA_MODEL_AI_THINKER 設定

設定連接到無線網絡的 SSID 及 密碼

如果不打算連接到無線網絡,亦可以將 ESP32 設定為 存取點(Access Point) ,讓其他裝置連接

將原本的

WiFi.begin(ssid, password);
WiFi.setSleep(false);
while (WiFi.status() != WL_CONNECTED) {
	delay(500);
	Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");

修改為

WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
WiFi.setSleep(false);
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.softAPIP());
Serial.println("' to connect");

上載 Sketch 到 ESP32-Cam 後,序列監視器可以查看 ESP32-Cam 的 IP (預設是 192.168.4.1)
便可以經網頁連接到 ESP32-Cam

連接到 ESP32-Cam 的 存取點,並以網頁瀏覽器載入 IP
便會顯示 OV2640 的設定頁面

按 Start Stream 便會開始將 鏡頭擷取到畫面 在頁面上顯示即時的影像

啟動閃光燈功能

雖然 CameraWebServer 已經提供了視像鏡頭的基本控制,但卻無法控制閃光燈
因為光度不足,會影響影像效果,因此要想辦法亮著閃光燈

修改 CameraWebServer 的 app_httpd.cpp

加入

#include <Arduino.h>

加入

static int8_t flash_enabled = 0;

尋找 cmd_handler 並加入

 else if (!strcmp(variable, "flash")) {
	pinMode(4, OUTPUT);
	digitalWrite(4, atoi(value));
	flash_enabled = atoi(value);
}

尋找 status_handler 並加入

p += sprintf(p, "\"flash\":%u", flash_enabled);

將 CameraWebServer 的頁面的原始碼複製成 HTML檔案

在 id="face_recognize-group" 元素後加入

<div class="input-group" id="flash-group">
	<label for="flash">Flash</label>
	<div class="switch">
		<input id="flash" type="checkbox" class="default-action">
		<label class="slider" for="flash"></label>
	</div>
</div>

在 Terminal 輸入

cat "${html_file}" | gzip | hexdump -e '32/1 "0x%02X," "\n"' | sed -r 's/0x +,//g'

將 HTML檔案 轉換成 十六進制資料

在 Terminal 輸入

cat "${html_file}" | gzip | hexdump -e '32/1 "0x%02X," "\n"' | sed -r 's/0x +,//g' | tr -cd ',' | wc -c

計算 十六進制資料 的 位元組數量

將 十六進制資料 取代 index_ov2640_html_gz 及 位元組數量 取代 index_ov2640_html_gz_len 的 資料

將 CameraWebServer 編譯並上載到 ESP32-Cam

載入到 ESP32-Cam 的頁面,會顯示能夠控制 高亮度LED 的 Flash開關掣

測試開關 高亮度LED

SD卡 模組

引腳

根據規格文件,ESP32-Cam 連接到 SD卡模組 的引腳是使用 SD協定 而不是 SPI協定

ESP32-Cam SD Card
IO14 SCK
IO15 CMD
IO2 DATA0
IO4 DATA1
IO12 DATA2
IO13 DATA3

不過在下參考了網上很多只需要複製、貼上便能夠做到效果的資料在下都無法成功
因此在下暫時停止儲存到 SD卡 的操作

補充資料

簡化開發板選擇

ESP32 Arduino 分類,總共有 198個項目(截至本文章)
而 AI Thinker ESP32-CAM 是第130個項目(截至本文章),每次尋找都會很麻煩
(如果使用 Arduino IDE 2.X 可以搜尋並選擇)
可以修改 ${HOME}/.arduino15/packages/esp32/hardware/esp32/2.0.11/boards.txt 改變次序方便選擇

將原本的的 esp32cam.name=AI Thinkder ESP32-CAM 更改為註釋(不建議刪除)

將 esp32cam.name=AI Thinkder ESP32-CAM 編寫在第1項目

重新開啟 Arduino IDE , AI Thinkder ESP32-CAM 便會在第1項目
有需要亦可以調整其他開發板的次序,同樣只需要將 .name 整行內容複製並注釋,再到其他位置貼上即可

總結

可能由於專案比較久遠,需要修改部分原始碼才能完善地運作

參考資料

沒有留言 :

張貼留言