跳转到内容

摄像头模块配置

摄像头模块配置

本节介绍如何在 ESP32 上配置摄像头模组,包括 GPIO 引脚分配和初始化参数设置。学习完成后,您将能够:

  • 配置 ESP32-CAM 的摄像头引脚映射
  • 设置分辨率和帧率参数
  • 选择合适的摄像头模组并初始化
  • 排查摄像头初始化失败的常见问题

ESP32-CAM 使用专用的 24-pin 接口连接摄像头模组:

// ESP32-CAM (AI-Thinker 版本) 引脚配置
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1 // -1 表示未连接
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
// Y9-Y2: 像素数据线 (8-bit)
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
// VSYNC/HREF/PCLK: 同步和时钟信号
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#include "esp_camera.h"
// 摄像头配置结构体
camera_config_t config;
// 初始化所有引脚
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000; // XCLK 20MHz
config.pixel_format = PIXFORMAT_JPEG; // JPEG 输出
config.frame_size = FRAMESIZE_VGA; // 640×480
config.jpeg_quality = 12; // JPEG 质量 (0-63, 越小越好)
config.fb_count = 1; // 帧缓冲数量
// 选择摄像头模组 (根据硬件配置)
#if defined(CAMERA_MODEL_AI_THINKER)
// AI-Thinker ESP32-CAM (最常见的型号)
camera_config_t config = { /* 如上配置 */ };
#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
// M5Stack 带 PSRAM 版本
config.pin_d0 = 32;
config.pin_d1 = 35;
// ... 不同引脚映射
#elif defined(CAMERA_MODEL_WROVER_KIT)
// ESP32-WROVER-KIT 开发板
config.pin_d0 = 5;
// ... 不同引脚映射
#endif
// 初始化摄像头
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
Serial.println("Camera init success!");
枚举值分辨率宽高比JPEG 大小适用场景
FRAMESIZE_QQVGA160×1204:3~5KB缩略图/预览
FRAMESIZE_QVGA320×2404:3~10KB低分辨率,网络节省
FRAMESIZE_VGA640×4804:3~30KB默认,平衡画质和大小
FRAMESIZE_SVGA800×6004:3~50KB中等画质
FRAMESIZE_XGA1024×7684:3~80KB较好画质
FRAMESIZE_UXGA1600×12004:3~150KB最高画质 (2MP)
// 动态调整分辨率
sensor_t *sensor = esp_camera_sensor_get();
// 设置分辨率
sensor->set_framesize(sensor, FRAMESIZE_VGA);
// 设置 JPEG 质量 (0-63)
sensor->set_quality(sensor, 12);
// 设置亮度 (-2 到 2)
sensor->set_brightness(sensor, 0);
// 设置对比度 (-2 到 2)
sensor->set_contrast(sensor, 0);
// 设置饱和度 (-2 到 2)
sensor->set_saturation(sensor, 0);
// 设置特殊效果 (0-6)
sensor->set_special_effect(sensor, 0); // 0=正常
// 设置白平衡
sensor->set_whitebal(sensor, 1); // 1=启用
// 设置镜像/翻转
sensor->set_hmirror(sensor, 0); // 水平镜像
sensor->set_vflip(sensor, 0); // 垂直翻转
// 拍照函数
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
// fb->buf: 图像数据缓冲区
// fb->len: 数据长度 (字节)
// fb->width: 图像宽度
// fb->height: 图像高度
// fb->format: 像素格式 (JPEG/BMP/etc)
Serial.printf("Picture taken! Size: %zu bytes\n", fb->len);
Serial.printf("Resolution: %dx%d\n", fb->width, fb->height);
// 使用完毕后释放帧缓冲
esp_camera_fb_return(fb);
错误码原因解决方法
ESP_ERR_NOT_FOUND摄像头未检测到检查接线和供电
ESP_ERR_NO_MEMPSRAM 不足检查 PSRAM 配置和容量
ESP_ERR_INVALID_ARG配置参数错误检查引脚配置和分辨率
// 调整图像质量参数
sensor->set_quality(sensor, 10); // 提高 JPEG 质量
sensor->set_framesize(sensor, FRAMESIZE_VGA);
sensor->set_brightness(sensor, 1); // 增加亮度
sensor->set_contrast(sensor, 1); // 增加对比度

Q1: 最大能支持多大分辨率的图片?

Section titled “Q1: 最大能支持多大分辨率的图片?”

ESP32-CAM (OV2640) 最大支持 UXGA (1600×1200),但建议使用 VGA (640×480) 在 MQTT 传输效率和画质之间取得平衡。

PSRAM 作为图像帧缓冲。大分辨率图片需要更多缓冲空间。4MB PSRAM 足以支持 UXGA JPEG 拍照。

ESP32-CAM 主要面向拍照应用。视频流(CameraWebServer)可以工作但帧率较低(VGA 约 5-15fps),取决于 Wi-Fi 和分辨率设置。

推荐做法:

  • 使用 VGA (640×480) 分辨率平衡画质和传输效率
  • JPEG 质量设置 10-15 获得较好的压缩比
  • 拍照后及时释放帧缓冲 (fb)
  • 配置 PSRAM 以支持大分辨率图片

避免做法:

  • 使用 UXGA 大分辨率通过 MQTT 传输(数据量过大)
  • 忘记释放帧缓冲导致内存泄漏
  • 在循环中高频拍照不停顿
  • 使用的分辨率超过 PSRAM 容量
  1. 引脚配置因摄像头模组型号而异,需根据硬件选择正确配置
  2. 分辨率选择需在画质和传输效率之间平衡
  3. JPEG 质量 (0-63) 控制压缩比,12 为推荐值
  4. PSRAM 是处理高分辨率图片的关键硬件
  5. 拍照后必须释放帧缓冲 (esp_camera_fb_return)