Capture and Save Photo on SDcard with ESP32-CAM
برد esp-cam دارای دوربین بسیار کوچک از مدل OV2640 است. توانایی عکاسی و تصویر برداری در محیطهای مختلف را دارد. این برد با داشتن تراشه وای فای و بلوتوث قابلیت انتشار تصاویر در بستر وب را دارد. همچنین به کمک اسلات میکرو SD روی برد، میتوانیم تصاویر را در کارت حافظه ذخیره کنیم. در این آموزش قصد داریم به شما فرآیند ثیت تا ذخیره تصاویر را در Micro SD به وسیله برد ESP32-CAM آموزش دهیم. در آموزش های قبلی توانستیم براحتی این برد را راه اندازی کنیم و اطلاعات را به مقصد ایمیل خود ارسال کنیم.
تراشه ESP-32 وای فای بلوتوث
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
از دیگر امکانات ماژول 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 برد ESP-Cam
Micro SD یا “Secure Digital” که یک کارت حافظه غیرفرار است که بهطور وسیعی در وسایل قابل حمل مانند تلفن همراه، دوربین دیجیتال، جی پی اس استفاده می شوند. همانطور که اشاره شد ما نیز در این آموزش به منظور ذخیر تصاویر ثبت شده توسط برد از یک Micro sd استفاده می کنیم.
در ضمن لازم به ذکر است با توجه به اطلاعات دیتاشیت های ارائه شده برای برد ESP32-cam، تنها SD های با حافظه حداکثر 4گیگ را پشتیبانی میکند.
این پروژه چطور کار می کند؟!
فرآیند تصویربرداری تا ذخیره در SD تقسیم به چهار مرحله می شود. ابتدا برد در حالت Deep Sleep قرار دارد که این حالت به این معناست که ماژول تا زمانی که ما به آن دستوری ندهیم هیچ کاری انجام نمی دهد و انرژی مصرف نمی کند و به محض Reset کردن برد بوسیله میکرو سوییچ و یا پین های خروجی، برد از حالت خواب بیرون آمده تصویر را ثبت و در SD ذخیره می کند؛ فرمت تصاویر ذخیره شده نیز .jpg می باشند.
آماده کردن Micro SD
قبل شروع به راه اندازی برد بیایید micro SD که برای این پروژه در نظر گرفته ایم را آماده کنیم، خب برای این کار باید SD را فرمت کنیم طبق مراحل زیر پیش بروید. ابتدا بر روی SD مدنظرتون کلیک راست کنید و گزینه Format را انتخاب کنید.
سپس در پنجره باز شده در بخش file system گزینه FAT32 را انتخاب سپس اقدام به فرمت کردن SD بکنید.
راه اندازی 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 |
برای آپلود کد مراحل زیر را دنبال کنید:
- از منوی Tools > Board برد مدنظر خود را انتخاب کنید.
- از منوی Tools > Port پورتی که FTDI پروگرامر به آن متصل شده را انتخاب کنید.
- اقدام به آپلود کد بکنید.
کد مرجع برای ثبت تصاویر
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
<span style="font-size: 14px;">#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() { }</span> |
کد بالا را با توجه به آموزش های ارائه شده در برد ESP32-CAM آپلود کنید.همچنین فراموش نکنید کتابخانه هایی که در پایین با آن ها اشاره می شود، وجود آن ها اجباری بود پس در صورتی که آن را از قبل نصب نکرده اید، اقدام به دانلود و نصب آن ها بکنید.
1 2 3 4 5 6 7 8 |
<span style="font-size: 14px;">#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</span> |
ما در این کد از تنظیمات پیشفرض پین های AI-Thinker استفاده کرده ایم ، شما این کد را با توجه به مدل برد خود تعویض کنید. کد زیر تنظیماتی است که ما در این پروژه استفاده کردیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span style="font-size: 14px;">// 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</span> |
تنظیمان برای مدل WROVER_KIT.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span style="font-size: 14px;">//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</span> |
نتیجه پروژه ESP-Cam
بعد از آپلود، در نرم افزار Arduino ID، سریال مانیتور را باز کنید و باد ریت را بر روی 115200 تنظیم کنید، به محض اینکه دکمه ریست بر روی برد را فشار دهید. مراحل ثبت و ذخیره عکس صورت میگرد و همچنین LED فلش موجود در مدار ESP-CAM نیز که به GPIO4 متصل است برای لحظاتی فعال و سپس غیر فعال می شود. همچنین نمام مراحل در سریال مانیتور آردوینو به نمایش در می آید.
در این مرحله با خواندن اطلاعات SD می توانیم تصاویر ثبت شده را مشاهده کنیم.
وسایل مورد نیاز
برد ESP32-CAM
ماژول FTDI پروگرامر