الوصف
وحدة كاميرا ESP32-CAM مع OV2640
وحدة كاميرا مدمجة تعتمد على متحكم ESP32 ثنائي النواة، وتتضمن كاميرا OV2640 وأطراف GPIO وفتحة بطاقة microSD لتخزين الصور والملفات.
- المتحكم: من عائلة ESP32 ثنائية النواة
- الكاميرا: OV2640
- الاتصال اللاسلكي: Wi-Fi 802.11 b/g/n وBluetooth 4.2 BR/EDR وBLE، حسب المصدر
- ذاكرة الفلاش: 4MB، حسب المصدر
- التخزين: فتحة بطاقة microSD
- GPIO: عدة أطراف مكشوفة؛ ويشترك بعضها مع الكاميرا وmicroSD ووظائف مدمجة أخرى
لا تتضمن الوحدة واجهة USB مدمجة للبرمجة. استخدم محول USB-to-TTL متوافقًا، وتحقق من إصدار اللوحة وتوزيع أطرافها قبل التوصيل.
التطبيقات
- التقاط الصور والفيديو
- مشاريع إنترنت الأشياء التي تلتقط الصور أو تعالجها
- النماذج الأولية للأجهزة المتصلة

الأدوات والملحقات
- وحدة ESP32-CAM
- محوّل برمجة ESP32-CAM أو محوّل FTDI من USB إلى TTL
- كابل micro-USB للمحول
- بطاقة microSD
إعداد Arduino IDE
- ثبّت Arduino IDE من موقع Arduino الرسمي.
- ثبّت حزمة لوحات Espressif ESP32 باستخدام رابط Boards Manager المذكور في المصدر:
https://dl.espressif.com/dl/package_esp32_index.json. - اختر إعداد لوحة يطابق عتاد ESP32-CAM لديك. يذكر المصدر “ESP32 Wrover Module”، بينما يستخدم المثال أدناه تعريفات أطراف AI-Thinker ESP32-CAM؛ تحقق من الإعداد وتوزيع أطراف الكاميرا وفق لوحتك.
توصيلات USB-to-TTL
- RX في المحول → TX في ESP32-CAM
- TX في المحول → RX في ESP32-CAM
- 5V في المحول → VCC في اللوحة (فقط إذا كان المحول قادرًا على توفير التيار المطلوب)
- GND في المحول → GND في اللوحة
استخدم مستويات منطق UART 3.3V. اتبع إرشادات المحول واللوحة للدخول إلى وضع البرمجة. تنزيل حزمة تعريف Windows.
مثال Arduino للكاميرا وبطاقة microSD
يهيّئ الكود التالي الكاميرا وبطاقة SD، ويلتقط صورة JPEG ويحفظها على البطاقة، ثم يكرر العملية كل 10 ثوانٍ. رغم ما ورد في مقدمة المصدر، لا يقوم هذا الكود بتبديل حالة LED المدمج.
#include "esp_camera.h"
#include "FS.h"
#include "SD_MMC.h"
// ----------------------------------------------------------------------------
// 1. Camera pins (AI‑Thinker / ESP32‑CAM)
// ----------------------------------------------------------------------------
#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
// ----------------------------------------------------------------------------
// 2. Allocate an empty camera_config_t
// ----------------------------------------------------------------------------
camera_config_t camera_config;
void setup() {
Serial.begin(115200);
delay(100);
// ——— Fill in the pins & settings ———
camera_config.ledc_channel = LEDC_CHANNEL_0;
camera_config.ledc_timer = LEDC_TIMER_0;
camera_config.pin_d0 = Y2_GPIO_NUM;
camera_config.pin_d1 = Y3_GPIO_NUM;
camera_config.pin_d2 = Y4_GPIO_NUM;
camera_config.pin_d3 = Y5_GPIO_NUM;
camera_config.pin_d4 = Y6_GPIO_NUM;
camera_config.pin_d5 = Y7_GPIO_NUM;
camera_config.pin_d6 = Y8_GPIO_NUM;
camera_config.pin_d7 = Y9_GPIO_NUM;
camera_config.pin_xclk = XCLK_GPIO_NUM;
camera_config.pin_pclk = PCLK_GPIO_NUM;
camera_config.pin_vsync = VSYNC_GPIO_NUM;
camera_config.pin_href = HREF_GPIO_NUM;
camera_config.pin_sscb_sda = SIOD_GPIO_NUM;
camera_config.pin_sscb_scl = SIOC_GPIO_NUM;
camera_config.pin_pwdn = PWDN_GPIO_NUM;
camera_config.pin_reset = RESET_GPIO_NUM;
camera_config.xclk_freq_hz = 20000000; // no underscores
camera_config.pixel_format = PIXFORMAT_JPEG;
// ——— Choose frame size / quality based on PSRAM ———
if (psramFound()) {
camera_config.frame_size = FRAMESIZE_UXGA;
camera_config.jpeg_quality = 10;
camera_config.fb_count = 2;
} else {
camera_config.frame_size = FRAMESIZE_SVGA;
camera_config.jpeg_quality = 12;
camera_config.fb_count = 1;
}
// ——— Init camera ———
Serial.println("→ Initializing camera...");
esp_err_t err = esp_camera_init(&camera_config);
if (err != ESP_OK) {
Serial.printf("‼ Camera init failed: 0x%x\n", err);
while (true) { delay(1000); }
}
Serial.println("✓ Camera initialized");
// ——— Mount SD card ———
Serial.println("→ Mounting SD card...");
if (!SD_MMC.begin()) {
Serial.println("‼ SD_MMC.begin() failed");
while (true) { delay(1000); }
}
if (SD_MMC.cardType() == CARD_NONE) {
Serial.println("‼ No SD card attached");
while (true) { delay(1000); }
}
Serial.printf("✓ SD mounted, type=%d\n", SD_MMC.cardType());
}
void loop() {
static uint16_t counter = 0;
counter++;
// ——— Capture frame ———
camera_fb_t* fb = esp_camera_fb_get();
if (!fb) {
Serial.println("‼ Frame capture failed");
delay(2000);
return;
}
// ——— Build filename ———
char filename[32];
snprintf(filename, sizeof(filename), "/photo%03u.jpg", counter);
// ——— Save to SD ———
File file = SD_MMC.open(filename, FILE_WRITE);
if (!file) {
Serial.printf("‼ Failed to open %s for writing\n", filename);
} else {
file.write(fb->buf, fb->len);
Serial.printf("✓ Saved %s (%u bytes)\n", filename, fb->len);
file.close();
}
// ——— Return the frame buffer ———
esp_camera_fb_return(fb);
// Wait 10 s before next capture
delay(10000);
}
استخدم بطاقة microSD وإعداد لوحة وتوزيع أطراف متوافقين مع AI-Thinker ESP32-CAM. لا تتوفر أطراف الكاميرا وSD للاستخدام العام بحرية أثناء تشغيل هذه الوحدات الطرفية.
للاطلاع على دعم برمجيات ESP32-CAM، راجع مستودع esp32-camera الرسمي من Espressif.










