ESP32-CAM模块Arduino环境搭建测试

ESP32-CAM模块Arduino环境搭建测试

一.ESP32+OV2640摄像头模块CameraWebServer视频查看

二.测试ESP32-CAM(后续称cam模块)代码是否上传执行成功测试

const int led0 = 12;
const int led1 = 13;

void setup() {
    // put your setup code here, to run once:
    pinMode(led0, OUTPUT);
    pinMode(led1, OUTPUT);
}

void loop() {
    // put your main code here, to run repeatedly:
    digitalWrite(led0, HIGH);
    digitalWrite(led1, HIGH);
    delay(5000);
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    delay(500);
}

PS:上叙代码是测试cam模块代码是否执行成功

二.由于之前使用的是Arduino IDE 1.8.5版本,ESP32-CAM模块上传代码后报错 Camera probe failed with error 0x105(ESP_ERR_NOT_FOUND) Camera init failed with error 0x105 , 代码如下

代码片段①

#include <esp_camera.h>

// 定义摄像头模块的引脚连接
#define CAMERA_MODEL_AI_THINKER // 如果你使用的是 AI Thinker 摄像头模块,请取消注释此行
//#define CAMERA_MODEL_M5STACK_PSRAM // 如果你使用的是 M5Stack 摄像头模块,请取消注释此行

const int ledPin = 4; // 摄像头准备拍照时闪烁的 LED 引脚

void setup() {
  Serial.begin(115200);

  // 配置摄像头模块
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5;
  config.pin_d1 = 18;
  config.pin_d2 = 19;
  config.pin_d3 = 21;
  config.pin_d4 = 36;
  config.pin_d5 = 39;
  config.pin_d6 = 34;
  config.pin_d7 = 35;
  config.pin_xclk = 0;
  config.pin_pclk = 22;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_RGB565;
  config.frame_size = FRAMESIZE_QVGA; // 设置图像分辨率为QVGA

  // 摄像头初始化
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头初始化失败: %s", esp_err_to_name(err));
    return;
  }

  // 设置 LED 引脚为输出模式
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 拍照
  camera_fb_t *fb = NULL;
  fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("获取图像缓冲区失败");
    return;
  }

  // 在串口打印图像大小
  Serial.printf("分辨率: %dx%d, 图像大小: %u bytes\n", fb->width, fb->height, fb->len);

  // 闪烁 LED 表示拍照完成
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);

  // 释放图像缓冲区
  esp_camera_fb_return(fb);
}

ps:上叙代码片段报错 Camera probe failed with error 0x105(ESP_ERR_NOT_FOUND) Camera init failed with error 0x105,
获取图像失败!

代码片段②

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <esp_camera.h>

// WiFi 参数
const char* ssid = "your_SSID";
const char* password = "12345678";

// 定义摄像头模块的引脚连接
#define CAMERA_MODEL_AI_THINKER // 如果你使用的是 AI Thinker 摄像头模块,请取消注释此行
//#define CAMERA_MODEL_M5STACK_PSRAM // 如果你使用的是 M5Stack 摄像头模块,请取消注释此行

// 创建 AsyncWebServer 实例
AsyncWebServer server(80);

void setup() {
  Serial.begin(115200);
  
  // 连接到 Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Wi-Fi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  // 配置摄像头模块
  camera_config_t config;
  // 省略摄像头配置参数设置
  
  // 摄像头初始化
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头初始化失败: %s", esp_err_to_name(err));
    return;
  }
  
  // 设置路由和处理程序
  server.on("/", HTTP_GET, handleRoot);
  server.on("/stream", HTTP_GET, handleStream);
  
  // 启动服务器
  server.begin();
  Serial.println("Server started");
}

void loop() {
  // 不需要代码
}

// 处理根路径请求的处理程序
void handleRoot(AsyncWebServerRequest* request) {
  request->send(200, "text/plain", "Hello from ESP32!");
}

// 处理图像流请求的处理程序
void handleStream(AsyncWebServerRequest* request) {
  // 设置图像类型为 multipart/x-mixed-replace
  request->sendHeader("Content-Type", "multipart/x-mixed-replace; boundary=boundary");

  while (true) {
    // 拍照
    camera_fb_t* fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("获取图像缓冲区失败");
      break;
    }
  
    // 发送图像数据
    request->send_P(200, "image/jpeg", (const char*)fb->buf, fb->len);

    // 释放图像缓冲区
    esp_camera_fb_return(fb);
  
    // 延时一段时间,控制图像刷新率
    delay(100);
  }
}


串口报错 Camera probe failed with error 0x105(ESP_ERR_NOT_FOUND) Camera init failed with error 0x105, 报错ESPAsyncWebServer.h,esp_camera.h not found , 获取图像失败!

代码片段③

#include "esp_camera.h"

// 定义摄像头配置
camera_config_t config;

void setup() {
  Serial.begin(115200);

  // 配置摄像头
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 32;
  config.pin_d1 = 35;
  config.pin_d2 = 34;
  config.pin_d3 = 5;
  config.pin_d4 = 39;
  config.pin_d5 = 18;
  config.pin_d6 = 36;
  config.pin_d7 = 19;
  config.pin_xclk = 27;
  config.pin_pclk = 21;
  config.pin_vsync = 25;
  config.pin_href = 26;
  config.pin_sscb_sda = 22;
  config.pin_sscb_scl = 23;
  config.pin_reset = -1; // 不使用复位引脚
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;

  // 启动摄像头
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头启动失败!错误代码: 0x%x\n", err);
    return;
  }

  Serial.println("摄像头已启动!");
}

void loop() {
  // 捕获图像
  camera_fb_t *fb = esp_camera_fb_get();

  if (!fb) {
    Serial.println("获取图像失败!");
    Serial.print("fb = ");
    Serial.println((unsigned long)fb);
    return;
  }

  // 打印图像数据
  for (size_t i = 0; i < fb->len; i++) {
    Serial.write(fb->buf[i]);
  }

  // 释放图像缓存
  esp_camera_fb_return(fb);

  delay(1000); // 延迟1秒后再次捕获图像
}

上叙代码还是同样报错,导致一度怀疑摄像头是坏的

三.成功运行成功代码.

PS 后经过查询,看到很多博主教程中使用的都是Arduino 版本都是比本人使用的高,并且选择的工具开发板是AI -Thinker ESP32-CAM, 本人使用的1.8.5版本经过折腾始终没有出现AI-Thinker ESP32-CAM选项, 干脆升级到了 Arduino 2.1.0 版本
安装过程中使用魔法后依然报错Error: 2 UNKNOWN: Get “https://github.com/espressif/crosstool-NG/releases/download/esp-2021r2-patch5/xtensa-esp32-elf-gcc8_4_0-esp-2021r2-patch5-win64.zip”: dial tcp 20.205.243.166:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 解决办法直接使浏览器贴入https://github.com/espressif/crosstool-NG/releases/download/esp-2021r2-patch5/xtensa-esp32-elf-gcc8_4_0-esp-2021r2-patch5-win64.zip, 下载下来后,粘贴到 C:\Users\Search\AppData\Local\Arduino15\staging\packages, 注:每个人电脑C:\Users\Search\路径不一样, 然后接着点击安装在这里插入图片描述
新版本 2.0.11也尝试安装但是失败
文件首选项开发板管理器地址中的https://dl.espressif.com/dl/package_esp32_index.json,经过查询最新版本只能到1.0.6
https://arduino.me/packages/esp32.json经过查看最新版本能到2.0.9
在这里插入图片描述
猜测是导致2.0.11安装失败的原因吧,

当你安装成功后
在这里插入图片描述

四.运行示例代码注意事项

在这里插入图片描述
在这里插入图片描述

验证代码过程中会报错项目太大了;阅读以下页面的提示减小文件大小。
http://www.arduino.cc/en/Guide/Troubleshooting#size
为开发板 ESP32 Wrover Module 编译时出错。
解决办法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

五. 无法进行人脸识别,需要修改代码app_httpd.cpp

line 280~290 行间的free() 改成 dl_lib_free()
if (net_boxes){
        detected = true;
        if(recognition_enabled){
            face_id = run_face_recognition(image_matrix, net_boxes);
        }
        draw_face_boxes(image_matrix, net_boxes, face_id);
        free(net_boxes->score);
        free(net_boxes->box);
        free(net_boxes->landmark);
        free(net_boxes);
    }
    



line 378~388 行间的free() 改成 dl_lib_free()
 if(net_boxes){
      detected = true;
      if(recognition_enabled){
          face_id = run_face_recognition(image_matrix, net_boxes);
      }
      fr_recognize = esp_timer_get_time();
      draw_face_boxes(image_matrix, net_boxes, face_id);
      free(net_boxes->score);
      free(net_boxes->box);
      free(net_boxes->landmark);
      free(net_boxes);
  }


<think>好的,我现在需要解决用户提出的关于ESP32相机探针失败错误0x105的问题。首先,我得回顾用户提供的引用内容,看看有哪些可能的原因和解决方法。 根据引用[1],错误0x105对应的是ESP_ERR_NOT_FOUND,这通常意味着设备未找到。可能的原因包括硬件连接问题、电源不稳定、I/O配置错误或固件配置错误。例如,摄像头模块可能没有正确连接到ESP32-S3的引脚,或者使用的引脚与代码中的配置不匹配。 引用[3]提到在camera_probe函数中执行传感器软件复位,如果复位失败可能导致此错误。这里需要检查传感器的reset函数是否正确执行,可能是传感器本身的问题或者驱动不兼容。 引用[4]指出摄像头传感器的探测和初始化函数存储在g_sensors数组中。如果摄像头型号未被正确识别,探测函数可能失败,导致错误。因此,用户需要确认摄像头型号是否在支持列表中,并正确配置CAMERA_MODEL设置。 引用[5]提到在app_main中错误地调用vTaskStartScheduler()可能导致问题。这提示我需要检查用户的代码是否存在不必要或重复的任务调度器启动调用,这可能会干扰摄像头初始化流程。 接下来,我需要将这些可能的原因整理成清晰的步骤,帮助用户逐一排查。首先检查硬件连接,确保摄像头模块正确连接且电源稳定。然后核对引脚配置,确保与代码中的定义一致。接着确认摄像头型号是否被支持,并检查固件配置是否正确,例如选择正确的摄像头模型。此外,检查驱动代码是否有误,特别是探测和初始化部分。还要注意是否有固件版本兼容性问题,可能需要更新ESP-IDF或摄像头驱动。最后,查看是否存在软件冲突,如错误的任务调度调用。 在解决方法部分,需要指导用户如何修正硬件连接、调整配置、更新驱动,以及如何调试代码。例如,使用示例代码进行测试,启用日志输出以获取更多信息,检查电源稳定性,并处理固件中的冲突。 最后,生成相关问题,帮助用户进一步解决可能遇到的其它问题,比如摄像头初始化失败的其他原因、固件兼容性问题、硬件调试技巧以及如何支持其他摄像头型号。</think>### ESP32 Camera Probe Failed 错误0x105 原因与解决方案 #### 错误原因分析 1. **硬件未正确连接** - 摄像头模块ESP32-S3的物理连接(如SCCB/I2C、数据引脚、电源)未接通或接触不良[^1][^3]。 - 电源供电不足,导致传感器无法正常响应(如摄像头模块需要独立稳压电源)。 2. **引脚配置错误** - 在代码中定义的摄像头引脚(如`XCLK`、`PCLK`、`VSYNC`)与实际硬件连接不匹配[^3]。 - 引脚复用冲突(例如与其他外设共用同一引脚)[^2]。 3. **摄像头型号不支持** - 使用的摄像头型号未包含在ESP32-CAM驱动支持的列表中(如OV2640、OV7670等),导致探测函数`camera_probe`无法识别传感器[^4]。 4. **固件配置问题** - 未正确配置`menuconfig`中的摄像头参数(如未选择`CONFIG_ESP32_CAMERA_SUPPORT`)。 - 驱动代码中摄像头初始化流程错误(如未调用`esp_camera_init()`或参数配置错误)[^5]。 5. **软件冲突** - 在`app_main`中错误调用`vTaskStartScheduler()`导致任务调度冲突。 --- #### 解决方案步骤 1. **检查硬件连接** - 使用万用表确认摄像头模块ESP32-S3的电源(3.3V)、GND、信号线(如SDA、SCL)连通。 - 为摄像头模块单独提供稳压电源(避免因瞬时电流不足导致初始化失败)。 2. **核对引脚配置** - 在代码中严格匹配摄像头引脚定义,例如: ```c camera_config_t config = { .pin_pwdn = GPIO_NUM_32, .pin_reset = GPIO_NUM_NC, .pin_xclk = GPIO_NUM_0, // 其他引脚配置需与硬件一致 }; ``` 3. **确认摄像头型号支持** - 检查摄像头型号是否在`g_sensors[]`列表中(如OV2640需配置`CAMERA_MODEL_ESP32S3_EYE`)。 - 在`menuconfig`中选择对应的摄像头型号: ```bash idf.py menuconfig → Component config → ESP32 CameraCamera Pin Configuration ``` 4. **更新驱动与固件** - 更新ESP-IDF至最新版本(已知早期版本对部分摄像头兼容性较差): ```bash git clone --recursive https://github.com/espressif/esp-idf.git ``` - 确保`esp32-camera`驱动子模块已正确初始化: ```bash git submodule update --init --recursive ``` 5. **调试与日志分析** - 启用详细日志输出以定位故障阶段: ```c esp_log_level_set("camera", ESP_LOG_DEBUG); ``` - 若日志显示`SW reset of sensor failed`,可能是传感器复位信号未正确触发。 --- #### 示例代码修正 ```c // 正确初始化流程示例 void app_main() { // 不要手动调用 vTaskStartScheduler() [^5] camera_config_t config = { .pin_pwdn = GPIO_NUM_15, .pin_reset = GPIO_NUM_NC, .pin_xclk = GPIO_NUM_2, .pin_sscb_sda = GPIO_NUM_12, .pin_sscb_scl = GPIO_NUM_11, .pixel_format = PIXFORMAT_JPEG, .frame_size = FRAMESIZE_SVGA, .jpeg_quality = 12, .fb_count = 1 }; esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { ESP_LOGE(TAG, "Camera init failed: 0x%x", err); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值