-1

I am getting an error that the sd card cant be mounted when the ESP32 comes out of deep sleep. The board is coded to wake up on a timer from deep sleep and mount the sd card and take a picture. My question is how can I get the SD card to mount properly? I am providing 3volts to the board and I think the same error happens when 5volts is applied. Here is the code:

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-take-photo-save-microsd-card

  IMPORTANT!!! 
   - Select Board "ESP32 Wrover Module"
   - Select the Partion Scheme "Huge APP (3MB No OTA)
   - GPIO 0 must be connected to GND to upload a sketch
   - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include "esp_camera.h"
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "fd_forward.h"
#include "fr_forward.h"
#include "FS.h"                // SD Card ESP32
#include "SD_MMC.h"            // SD Card ESP32
#include "soc/soc.h"           // Disable brownour problems
#include "soc/rtc_cntl_reg.h"  // Disable brownour problems
#include "dl_lib.h"
#include "driver/rtc_io.h"
#include <EEPROM.h>            // read and write from flash memo
// define the number of bytes you want to access
#define EEPROM_SIZE 1


RTC_DATA_ATTR int bootCount = 0;
// Pin definition for CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#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
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

int pictureNumber = 0;

#define uS_TO_S_FACTOR 1000000

#define TIME_TO_SLEEP  60

void setup() {


  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector

  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_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;
  config.pixel_format = PIXFORMAT_JPEG; 
  //pinMode(4, INPUT);
  //digitalWrite(4, LOW);

  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // Init Camera
  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("Starting SD Card");
  delay(2000);
  if(!SD_MMC.begin()){
    Serial.println("SD Card Mount Failed");
    //return;
  }

  uint8_t cardType = SD_MMC.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD Card attached");
    return;
  }

  camera_fb_t * fb = NULL;

  // Take Picture with Camera
  fb = esp_camera_fb_get();  
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  // initialize EEPROM with predefined size
  EEPROM.begin(EEPROM_SIZE);
  pictureNumber = EEPROM.read(0) + 1;

  // Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";

  fs::FS &fs = SD_MMC; 
  Serial.printf("Picture file name: %s\n", path.c_str());

  File file = fs.open(path.c_str(), FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file in writing mode");
  } 
  else {
    file.write(fb->buf, fb->len); // payload (image), payload length
    Serial.printf("Saved file to path: %s\n", path.c_str());
    EEPROM.write(0, pictureNumber);
    EEPROM.commit();
  }
  file.close();
  delay(2000);
  // Turns off the ESP32-CAM white on-board LED (flash) connected to GPIO 4
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  rtc_gpio_hold_en(GPIO_NUM_4);

  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);


  Serial.println("Going to sleep now");

  delay(2000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

void loop() {

}

also here is the board I am using

Here is output of the error:

rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8
Starting SD Card
E (4147) sdmmc_sd: sdmmc_check_scr: send_scr returned 0xffffffff
SD Card Mount Failed
No SD Card attached

Here is a diagram of the pins used by the SD card and Camera. Although I have nothing hooked up to them currently

enter image description here

  • try SD_MMC.end() before deep sleep – Juraj Jun 27 '19 at 13:40
  • Still fails. @Juraj. I had actually tried stop, quit, exit.. and a few others. But yes, it still fails when I use SD_MMC.end() before deep sleep begins. I will try it now with 5 volts though. EDIT: it also fails on 5 volts – David Graff Jun 27 '19 at 14:04
0

The code I posted forces GPIO4 to hold its value in this line:

rtc_gpio_hold_en(GPIO_NUM_4);

This pin is used for SD card interface. I needed to un-hold it after deep sleep wakeup if I wanted to use the pin again.

  • why do you use for SD card the same pin as used for cam flash LED? – Juraj Jun 27 '19 at 17:44
  • I think it is part of the configuration of the camera. I.E. the LED is part of the camera config? I am not positive. I could use help understanding the pins because I want to use one of them to trigger a reset from code. I am not sure which pin to use however. Here is the tutorial I am following. I am trying to add a PIR sensor to this and reset the board. randomnerdtutorials.com/esp32-cam-take-photo-save-microsd-card/… – David Graff Jun 27 '19 at 18:33
  • Nevermind I was able to get it working using a pull down circuit to pin 13 – David Graff Jun 27 '19 at 18:42
0

You need to initialize SD_MMC to 1 bit mode (by default 4 bit mode) this way the microsd is slow, but you free up 3 pins, GPIO4 too. I had this problem to write on SD when used GPIO4 to switch on/off the flash led.

if (!SD_MMC.begin("/sdcard", true)) { // 1 bit mode Serial.println("SD Card Mount Failed !!!"); return; } YOUR CODE HERE ...

After this I can use GPIO12 as pullup input (tested on my sketch), when it goes to GND the camera will take the frame and save it to microsd (and even send it over TCP socket to Android device and my PC that save to storage memory and show it :D).

GPIO16 don't worked here, it work just one time, then remains LOW and can't be reused.

Note that I do not use sleep function, just check in the loop() the state of GPIO12 to trigger a camera shot.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.