آموزش ESP32 42/55 - گرفتن عکس با دوربین و ذخیره بر روی میکرو SD CAM-1 | کیت ESP32 سون فاوندر
در این آموزش، ما از میکروکنترلر ESP32 به همراه برد توسعه آن از شرکت SunFounder استفاده خواهیم کرد تا با استفاده از یک دوربین عکس بگیریم و آنها را به طور مستقیم روی یک کارت micro SD ذخیره کنیم. این پروژه از قابلیتهای داخلی ESP32، از جمله Wi-Fi و بلوتوث، برای ایجاد یک دستگاه عکسبرداریCompact استفاده میکند. تا پایان این آموزش، شما یک تنظیمات کاربردی خواهید داشت که میتواند عکس بگیرد و ذخیره کند و سپس میتوان به آنها در کامپیوتر دسترسی پیدا کرد.
برای کسانی که تازه با اکوسیستم ESP32 آشنا شدهاند، این کیت یک پلتفرم چندمنظوره برای پروژههای مختلف، از جمله این پروژه، فراهم میکند. دوربینی که در این پروژه استفاده شده، OV2640 است که وضوحی معادل 1600x1200 پیکسل ارائه میدهد. اگرچه ممکن است کیفیتمانند گوشیهای هوشمند مدرن نباشد، اما برای کارهای پایهای ثبت تصویر کافی است. برای روشن شدن هر مرحله، حتماً ویدئوی همراه این آموزش را بررسی کنید (در ویدئو در 00:00).
توضیحاتی درباره سختافزار
اجزای اصلی این پروژه شامل میکروکنترلر ESP32، ماجیول دوربین (OV2640) و یک کارت micro SD برای ذخیرهسازی است. ESP32 یک میکروکنترلر قدرتمند با قابلیتهای Wi-Fi و Bluetooth یکپارچه است که آن را برای کاربردهای IoT ایدهآل میسازد. ماجیول دوربین تصاویر را ضبط میکند که سپس توسط ESP32 پردازش میشوند.
کارت micro SD به عنوان یک رسانه ذخیرهسازی برای تصاویر ضبطشده عمل میکند. در این تنظیم، ESP32 با ماجیول دوربین از طریق پایههای GPIO خاص ارتباط برقرار میکند و تصاویر در فرمت JPEG روی کارت SD ذخیره میشوند. این امکان را برای بازیابی و مشاهده آسانتر عکسها در آینده فراهم میآورد.
- اطمینان حاصل کنید که دوربین در زمان قرار دادن در برد ESP32 به درستی orient شده است.
- از کارت micro SD با ظرفیت ۳۲ گیگابایت یا کمتر استفاده کنید تا از بروز مسائل سازگاری جلوگیری شود.
- GPIO 0 را به GND متصل کنید تا به حالت برنامهنویسی بروید.
- به تأمین برق توجه کنید تا از مشکلات افت ولتاژ جلوگیری شود.
- در حین عکاسی، دوربین را ثابت نگه دارید تا از تصاویر تاری جلوگیری کنید.
دستورالعملهای سیمکشی
برای اتصال ماجیول دوربین ESP32، ابتدا اطمینان حاصل کنید که ESP32 خاموش است. ماجیول کارت micro SD را به ESP32 با استفاده از پایههای زیر متصل کنید: پایهها را متصل کنید؛CSپایه کارت SD به ESP32GPIO 5,MOSIبهGPIO 23,MISOتاGPIO 19, andSCKبهGPIO 18سپس، پایههای ماجیول دوربین را به شرح زیر وصل کنید:PWDNبهGPIO 32,XCLKبهGPIO 0,SIODبهGPIO 26, andSIOCبهGPIO 27بستهای داده پیکسلY2بهY9باید به هم متصل شودGPIO 5از میانGPIO 39طبق تعریفی که در شِفر (کود) شما آمده است.
مطمئن شوید که پایههای زمین و تغذیه را به درستی متصل کردهاید. ESP32 میتواند از باتری موجود در کیت تغذیه شود. پس از نصب سیمها، قبل از روشن کردن دستگاه، اطمینان حاصل کنید که اتصالات محکم هستند. اگر به دقت دستورالعملها را دنبال کنید، باید ببینید که دوربین به درستی هنگام بارگذاری شِفر (کود) راهاندازی میشود.
مثالهای شِفر (کود) و راهنما
در شِفر (کود)، با وارد کردن کتابخانههای لازم و تعریف پایههای دوربین آغاز میکنیم. متغیرpictureNumberبرای پیگیری تعداد عکسهای گرفته شده، مقداردهی اولیه میشود.
int pictureNumber = 0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Disable brownout detector
Serial.begin(115200);
camera_config_t config;
// Configuration settings for the camera
config.ledc_channel = LEDC_CHANNEL_0;
// Additional camera settings...
}تابع راهاندازی ارتباط سریال را راهاندازی کرده و تنظیمات دوربین را پیکربندی میکند. پیکربندی شامل پارامترهایی مانندledc_channel,pin_d0, andxclk_freq_hzبرای عملکرد بهینه.
سپس، ما فرآیند ضبط تصویر را با استفاده از یک حلقه برای گرفتن تصاویر متعدد مدیریت میکنیم. دادههای تصویر با نام فایلی مبتنی بر به کارت SD ذخیره میشود.pictureNumber.
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = esp_camera_fb_get(); // Take Picture
String path = "/picture" + String(pictureNumber) + ".jpg"; // File path
File file = fs.open(path.c_str(), FILE_WRITE); // Open file to write
// Write image data to file
file.write(fb->buf, fb->len);
// Update picture number in EEPROM
EEPROM.write(0, pictureNumber);
}این حلقه تا پنج تصویر را ضبط میکند، جایی که هر تصویر با یک نام فایل منحصر به فرد ذخیره میشود. استفاده از EEPROM به برنامه این امکان را میدهد که شماره آخرین تصویر را به خاطر بسپارد و اطمینان حاصل کند که هر تصویر جدید یک شناسه منحصر به فرد دارد.
نمایشگاه / چه انتظاری باید داشت
هنگامی که شِفر (کود) را اجرا میکنید، ESP32 دوربین و کارت SD را راهاندازی میکند. پس از فشار دادن دکمه ریست بر روی ESP32، یک سری عکس میگیرد که به ترتیب از 0 تا 255 بر اساس مقدار EEPROM شمارهگذاری خواهند شد. پس از ثبت تصاویر، میتوانید کارت میکرو SD را بردارید و عکسها را بر روی کامپیوتر خود مشاهده کنید.
تلههای رایج شامل اطمینان از اینکه کارت میکرو SD به درستی فرمت و وارد شده است و همچنین حفظ موقعیت ثابت دوربین برای جلوگیری از تصاویر مبهم است. اگر با مشکل عدم ثبت تصاویر توسط دوربین روبرو شدید، سیمکشی و تنظیمات تعیین شده در شِفر (کود) را دوباره بررسی کنید (در ویدیو در ساعت ۰۶:۴۵).
زمانبندی ویدیو
- ۰۰:۰۰ شروع
- 1:39 مقدمه
- شِفر (کود) دوربین ESP32 توضیح داده شده است 5:19
- انتخاب تخته ESP32 و پورت COM در Arduino IDE :10
- عکاسی درون و بیرون امتحان 12:52
/*
* روی سانتوس
* جزئیات کامل پروژه را در https://RandomNerdTutorials.com/esp32-cam-take-photo-save-microsd-card مشاهده کنید
*
* مهم!!!
* - برد "AI Thinker ESP32-CAM" را انتخاب کنید
* - GPIO 0 باید به GND متصل شود تا یک اسکچ اپلود شود
* - پس از اتصال GPIO 0 به GND، دکمه RESET روی بورد ESP32-CAM را فشار دهید تا بورد شما در حالت فلش قرار گیرد
*
* اجازه به صورت رایگان به هر شخصی که یک کپی از این نرمافزار و فایلهای مستندات مرتبط را دریافت میکند، داده میشود.
* اطلاعیه حقنشر بالا و این اطلاعیه اجازهنامه باید در تمام کپیها یا بخشهای قابل توجهی از نرمافزار گنجانده شود.
*/
#include "esp_camera.h"
#include "Arduino.h"
#include "FS.h" // کارت SD ESP32
#include "SD_MMC.h" // کارت SD ESP32
#include "soc/soc.h" // مشکلات قهوهای را غیرفعال کنید
#include "soc/rtc_cntl_reg.h" // مشکلات قهوهای را غیرفعال کنید
#include "driver/rtc_io.h"
#include <EEPROM.h> // خواندن و نوشتن از حافظه فلش
// تعداد بایتهایی که میخواهید به آنها دسترسی پیدا کنید را تعیین کنید
#define EEPROM_SIZE 1
// تعریف پایه برای مدل دوربین 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); // غیرفعال کردن شناسگر افت ولتاژ
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;
}
// دوربین را فعال کنید
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("در حال شروع کارت SD");
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;
}
// سازماندهی EEPROM با اندازه از پیش تعیین شده
EEPROM.begin(EEPROM_SIZE);
pictureNumber = EEPROM.read(0) + 1;
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = NULL;
// عکس بگیرید با دوربین
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
// مسیر جایی که تصویر جدید در کارت SD ذخیره خواهد شد
String path = "/picture" + String(pictureNumber) + ".jpg";
fs::FS &fs = SD_MMC;
// Serial.printf("نام فایل تصویر: %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); // دادههای تصویر را به فایل بنویسید
if (shoot == 4) {
Serial.printf("Saved file to path: %s\n", path.c_str());
}else{
Serial.printf("Shooting... \n");
}
EEPROM.write(0, pictureNumber); // شماره تصویر را در EEPROM به روز کنید
EEPROM.commit();
}
file.close(); // فایل را ببندید
esp_camera_fb_return(fb); // فریم بافر را به درایور دوربین بازگردانید
delay(200); // تاخیر کوتاه بین شلیکها
}
// چراغ LED سفید روی بورد ESP32-CAM متصل به GPIO 4 را خاموش میکند.
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
rtc_gpio_hold_en(GPIO_NUM_4);
// ESP32-CAM را در حالت خواب عمیق قرار دهید
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 را به خواب عمیق میگذاریم
}
Common Course Links
Common Course Files
منابع و مراجع
-
مستنداتآموزش ESP32 42/55 - صفحه مستندات SunFounder در حال گرفتن عکسdocs.sunfounder.com
فایلها📁
هیچ فایلی موجود نیست.