Skip to content

Commit f5133d1

Browse files
committed
refactor: migrate boards to esp-video API (1/2)
1 parent 256025f commit f5133d1

File tree

7 files changed

+141
-92
lines changed

7 files changed

+141
-92
lines changed

main/boards/atoms3r-cam-m12-echo-base/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ AtomS3R CAM、AtomS3R M12 是 M5Stack 推出的基于 ESP32-S3-PICO-1-N8R8 的
1414

1515
两款开发版均**不带屏幕、不带额外按键**,需要使用语音唤醒。必要时,需要使用 `idf.py monitor` 查看 log 以确定运行状态。
1616

17+
> ![NOTE]
18+
>
19+
> 自版本 [待定] 起,由于依赖库不支持 OV3660 传感器,AtomS3R M12 无法使用摄像头识别功能。
20+
>
21+
> AtomS3R CAM 不受影响;使用旧版本小智固件的 AtomS3R M12 不受影响。
22+
1723
## 配置、编译命令
1824

1925
**配置编译目标为 ESP32S3**

main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -123,36 +123,51 @@ class AtomS3rCamM12EchoBaseBoard : public WifiBoard {
123123

124124
ESP_LOGI(TAG, "Camera Power Enabled");
125125

126-
vTaskDelay(pdMS_TO_TICKS(300));
126+
vTaskDelay(pdMS_TO_TICKS(1000));
127127
}
128128

129-
void InitializeCamera() {
130-
camera_config_t config = {};
131-
config.pin_d0 = CAMERA_PIN_D0;
132-
config.pin_d1 = CAMERA_PIN_D1;
133-
config.pin_d2 = CAMERA_PIN_D2;
134-
config.pin_d3 = CAMERA_PIN_D3;
135-
config.pin_d4 = CAMERA_PIN_D4;
136-
config.pin_d5 = CAMERA_PIN_D5;
137-
config.pin_d6 = CAMERA_PIN_D6;
138-
config.pin_d7 = CAMERA_PIN_D7;
139-
config.pin_xclk = CAMERA_PIN_XCLK;
140-
config.pin_pclk = CAMERA_PIN_PCLK;
141-
config.pin_vsync = CAMERA_PIN_VSYNC;
142-
config.pin_href = CAMERA_PIN_HREF;
143-
config.pin_sccb_sda = CAMERA_PIN_SIOD;
144-
config.pin_sccb_scl = CAMERA_PIN_SIOC;
145-
config.sccb_i2c_port = 1;
146-
config.pin_pwdn = CAMERA_PIN_PWDN;
147-
config.pin_reset = CAMERA_PIN_RESET;
148-
config.xclk_freq_hz = XCLK_FREQ_HZ;
149-
config.pixel_format = PIXFORMAT_RGB565;
150-
config.frame_size = FRAMESIZE_QVGA;
151-
config.jpeg_quality = 12;
152-
config.fb_count = 1;
153-
config.fb_location = CAMERA_FB_IN_PSRAM;
154-
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
155-
camera_ = new Esp32Camera(config);
129+
void InitializeCamera() {
130+
static esp_cam_ctlr_dvp_pin_config_t dvp_pin_config = {
131+
.data_width = CAM_CTLR_DATA_WIDTH_8,
132+
.data_io = {
133+
[0] = CAMERA_PIN_D0,
134+
[1] = CAMERA_PIN_D1,
135+
[2] = CAMERA_PIN_D2,
136+
[3] = CAMERA_PIN_D3,
137+
[4] = CAMERA_PIN_D4,
138+
[5] = CAMERA_PIN_D5,
139+
[6] = CAMERA_PIN_D6,
140+
[7] = CAMERA_PIN_D7,
141+
},
142+
.vsync_io = CAMERA_PIN_VSYNC,
143+
.de_io = CAMERA_PIN_HREF,
144+
.pclk_io = CAMERA_PIN_PCLK,
145+
.xclk_io = CAMERA_PIN_XCLK,
146+
};
147+
148+
esp_video_init_sccb_config_t sccb_config = {
149+
.init_sccb = true,
150+
.i2c_config = {
151+
.port = 1,
152+
.scl_pin = CAMERA_PIN_SIOC,
153+
.sda_pin = CAMERA_PIN_SIOD,
154+
},
155+
.freq = 100000,
156+
};
157+
158+
esp_video_init_dvp_config_t dvp_config = {
159+
.sccb_config = sccb_config,
160+
.reset_pin = CAMERA_PIN_RESET,
161+
.pwdn_pin = CAMERA_PIN_PWDN,
162+
.dvp_pin = dvp_pin_config,
163+
.xclk_freq = XCLK_FREQ_HZ,
164+
};
165+
166+
esp_video_init_config_t video_config = {
167+
.dvp = &dvp_config,
168+
};
169+
170+
camera_ = new Esp32Camera(video_config);
156171
camera_->SetHMirror(false);
157172
}
158173

main/boards/atoms3r-cam-m12-echo-base/config.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
"name": "atoms3r-cam-m12-echo-base",
66
"sdkconfig_append": [
77
"CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y",
8-
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\""
8+
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"",
9+
"CONFIG_CAMERA_GC0308=y",
10+
"CAMERA_GC0308_AUTO_DETECT_DVP_INTERFACE_SENSOR=y",
11+
"CAMERA_GC0308_DVP_RGB565_320X240_20FPS=y"
912
]
1013
}
1114
]

main/boards/esp-sparkbot/config.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
"builds": [
44
{
55
"name": "esp-sparkbot",
6-
"sdkconfig_append": []
6+
"sdkconfig_append": [
7+
"CONFIG_CAMERA_OV2640=y",
8+
"CONFIG_CAMERA_OV2640_AUTO_DETECT_DVP_INTERFACE_SENSOR=y",
9+
"CONFIG_CAMERA_OV2640_DVP_RGB565_240X240_25FPS=y"
10+
]
711
}
812
]
913
}

main/boards/esp-sparkbot/esp_sparkbot_board.cc

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -121,41 +121,48 @@ class EspSparkBot : public WifiBoard {
121121
}
122122

123123
void InitializeCamera() {
124-
camera_config_t camera_config = {};
125-
126-
camera_config.pin_pwdn = SPARKBOT_CAMERA_PWDN;
127-
camera_config.pin_reset = SPARKBOT_CAMERA_RESET;
128-
camera_config.pin_xclk = SPARKBOT_CAMERA_XCLK;
129-
camera_config.pin_pclk = SPARKBOT_CAMERA_PCLK;
130-
camera_config.pin_sccb_sda = SPARKBOT_CAMERA_SIOD;
131-
camera_config.pin_sccb_scl = SPARKBOT_CAMERA_SIOC;
132-
133-
camera_config.pin_d0 = SPARKBOT_CAMERA_D0;
134-
camera_config.pin_d1 = SPARKBOT_CAMERA_D1;
135-
camera_config.pin_d2 = SPARKBOT_CAMERA_D2;
136-
camera_config.pin_d3 = SPARKBOT_CAMERA_D3;
137-
camera_config.pin_d4 = SPARKBOT_CAMERA_D4;
138-
camera_config.pin_d5 = SPARKBOT_CAMERA_D5;
139-
camera_config.pin_d6 = SPARKBOT_CAMERA_D6;
140-
camera_config.pin_d7 = SPARKBOT_CAMERA_D7;
141-
142-
camera_config.pin_vsync = SPARKBOT_CAMERA_VSYNC;
143-
camera_config.pin_href = SPARKBOT_CAMERA_HSYNC;
144-
camera_config.pin_pclk = SPARKBOT_CAMERA_PCLK;
145-
camera_config.xclk_freq_hz = SPARKBOT_CAMERA_XCLK_FREQ;
146-
camera_config.ledc_timer = SPARKBOT_LEDC_TIMER;
147-
camera_config.ledc_channel = SPARKBOT_LEDC_CHANNEL;
148-
camera_config.fb_location = CAMERA_FB_IN_PSRAM;
149-
150-
camera_config.sccb_i2c_port = I2C_NUM_0;
151-
152-
camera_config.pixel_format = PIXFORMAT_RGB565;
153-
camera_config.frame_size = FRAMESIZE_240X240;
154-
camera_config.jpeg_quality = 12;
155-
camera_config.fb_count = 1;
156-
camera_config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
124+
125+
// DVP pin configuration
126+
static esp_cam_ctlr_dvp_pin_config_t dvp_pin_config = {
127+
.data_width = CAM_CTLR_DATA_WIDTH_8,
128+
.data_io = {
129+
[0] = SPARKBOT_CAMERA_D0,
130+
[1] = SPARKBOT_CAMERA_D1,
131+
[2] = SPARKBOT_CAMERA_D2,
132+
[3] = SPARKBOT_CAMERA_D3,
133+
[4] = SPARKBOT_CAMERA_D4,
134+
[5] = SPARKBOT_CAMERA_D5,
135+
[6] = SPARKBOT_CAMERA_D6,
136+
[7] = SPARKBOT_CAMERA_D7,
137+
},
138+
.vsync_io = SPARKBOT_CAMERA_VSYNC,
139+
.de_io = SPARKBOT_CAMERA_HSYNC,
140+
.pclk_io = SPARKBOT_CAMERA_PCLK,
141+
.xclk_io = SPARKBOT_CAMERA_XCLK,
142+
};
143+
144+
// 复用 I2C 总线
145+
esp_video_init_sccb_config_t sccb_config = {
146+
.init_sccb = false, // 不初始化新的 SCCB,使用现有的 I2C 总线
147+
.i2c_handle = i2c_bus_, // 使用现有的 I2C 总线句柄
148+
.freq = 100000, // 100kHz
149+
};
150+
151+
// DVP configuration
152+
esp_video_init_dvp_config_t dvp_config = {
153+
.sccb_config = sccb_config,
154+
.reset_pin = SPARKBOT_CAMERA_RESET,
155+
.pwdn_pin = SPARKBOT_CAMERA_PWDN,
156+
.dvp_pin = dvp_pin_config,
157+
.xclk_freq = SPARKBOT_CAMERA_XCLK_FREQ,
158+
};
159+
160+
// Main video configuration
161+
esp_video_init_config_t video_config = {
162+
.dvp = &dvp_config,
163+
};
157164

158-
camera_ = new Esp32Camera(camera_config);
165+
camera_ = new Esp32Camera(video_config);
159166

160167
Settings settings("sparkbot", false);
161168
// 考虑到部分复刻使用了不可动摄像头的设计,默认启用翻转

main/boards/m5stack-core-s3/config.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
{
55
"name": "m5stack-core-s3",
66
"sdkconfig_append": [
7-
"CONFIG_SPIRAM_MODE_QUAD=y"
7+
"CONFIG_SPIRAM_MODE_QUAD=y",
8+
"CONFIG_CAMERA_GC0308=y",
9+
"CAMERA_GC0308_AUTO_DETECT_DVP_INTERFACE_SENSOR=y",
10+
"CAMERA_GC0308_DVP_RGB565_320X240_20FPS=y"
811
]
912
}
1013
]

main/boards/m5stack-core-s3/m5stack_core_s3.cc

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -291,33 +291,44 @@ class M5StackCoreS3Board : public WifiBoard {
291291
}
292292

293293
void InitializeCamera() {
294-
// Open camera power
295-
camera_config_t config = {};
296-
config.pin_d0 = CAMERA_PIN_D0;
297-
config.pin_d1 = CAMERA_PIN_D1;
298-
config.pin_d2 = CAMERA_PIN_D2;
299-
config.pin_d3 = CAMERA_PIN_D3;
300-
config.pin_d4 = CAMERA_PIN_D4;
301-
config.pin_d5 = CAMERA_PIN_D5;
302-
config.pin_d6 = CAMERA_PIN_D6;
303-
config.pin_d7 = CAMERA_PIN_D7;
304-
config.pin_xclk = CAMERA_PIN_XCLK;
305-
config.pin_pclk = CAMERA_PIN_PCLK;
306-
config.pin_vsync = CAMERA_PIN_VSYNC;
307-
config.pin_href = CAMERA_PIN_HREF;
308-
config.pin_sccb_sda = CAMERA_PIN_SIOD;
309-
config.pin_sccb_scl = CAMERA_PIN_SIOC;
310-
config.sccb_i2c_port = 1;
311-
config.pin_pwdn = CAMERA_PIN_PWDN;
312-
config.pin_reset = CAMERA_PIN_RESET;
313-
config.xclk_freq_hz = XCLK_FREQ_HZ;
314-
config.pixel_format = PIXFORMAT_RGB565;
315-
config.frame_size = FRAMESIZE_QVGA;
316-
config.jpeg_quality = 12;
317-
config.fb_count = 1;
318-
config.fb_location = CAMERA_FB_IN_PSRAM;
319-
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
320-
camera_ = new Esp32Camera(config);
294+
static esp_cam_ctlr_dvp_pin_config_t dvp_pin_config = {
295+
.data_width = CAM_CTLR_DATA_WIDTH_8,
296+
.data_io = {
297+
[0] = CAMERA_PIN_D0,
298+
[1] = CAMERA_PIN_D1,
299+
[2] = CAMERA_PIN_D2,
300+
[3] = CAMERA_PIN_D3,
301+
[4] = CAMERA_PIN_D4,
302+
[5] = CAMERA_PIN_D5,
303+
[6] = CAMERA_PIN_D6,
304+
[7] = CAMERA_PIN_D7,
305+
},
306+
.vsync_io = CAMERA_PIN_VSYNC,
307+
.de_io = CAMERA_PIN_HREF,
308+
.pclk_io = CAMERA_PIN_PCLK,
309+
.xclk_io = CAMERA_PIN_XCLK,
310+
};
311+
312+
esp_video_init_sccb_config_t sccb_config = {
313+
.init_sccb = false,
314+
.i2c_handle = i2c_bus_,
315+
.freq = 100000,
316+
};
317+
318+
esp_video_init_dvp_config_t dvp_config = {
319+
.sccb_config = sccb_config,
320+
.reset_pin = CAMERA_PIN_RESET,
321+
.pwdn_pin = CAMERA_PIN_PWDN,
322+
.dvp_pin = dvp_pin_config,
323+
.xclk_freq = XCLK_FREQ_HZ,
324+
};
325+
326+
esp_video_init_config_t video_config = {
327+
.dvp = &dvp_config,
328+
};
329+
330+
camera_ = new Esp32Camera(video_config);
331+
camera_->SetHMirror(false);
321332
}
322333

323334
public:

0 commit comments

Comments
 (0)