1.Introduction
ACEBOTT-ESP32-CAM-V1.0 は、業界で最も競争力のある小型カメラ モジュールであり、最小のシステムとして独立して動作できます。
ACEBOTT-ESP32-CAM-V1.0 は、さまざまな IoT アプリケーションで幅広く使用でき、家庭用スマート デバイス、産業用ワイヤレス制御、ワイヤレス監視、QR ワイヤレス識別、ワイヤレス測位システム信号、その他の IoT アプリケーションに適しています。
ACEBOTT-ESP32-CAM-V1.0 は DIP パッケージを採用しており、底板に挿入するだけで直接使用できるため、製品の迅速な生産が実現し、顧客に信頼性の高い接続を提供し、さまざまな IoT ハードウェア端末の機会への応用が容易になります。
2.Features
超小型 802.11b/g/n Wi-Fi SoC モジュール
低消費電力デュアルコア32ビットCPUはアプリケーションプロセッサとして使用できます。
最大240MHzのメイン周波数、最大600DMIPSの計算能力
内蔵 520 KB SRAM、外部 8MB PSRAM
UART / SPI / I2C / PWM / ADC / DACインターフェースのサポート
フラッシュ内蔵のOV2640およびOV7670カメラをサポート
画像のWiFiアップロードをサポート
複数の休眠モードをサポート
Lwip と FreeRTOS
STA / AP / STA + AP動作モードをサポート
Smart Config / AirKissワンクリック配信ネットワークをサポート
3.Specifications
Parameters | 値/説明 |
---|---|
サイズ | 27.1×47.1(mm) |
カプセル化 | DIP-20 |
電源 | タイプ-c |
サポートインターフェース | シリアルポート |
IOポート数 | 10 |
シリアルポートのボーレート | 110 ~ 4608000 bps をサポート、デフォルト 115200 bps |
SPIフラッシュ | デフォルト 32Mbit |
画像出力フォーマット | JPEG(OV2640のみサポート)、BMP、グレースケール |
スペクトル範囲 | 2400〜2483.5MHz |
アンテナ形状 | 外部 PCB アンテナ、ゲイン 2 dBi |
消費電力 | フラッシュをオフにする:180mA@5V |
フラッシュライトをオンにして明るさを最大に調整します:310mA@5V | |
ディープスリープ:最低消費電力は6 mA@5V | |
モダンスリープ:最小レベルは20 mA@5V | |
浅い睡眠:最小値は6.7に達する可能性がある mA@5V | |
セキュリティ | WEP / WPA-PSK / WPA2-PSK |
電源供給範囲 | 4.75-5.25V |
動作温度 | -20°C〜70°C |
ストレージ環境 | -40 °C ~ 1250 °C、<90%RH |
4.サンプルコード
Type-C データ ケーブルを使用してボードをコンピューターに接続します。[ツール] > [ボード] メニューから [ESP32] -> [ESP32 開発モジュール] を選択します。適切なポートを選択します。[アップロード] ボタンを使用してボードにアップロードします。
(1)配線図
(2)サンプルコード
1#include "esp_camera.h"
2#include <WiFi.h>
3#include "esp_timer.h"
4#include "img_converters.h"
5#include "Arduino.h"
6#include "fb_gfx.h"
7#include "soc/soc.h" //disable brownout problems
8#include "soc/rtc_cntl_reg.h" //disable brownout problems
9#include "esp_http_server.h"
10
11const char *ssid = "ESP32-CAM";
12const char *password = "12345678";
13WiFiServer server(100);
14WiFiClient client;
15
16#define PART_BOUNDARY "123456789000000000000987654321"
17// #define CAMERA_MODEL_AI_THINKER
18#define PWDN_GPIO_NUM 32
19#define RESET_GPIO_NUM -1
20#define XCLK_GPIO_NUM 0
21#define SIOD_GPIO_NUM 26
22#define SIOC_GPIO_NUM 27
23#define Y9_GPIO_NUM 35
24#define Y8_GPIO_NUM 34
25#define Y7_GPIO_NUM 39
26#define Y6_GPIO_NUM 36
27#define Y5_GPIO_NUM 21
28#define Y4_GPIO_NUM 19
29#define Y3_GPIO_NUM 18
30#define Y2_GPIO_NUM 5
31#define VSYNC_GPIO_NUM 25
32#define HREF_GPIO_NUM 23
33#define PCLK_GPIO_NUM 22
34
35#define RXD2 14
36#define TXD2 13
37
38static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
39static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
40static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
41httpd_handle_t stream_httpd = NULL;
42
43static esp_err_t stream_handler(httpd_req_t *req){
44 camera_fb_t * fb = NULL;
45 esp_err_t res = ESP_OK;
46 size_t _jpg_buf_len = 0;
47 uint8_t * _jpg_buf = NULL;
48 char * part_buf[64];
49 res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
50 if(res != ESP_OK){
51 return res;
52 }
53while(true){
54 fb = esp_camera_fb_get();
55 if (!fb) {
56 Serial.println("Camera capture failed");
57 res = ESP_FAIL;
58 } else {
59 if(fb->width > 400){
60 if(fb->format != PIXFORMAT_JPEG){
61 bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
62 esp_camera_fb_return(fb);
63 fb = NULL;
64 if(!jpeg_converted){
65 Serial.println("JPEG compression failed");
66 res = ESP_FAIL;
67 }
68 } else {
69 _jpg_buf_len = fb->len;
70 _jpg_buf = fb->buf;
71 }
72 }
73}
74if(res == ESP_OK){
75 size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
76 res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
77 }
78if(res == ESP_OK){
79 res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
80 }
81if(res == ESP_OK){
82 res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
83 }
84
85if(fb){
86 esp_camera_fb_return(fb);
87 fb = NULL;
88 _jpg_buf = NULL;
89 } else if(_jpg_buf){
90 free(_jpg_buf);
91 _jpg_buf = NULL;
92 }
93 if(res != ESP_OK){
94 break;
95 }
96 //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
97 }
98 return res;
99}
100void startCameraServer(){
101 httpd_config_t config = HTTPD_DEFAULT_CONFIG();
102 config.server_port = 80;
103 httpd_uri_t index_uri = {
104 .uri = "/",
105 .method = HTTP_GET,
106 .handler = stream_handler,
107 .user_ctx = NULL
108 };
109if (httpd_start(&stream_httpd, &config) == ESP_OK) {
110 httpd_register_uri_handler(stream_httpd, &index_uri);
111 }
112}
113
114void setup() {
115 // WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
116 Serial.begin(115200);
117 Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
118
119 // Serial.setDebugOutput(false);
120
121 camera_config_t config;
122 config.ledc_channel = LEDC_CHANNEL_0;
123 config.ledc_timer = LEDC_TIMER_0;
124 config.pin_d0 = Y2_GPIO_NUM;
125 config.pin_d1 = Y3_GPIO_NUM;
126 config.pin_d2 = Y4_GPIO_NUM;
127 config.pin_d3 = Y5_GPIO_NUM;
128 config.pin_d4 = Y6_GPIO_NUM;
129 config.pin_d5 = Y7_GPIO_NUM;
130 config.pin_d6 = Y8_GPIO_NUM;
131 config.pin_d7 = Y9_GPIO_NUM;
132 config.pin_xclk = XCLK_GPIO_NUM;
133 config.pin_pclk = PCLK_GPIO_NUM;
134 config.pin_vsync = VSYNC_GPIO_NUM;
135 config.pin_href = HREF_GPIO_NUM;
136 config.pin_sccb_sda = SIOD_GPIO_NUM;
137 config.pin_sccb_scl = SIOC_GPIO_NUM;
138 config.pin_pwdn = PWDN_GPIO_NUM;
139 config.pin_reset = RESET_GPIO_NUM;
140 config.xclk_freq_hz = 20000000;
141 config.frame_size = FRAMESIZE_UXGA;
142 config.pixel_format = PIXFORMAT_JPEG; // for streaming
143 //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
144 config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
145 config.fb_location = CAMERA_FB_IN_PSRAM;
146 config.jpeg_quality = 12;
147 config.fb_count = 1;
148
149 // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
150 // for larger pre-allocated frame buffer.
151 if(config.pixel_format == PIXFORMAT_JPEG){
152 if(psramFound()){
153 config.jpeg_quality = 10;
154 config.fb_count = 2;
155 config.grab_mode = CAMERA_GRAB_LATEST;
156 } else {
157 // Limit the frame size when PSRAM is not available
158 config.frame_size = FRAMESIZE_SVGA;
159 config.fb_location = CAMERA_FB_IN_DRAM;
160 }
161 } else {
162 // Best option for face detection/recognition
163 config.frame_size = FRAMESIZE_240X240;
164#if CONFIG_IDF_TARGET_ESP32S3
165 config.fb_count = 2;
166#endif
167 }
168 // camera init
169 esp_err_t err = esp_camera_init(&config);
170 if (err != ESP_OK)
171 {
172 Serial.printf("Camera init failed with error 0x%x", err);
173 return;
174 }
175 sensor_t *s = esp_camera_sensor_get();
176 //drop down frame size for higher initial frame rate
177 //s->set_framesize(s, FRAMESIZE_SXGA); //Byte length sampling value:60000 #9 (High picture quality) 1280x1024
178 s->set_framesize(s, FRAMESIZE_SVGA); //Byte length sampling value:40000 #7 (Medium picture quality) 800x600
179 //s->set_framesize(s, FRAMESIZE_QVGA); //Byte length sampling value:10000 #4 (Poor picture quality) 320x240
180
181 s->set_vflip(s, 1); //Image orientation Settings (up and down)
182 s->set_hmirror(s, 1); //Image orientation Settings (left and right)
183
184 WiFi.setTxPower(WIFI_POWER_19_5dBm);
185 WiFi.mode(WIFI_AP);
186 WiFi.softAP(ssid, password, 5);
187 // WiFi.softAP(ssid, password);
188 Serial.print("\r\n");
189 startCameraServer();
190 Serial.print("\r\n");
191 Serial.print("Camera Ready! Use 'http://");
192 Serial.print(WiFi.softAPIP());
193 Serial.println("' to connect");
194
195 server.begin(); // Starting the server
196 delay(100);
197
198}
199void loop() {
200 delay(1);
201
202}
5.テスト結果
プログラムをアップロードすると、Web 側で画像効果が表示されます。まず、端末デバイスをカメラモジュールが発行する WiFi に接続する必要があります。
暗示
プログラム内の WiFi 名とパスワードはカスタマイズできます。
AP モードのカメラ モジュールの IP アドレスは 192.168.4.1 です。端末ブラウザーのアドレス バーに IP アドレスを入力して、カメラ画像の Web ページにアクセスします。カメラの方向を動かすと、Web ページでカメラ モジュールのライブ画像効果を確認できます。
6.関連リソース