Capture and Save Photo on SDcard with ESP32-CAM

  • by

برد esp-cam دارای دوربین بسیار کوچک از مدل OV2640 است. توانایی عکاسی و تصویر برداری در محیط‌های مختلف را دارد. این برد با داشتن تراشه وای فای و بلوتوث قابلیت انتشار تصاویر در بستر وب را دارد. همچنین به کمک اسلات میکرو SD روی برد، میتوانیم تصاویر را در کارت حافظه ذخیره کنیم. در این آموزش قصد داریم به شما فرآیند ثیت تا ذخیره تصاویر را در Micro SD به وسیله برد ESP32-CAM آموزش دهیم. در آموزش های قبلی توانستیم براحتی این برد را راه اندازی کنیم و اطلاعات را به مقصد ایمیل خود ارسال کنیم.


تراشه ESP-32 وای فای بلوتوث


ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوت‌های آن بلوتوث داخلی‌اش می‌باشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC می‌باشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی می‌باشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیق‌تر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته می‌شود.

دخیره تصاویر در micro sd esp32-cam

از دیگر امکانات ماژول ESP32-cam می‌توان به دوربین OV2640 با قابلیت ثبت تصویر با فرمت JPEG, BMP, grayscale اشاره کرد. همچنین با LED flash مونتاژ شده بر روی این ماژول قادر به تصویر برداری در مکان‌های تاریک نیز خواهید بود. یکی از ویژگی‌های کاربردی این ماژول ورودی micro SD با قابلیت ارتقا تا ۴GB است که به کاربر اجازه ذخیره تصاویر را هم می‌دهد.


دوربین OV2640 برد ESP-Cam


شاید برای شما سوال پیش آمده باشد که دوربین مورد استفاده در ESP-32cam چند مگاپیکسل کیفیت دارد، ولتاژ راه اندازی آن چقدر است و یا اصلا اسم این ذوربین چیست؟! خب این دوربین با پارت OV2640 یافت می شود و ولتاژ ورودی 3.3 ولت دارد و کیفیت آن نیز 2 مگاپیکسل می باشد. کمترین فریم ریت این دوربین در حالت UXGA/SXGA ، پانزده فریم بر ثانیه و بیشترین فریم ریت آن در حالت CIF شصت فریم بر ثانیه می باشد. از سری دیگر دوربین های OV می توان به OV5640 اشاره کرد با کیفیت 5 مگاپیکسل.

دخیره تصاویر در micro sd esp32-cam


کارت حافظه Micro SD برد ESP-Cam


Micro SD یا “Secure Digital” که یک کارت حافظه غیرفرار است که به‌طور وسیعی در وسایل قابل حمل مانند تلفن همراه، دوربین دیجیتال، جی پی اس استفاده می شوند. همانطور که اشاره شد ما نیز در این آموزش به منظور ذخیر تصاویر ثبت شده توسط برد از یک Micro sd استفاده می کنیم.

دخیره تصاویر در micro sd esp32-cam

در ضمن لازم به ذکر است با توجه به اطلاعات دیتاشیت های ارائه شده برای برد ESP32-cam، تنها SD های با حافظه حداکثر 4گیگ را پشتیبانی میکند.


این پروژه چطور کار می کند؟!


فرآیند تصویربرداری تا ذخیره در SD تقسیم به چهار مرحله می شود. ابتدا برد در حالت Deep Sleep قرار دارد که این حالت به این معناست که ماژول تا زمانی که ما به آن دستوری ندهیم هیچ کاری انجام نمی دهد و انرژی مصرف نمی کند و به محض Reset کردن برد بوسیله میکرو سوییچ و یا پین های خروجی، برد از حالت خواب بیرون آمده تصویر را ثبت و در SD ذخیره می کند؛ فرمت تصاویر ذخیره شده نیز .jpg می باشند.


آماده کردن Micro SD


قبل شروع به راه اندازی برد بیایید micro SD که برای این پروژه در نظر گرفته ایم را آماده کنیم، خب برای این کار باید SD را فرمت کنیم طبق مراحل زیر پیش بروید. ابتدا بر روی SD مدنظرتون کلیک راست کنید و گزینه Format را انتخاب کنید.

دخیره تصاویر در micro sd esp32-cam

سپس در پنجره باز شده در بخش file system گزینه FAT32 را انتخاب سپس اقدام به فرمت کردن SD بکنید.

دخیره تصاویر در micro sd esp32-cam


راه اندازی ESP-32cam


برای پروگرام کردن برد ESP-CAM نیاز به نرم افزار Arduino-IDE داریم و البته دانلود برد مربوط در محیط نرم افزار و همچنین نصب کتابخانه های مورد نیاز، برای اطلاع از این موارد می توانید به این آموزش مراجعه کنید. در این بخش خلاصه ای از مراحل پروگرام کردن ESP32-CAM را مرور می کنیم. ابتدا اتصالات زیر را با FTDI پروگرامر و ESP-CAM برقرار کنید.

ESP32-CAM FTDI Programmer
GND GND
5V VCC (5V)
U0R TX
U0T RX
GPIO 0 GND

برای آپلود کد مراحل زیر را دنبال کنید:

  1. از منوی Tools Board برد مدنظر خود را انتخاب کنید.
  2. از منوی Tools Port پورتی که FTDI پروگرامر به آن متصل شده را انتخاب کنید.
  3. اقدام به آپلود کد بکنید.

کد مرجع برای ثبت تصاویر


#include "esp_camera.h"
#include "Arduino.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 "driver/rtc_io.h"
#include <EEPROM.h>            // read and write from flash memory

// define the number of bytes you want to access
#define EEPROM_SIZE 1

// 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;

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; 
  
  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");
  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();
  esp_camera_fb_return(fb); 
  
  // 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);
  
  delay(2000);
  Serial.println("Going to sleep now");
  delay(2000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

void loop() {
  
}

 کد بالا را با توجه به آموزش های ارائه شده در برد ESP32-CAM آپلود کنید.همچنین فراموش نکنید کتابخانه هایی که در پایین با آن ها اشاره می شود، وجود آن ها اجباری بود پس در صورتی که آن را از قبل نصب نکرده اید، اقدام به دانلود و نصب آن ها بکنید.

#include "esp_camera.h"
#include "Arduino.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 "driver/rtc_io.h"
#include <EEPROM.h>            // read and write from flash memory

ما در این کد از تنظیمات پیشفرض پین های AI-Thinker استفاده کرده ایم ، شما این کد را با توجه به مدل برد خود تعویض کنید. کد زیر تنظیماتی است که ما در این پروژه استفاده کردیم.

// 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

تنظیمان برای مدل WROVER_KIT.

//Pin definition for CAMERA_MODEL_WROVER_KIT
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    21
#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      19
#define Y4_GPIO_NUM      18
#define Y3_GPIO_NUM       5
#define Y2_GPIO_NUM       4
#define VSYNC_GPIO_NUM   25
#define HREF_GPIO_NUM    23
#define PCLK_GPIO_NUM    22

نتیجه پروژه ESP-Cam


بعد از آپلود، در نرم افزار Arduino ID، سریال مانیتور را باز کنید و باد ریت را بر روی 115200 تنظیم کنید، به محض اینکه دکمه ریست بر روی برد را فشار دهید. مراحل ثبت و ذخیره عکس صورت میگرد و همچنین LED فلش موجود در مدار ESP-CAM نیز که به GPIO4 متصل است برای لحظاتی فعال و سپس غیر فعال می شود. همچنین نمام مراحل در سریال مانیتور آردوینو به نمایش در می آید.

دخیره تصاویر در micro sd esp32-cam

در این مرحله با خواندن اطلاعات SD می توانیم تصاویر ثبت شده را مشاهده کنیم.


وسایل مورد نیاز


برد ESP32-CAM

ماژول FTDI پروگرامر

Leave a Reply

Your email address will not be published. Required fields are marked *