ESP32 CAM, falla tarjeta micro sd

buenas tardes, primero quisiera presentarme, soy muy novato, tanto en Arduino como en este foro, por lo que si cometo algún error, ruego me disculpen y me ayuden a ir aprendiendo y mejorando, por ello doy las gracias de corazón a todos los que aportan su conocimiento para que los novatos podamos ir creciendo.
el tema es el siguiente:
Tengo una IA Thinker ESP32 CAM, el proyecto que tengo entre manos es grabar videos en la tarjeta micro sd que incorpora esta placa, al mismo tiempo a través de wifi ver las imágenes en tiempo real en un móvil.
he utilizado el Github Copilot para hacer el código, en un principio me ha proporcionado uno que se ha compilado bien, pero el monitor serial termina diciendo que la tarjeta sd falla, evidentemente hay algo que no estoy haciendo bien, he buscado en el foro y no encuentro ninguna entrada que me pueda ayudar, por eso inicio este hilo, estoy utilizando una tarjeta de 64 Gb, el código que me ha proporcionado el copilot es el siguiente:

#include "esp_camera.h"
#include "FS.h"
#include "SD_MMC.h"
#include <WiFi.h>
#include <WebServer.h>

// Replace with your network
const char* ssid = "  mi SSID";
const char* password = "mi password";

// Camera settings
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h" 

// Web server
WebServer server(80);

void startCameraServer();

void setup() {
  Serial.begin(115200);
  // Initialize the camera
  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.pin_xclk = XCLK_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_UXGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;

  // Camera init
  if (esp_camera_init(&config) != ESP_OK) {
    Serial.println("Camera init failed");
    return;
  }

  // Initialize SD card
  if (!SD_MMC.begin()) {
    Serial.println("SD Card Mount Failed");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Start the camera server
  startCameraServer();
}

void loop() {
  // Handle web server
  server.handleClient();
}

void startCameraServer() {
  server.on("/", HTTP_GET, []() {
    server.send(200, "text/plain", "ESP32-CAM Video Streaming");
  });

  server.on("/capture", HTTP_GET, []() {
    camera_fb_t * fb = esp_camera_fb_get();
    if (!fb) {
      server.send(500, "text/plain", "Camera capture failed");
      return;
    }
    File file = SD_MMC.open("/capture.jpg", FILE_WRITE);
    if (!file) {
      server.send(500, "text/plain", "Failed to open file in writing mode");
      return;
    }
    file.write(fb->buf, fb->len);
    file.close();
    esp_camera_fb_return(fb);
    server.send(200, "text/plain", "Capture saved to SD card");
  });

  server.on("/stream", HTTP_GET, []() {
    server.sendHeader("Access-Control-Allow-Origin", "*");
    server.sendHeader("Content-Type", "multipart/x-mixed-replace; boundary=frame");
    while (true) {
      camera_fb_t * fb = esp_camera_fb_get();
      if (!fb) {
        Serial.println("Camera capture failed");
        continue;
      }
      server.sendContent("--frame\r\n");
      server.sendContent("Content-Type: image/jpeg\r\n\r\n");
      server.sendContent((const char *)fb->buf, fb->len);
      server.sendContent("\r\n");
      esp_camera_fb_return(fb);
      if (server.client().available() == 0) break;
    }
  });

  server.begin();
}

y el mensaje que da el serial monitor es:

load:0x3fff0030,len:4832

load:0x40078000,len:16460

load:0x40080400,len:4

load:0x40080404,len:3504

entry 0x400805cc

E (721) vfs_fat_sdmmc: mount_to_vfs failed (0xffffffff).

SD Card Mount Failed

no sé si será suficiente información, muchas gracias por su apoyo.

Is the card formatted by windows as FAT? BTW, max size is 32GB.

Ese código no funciona porque es algo viejo
Prueba este

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

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//
//            You must select partition scheme from the board menu that has at least 3MB APP space.
//            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 
//            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well

// ===================
// Select camera model
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
// ** Espressif Internal Boards **
#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM
#include "camera_pins.h"

// ===========================
// Enter your WiFi credentials
// ===========================
const char* ssid = "SSID";
const char* password = "password";

void startCameraServer();
void setupLedFlash(int pin);

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_UXGA;
  config.pixel_format = PIXFORMAT_JPEG; // for streaming
  //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 12;
  config.fb_count = 1;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(config.pixel_format == PIXFORMAT_JPEG){
    if(psramFound()){
      config.jpeg_quality = 10;
      config.fb_count = 2;
      config.grab_mode = CAMERA_GRAB_LATEST;
    } else {
      // Limit the frame size when PSRAM is not available
      config.frame_size = FRAMESIZE_SVGA;
      config.fb_location = CAMERA_FB_IN_DRAM;
    }
  } else {
    // Best option for face detection/recognition
    config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
    config.fb_count = 2;
#endif
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  if(config.pixel_format == PIXFORMAT_JPEG){
    s->set_framesize(s, FRAMESIZE_QVGA);
  }

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

#if defined(CAMERA_MODEL_ESP32S3_EYE)
  s->set_vflip(s, 1);
#endif

// Setup LED FLash if LED pin is defined in camera_pins.h
#if defined(LED_GPIO_NUM)
  setupLedFlash(LED_GPIO_NUM);
#endif

  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");
}

void loop() {
  // Do nothing. Everything is done in another task by the web server
  delay(10000);
}

buenas tardes, siento no haberte dado las gracias antes, pero estoy peleándome con la plaquita, (va ganando ella), en principio parece que compila bien, pero me da un error que parece ser que no se actualiza, está como pillada y la verdad es que no lo entiendo porque ha estado funcionando bien, la tenia configurada con el código del ejemplo camerawebserver y ha estado haciendo su labor, me da este error:

El Sketch usa 972145 bytes (30%) del espacio de almacenamiento de programa. El máximo es 3145728 bytes.
Las variables Globales usan 48096 bytes (14%) de la memoria dinámica, dejando 279584 bytes para las variables locales. El máximo es 327680 bytes.
esptool.py v4.6
Serial port COM5
Connecting......................................

A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0xb)! The chip needs to be in download mode.
For troubleshooting steps visit: Troubleshooting - ESP32 - — esptool.py latest documentation
Failed uploading: uploading error: exit status 2

evidentemente dice que la placa no está en modo de descarga, he mirado la pagina de espressif, donde identifica este error y he seguido (o por lo menos creo que lo he hecho) las indicaciones de esta, pero nada no hay forma, voy a tomarme un descanso, ya sabes cuándo algo no sale es mejor relajarse y respirar, también he cambiado la tarjeta a una de menos GBs, en concreto 16, pero por ahora todo sigue igual, por cierto he intentado cargar el ejemplo de camerawebserver otra vez, ya que había funcionado bien, pero me da el mismo error, en fin, seguiremos....
hay una duda que me gustaría preguntarte, ya que en el código habla de jpg, que son fotos y yo lo que quiero es grabar video, este código serviría para mi propósito, muchas gracias por tu ayuda.

muchas gracias sonofcy por tu ayuda, he cambiado la tarjeta por una de menos capacidad, en concreto 16GB, aunque ahora tengo otros problemas tal y como le comento a Surbyte.

Prueba manteniendo pulsado el botón "BOOT" o "IO0" cuando aparezca "Connecting...". Lo sueltas cuando conecta (te vas a dar cuenta)

Seguramente tu placa no tiene el capacitor de 1uF entre el pin "Enable" y GND, por eso no entra en modo programación automáticamente.

muchas gracias máximo, me explico...….
en principio he hecho lo que me comentas, pero seguía dándome el mismo error, una curiosidad es que desde que se comenzó el problema, el led que actúa de flash estaba siempre encendido, así que he desconectado la placa y he separado la parte de la cámara de la controladora......al volver a montarla y encenderla, albricias....ha cargado correctamente, una maravilla, pero curiosamente me ha dado la misma IP que tenía antes de cargar este código, y parece que no lo engancha bien.....voy a repetir el proceso a ver si me da una IP mejor y consigo engancharla.....muchas gracias, vuestra ayuda es extraordinaria, soy feliz de haber entrado en este foro, y que un tarugo como yo sea capaz de hacer funcionar un aparato...jajajajajaja

pues nada lo he intentado varias veces pero me da la misma IP, parece que está conectada pero no termina de enganchar, seguiré investigando, si tenéis alguna sugerencia será de agradecer, solo una vez salió la interfaz de la cámara, pero no se veía la imagen, debe se ser una chuminada.....pero ya sabéis las cosas mas simples son las que mas lata dan...…¿debería volver a cargar el código? y reiniciar el proceso.


Te simplifico todo acá.
No hay forma de hacerlo mal.

Generalmente el router memoriza la IP que asignó a determinada MAC y la vuelve a asignar cuando el dispositivo se reconecta, por eso te da la misma IP.

Reinicia el router.

yo tengo la ESP32 CAM y la base con la controladora todo en un paquete, efectivamente se solucionó, desconectando la placa y separando la esp de la controladora, al volverlo a montar, se cargo el código sin problema, ahora lo que tengo que hacer es conseguir una IP nueva, voy a probar como dices a reiniciar el router, hoy me lo he tomado de descanso playero, llevo todo el verano sin pisar la playa y eso siendo de algeciras es un delito, por cierto si alguna vez venís por aquí, buscadme que estáis invitados a unas pocas de cervezas, jejejeej

Y aún así es posible que el router le vuelva a asignar la misma IP

@algeclon ¿porque necesitas que le asigne una IP diferente?

Si por el motivo que sea necesitas que la IP asignada por DHCP tenga menos tiempo de vida tendrías que ver el apartado DHCP Server Lease Time en tu router si tienes posibilidad de acortarle el tiempo de vida a la IP asignada y aún así es posible que en la tabla ARP del router se almacene la IP asignada a una MAC y siga asignándole la misma IP.

EDITO: También podrías forzar el cambio de IP desde el propio dispositivo (en tu caso ESP32 CAM) incluyendo en tu código los siguientes comandos:

ipconfig /release seguido de ipconfig /renew -> en Windows

dhclient -r seguido de dhclient -> en Linux

En Arduino no se como se podrían implementar estos comandos porque no he tocado nunca temas Ethernet en el ambito de Arduino.

No entiendo muy bien lo de

...voy a repetir el proceso a ver si me da una IP mejor y consigo engancharla..

Qué es una IP mejor? Si quieres una IP en particular seguro que puedes definirla como IP fija. Sinceramente no lo he hecho, pero seguro que la librería Wifi tiene opción para hacerlo. Al menos en la documentación lo indica.

buenos días, quizás no haya utilizado la expresión adecuada, al asignarme la misma IP que un código anterior, he pensado que por eso no se iniciaba la cámara, he hecho la sugerencia de surbyte y al reiniciar el router efectivamente me ha dado otra IP distinta, pero sigue sin iniciarse la cámara, por lo que entiendo que debe haber algo en el código que falla, voy a seguir con ello a ver si descubro el problema, no se enfade usted, yo sé que los novatos a veces exasperamos, pero algún día aprenderé, gracias a vuestros consejos, muchas gracias

gracias tresvdoble, en principio me ha dado una IP distinta, pero sigue sin entrar la cámara, voy a ver si me ubico con esto que usted me dice, gracias

¡en absoluto enfado¡ :slightly_smiling_face: Seguro que yo he hecho muchos más fallos que tú! Y cuando algo no me sale, seguro que soy más pesado que nadie.:slightly_smiling_face:. Las ganas de aprender es lo mejor que hay.

Cambiar de ip usando DHCP o tener IP fija no tiene nada que ver con que se conecte, debe hacerlo de ambos modos.
Revisa la seguridad de tu Router y comenta aquí. Yo he tenido problema con algunas configuraciones.
Haz una prueba, baja el nivel de seguridad solo para probar no lo quites, reduce el nivel, y nos cuentas si se conecta o no?
Ej: de WPA2 a WPA por ejemplo con las variantes de cada router o marca.

mi router tiene WPA2 y WPA+WPA2 o off, he probado a ponerlo en WPA2, pero sigue sin entrar la cámara, aunque aclaro un punto, estoy utilizando el móvil como router o punto de acceso, ya que el proyecto implica que grabe in itinere y quiero utilizar el móvil como tal, entonces tengo un lio de wifis, un router principal, pero donde tengo el ordenador está conectado a través de un plc, que tiene otra SSID y contraseña, esta es donde esta conectado el movil, o sea que puede ser que todo este lio de wifis, sea el causante

Ahh bueno, porque no partes de algo simple, prueba con el router de tu casa, si conecta listo. El problema lo tienes con tu móvil.