ESP32 ٹیوٹوریل 42/55 - کیمرے کے ساتھ تصویر لینا اور مائیکرو ایس ڈی CAM-1 پر محفوظ کرنا | سن فاؤنڈر کا ESP32 کٹ
اس ٹیوٹوریل میں، ہم ESP32 مائیکروکنٹرولر اور سن فاؤنڈر کی اس کی ایکسٹینشن بورڈ استعمال کریں گے تاکہ کیمرے کے ذریعے تصاویر کھینچی جا سکیں اور انہیں براہ راست مائیکرو ایس ڈی کارڈ پر محفوظ کیا جا سکے۔ یہ پروجیکٹ ESP32 کی بلٹ ان صلاحیتوں، بشمول وائی فائی اور بلوٹوتھ، کو استعمال کرتے ہوئے ایک کمپیکٹ تصویر کھینچنے والا آلہ بناتا ہے۔ اس ٹیوٹوریل کے اختتام تک، آپ کے پاس ایک کام کرنے والا سیٹ اپ ہوگا جو تصاویر لے کر محفوظ کر سکتا ہے، جنہیں بعد میں کمپیوٹر پر دیکھا جا سکتا ہے۔
ان لوگوں کے لیے جو ESP32 ایکو سسٹم میں نئے ہیں، یہ کٹ مختلف پروجیکٹس کے لیے ایک ورسٹائل پلیٹ فارم فراہم کرتی ہے، بشمول یہ پروجیکٹ۔ اس پروجیکٹ میں استعمال ہونے والا کیمرہ OV2640 ہے، جو 1600x1200 پکسلز کی ریزولوشن پیش کرتا ہے۔ اگرچہ یہ جدید اسمارٹ فونز کے معیار سے مماثل نہیں ہو سکتا، لیکن یہ بنیادی تصویر کھینچنے کے کاموں کے لیے کافی ہے۔ کسی بھی مرحلے کو واضح کرنے کے لیے، اس ٹیوٹوریل کے ساتھ موجود ویڈیو ضرور دیکھیں (ویڈیو میں 00:00 پر)۔
ہارڈویئر کی وضاحت
اس پروجیکٹ کے اہم اجزاء میں ESP32 مائیکروکنٹرولر، کیمرہ ماجیول (OV2640)، اور اسٹوریج کے لیے ایک مائیکرو ایس ڈی کارڈ شامل ہیں۔ ESP32 ایک طاقتور مائیکروکنٹرولر ہے جس میں مربوط وائی فائی اور بلوٹوتھ صلاحیتیں ہیں، جو اسے IoT ایپلیکیشنز کے لیے مثالی بناتی ہیں۔ کیمرہ ماجیول تصاویر کھینچتا ہے، جنہیں پھر ESP32 پروسیس کرتا ہے۔
مائیکرو ایس ڈی کارڈ کھینچی گئی تصاویر کے لیے اسٹوریج میڈیم کا کام کرتا ہے۔ اس سیٹ اپ میں، ESP32 مخصوص GPIO پنوں کا استعمال کرتے ہوئے کیمرہ ماجیول کے ساتھ بات چیت کرتا ہے، اور تصاویر JPEG فارمیٹ میں ایس ڈی کارڈ پر محفوظ کی جاتی ہیں۔ یہ بعد میں تصاویر کو آسانی سے حاصل کرنے اور دیکھنے کی اجازت دیتا ہے۔
- ESP32 بورڈ میں ڈالتے وقت کیمرہ کو صحیح سمت میں رکھیں۔
- مطابقت کے مسائل سے بچنے کے لیے 32 GB یا اس سے کم صلاحیت والا مائیکرو ایس ڈی کارڈ استعمال کریں۔
- پروگرامنگ موڈ کے لیے GPIO 0 کو GND سے جوڑیں۔
- براؤن آؤٹ مسائل سے بچنے کے لیے بجلی کی فراہمی پر توجہ دیں۔
- تصاویر دھندلی ہونے سے بچنے کے لیے تصویر کھینچتے وقت کیمرہ کو مستحکم رکھیں۔
وائرنگ ہدایات
ESP32 کیمرہ ماجیول کو وائر کرنے کے لیے، پہلے یقینی بنائیں کہ ESP32 بند ہے۔ مائیکرو ایس ڈی کارڈ ماجیول کو ESP32 سے درج ذیل پنوں کا استعمال کرتے ہوئے جوڑیں: ایس ڈی کارڈ کے CS پن کو ESP32 کے GPIO 5 سے، MOSI کو GPIO 23 سے، MISO کو GPIO 19 سے، اور SCK کو GPIO 18 سے جوڑیں۔ اگلا، کیمرہ ماجیول کے پنوں کو اس طرح جوڑیں: PWDN کو GPIO 32 سے، XCLK کو GPIO 0 سے، SIOD کو GPIO 26 سے، اور SIOC کو GPIO 27 سے۔ پکسل ڈیٹا پن Y2 سے Y9 کو آپ کے کوڈ میں بیان کردہ GPIO 5 سے GPIO 39 تک جوڑا جانا چاہیے۔
یقینی بنائیں کہ گراؤنڈ اور پاور پن مناسب طریقے سے جڑے ہوئے ہیں۔ ESP32 کو کٹ میں شامل بیٹری سے پاور کیا جا سکتا ہے۔ وائرنگ کے بعد، ڈیوائس کو آن کرنے سے پہلے یقینی بنائیں کہ کنکشن محفوظ ہیں۔ اگر آپ ہدایات پر قریب سے عمل کرتے ہیں، تو آپ کو کوڈ اپ لوڈ کرتے وقت کیمرہ صحیح طریقے سے انیشیالائز ہوتا نظر آئے گا۔
کوڈ مثالیں اور واک تھرو
کوڈ میں، ہم ضروری لائبریریاں شامل کرکے اور کیمرہ پن کنفیگریشنز کی وضاحت کرکے شروع کرتے ہیں۔ متغیر pictureNumber کو کھینچی گئی تصاویر کی تعداد کا ٹریک رکھنے کے لیے انیشیالائز کیا جاتا ہے۔
int pictureNumber = 0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // براؤن آؤٹ ڈیٹیکٹر غیر فعال کریں
Serial.begin(115200);
camera_config_t config;
// کیمرے کے لیے کنفیگریشن سیٹنگز
config.ledc_channel = LEDC_CHANNEL_0;
// اضافی کیمرہ سیٹنگز...
}
سیٹ اپ فنکشن سیریل کمیونیکیشن کو انیشیالائز کرتا ہے اور کیمرہ سیٹنگز کو کنفیگر کرتا ہے۔ کنفیگریشن میں بہترین کارکردگی کے لیے ledc_channel، pin_d0، اور xclk_freq_hz جیسے پیرامیٹرز شامل ہیں۔
اگلا، ہم ایک لوپ کا استعمال کرتے ہوئے متعدد تصاویر کھینچ کر تصویر حاصل کرنے کے عمل کو سنبھالتے ہیں۔ تصویری ڈیٹا کو pictureNumber کی بنیاد پر فائل نام کے ساتھ ایس ڈی کارڈ پر محفوظ کیا جاتا ہے۔
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = esp_camera_fb_get(); // تصویر کھینچیں
String path = "/picture" + String(pictureNumber) + ".jpg"; // فائل کا راستہ
File file = fs.open(path.c_str(), FILE_WRITE); // لکھنے کے لیے فائل کھولیں
// فائل میں تصویری ڈیٹا لکھیں
file.write(fb->buf, fb->len);
// EEPROM میں تصویر نمبر اپ ڈیٹ کریں
EEPROM.write(0, pictureNumber);
}
یہ لوپ پانچ تصاویر تک کھینچتا ہے، جہاں ہر تصویر کو ایک منفرد فائل نام کے ساتھ محفوظ کیا جاتا ہے۔ EEPROM کا استعمال پروگرام کو آخری تصویر نمبر یاد رکھنے کی اجازت دیتا ہے، اس بات کو یقینی بناتے ہوئے کہ ہر نئی تصویر کا ایک منفرد شناخت کنندہ ہو۔
ڈیمونسٹریشن / کیا توقع کریں
جب آپ کوڈ چلاتے ہیں تو ESP32 کیمرہ اور SD کارڈ کو ابتدائی شکل دے گا۔ ESP32 پر ری سیٹ بٹن دبانے کے بعد، یہ تصاویر کا ایک سلسلہ لے گا، جو EEPROM ویلیو کی بنیاد پر 0 سے 255 تک ترتیب وار نمبر دی جائیں گی۔ تصاویر لینے کے بعد، آپ مائیکرو SD کارڈ نکال کر اپنے کمپیوٹر پر تصاویر دیکھ سکتے ہیں۔
عام مسائل میں مائیکرو SD کارڈ کا صحیح طریقے سے فارمیٹ اور داخل ہونا یقینی بنانا شامل ہے، نیز تصاویر کے دھندلا ہونے سے بچنے کے لیے کیمرے کی مستحکم پوزیشن برقرار رکھنا۔ اگر آپ کو کیمرے سے تصاویر نہ لینے کے مسائل کا سامنا ہو تو کوڈ میں سیٹ کی گئی وائرنگ اور کنفیگریشنز کو دوبارہ چیک کریں (ویڈیو میں 06:45 پر)۔
ویڈیو ٹائم اسٹیمپس
- 00:00 آغاز
- 1:39 تعارف
- 5:19 ESP32 کیمرہ کوڈ کی وضاحت
- 11:10 Arduino IDE میں ESP32 بورڈ اور COM پورٹ کا انتخاب
- 12:52 گھر کے اندر اور باہر تصاویر لینے کا ٹیسٹ
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-cam-take-photo-save-microsd-card
IMPORTANT!!!
- Select Board "AI Thinker ESP32-CAM"
- 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 "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;
}
// initialize EEPROM with predefined size
EEPROM.begin(EEPROM_SIZE);
pictureNumber = EEPROM.read(0) + 1;
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = NULL;
// Take Picture with Camera
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
// 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); // Write image data to file
if (shoot == 4) {
Serial.printf("Saved file to path: %s\n", path.c_str());
}else{
Serial.printf("Shooting... \n");
}
EEPROM.write(0, pictureNumber); // Update the picture number in EEPROM
EEPROM.commit();
}
file.close(); // Close the file
esp_camera_fb_return(fb); // Return the frame buffer back to the camera driver
delay(200); // Short delay between shots
}
// 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);
// Put the ESP32-CAM to deep sleep
delay(2000);
Serial.println("Going to sleep now");
delay(2000);
esp_deep_sleep_start();
Serial.println("This will never be printed");
}
void loop() {
// Empty loop as we are putting the ESP32-CAM to deep sleep
}
Common Course Links
Common Course Files
وسائل اور حوالہ جات
-
دستاویزاتESP32 Tutorial 42/55- SunFounder doc page taking photodocs.sunfounder.com
فائلیں📁
کوئی فائلیں دستیاب نہیں ہیں۔