Description
ESP32-CAM Dual Core Camera Wifi Bluetooth
L’ESP32-CAM est un module compact intégrant une caméra, basé sur la puce ESP32-S. Il est équipé de la caméra OV2640 et dispose de plusieurs GPIO pour connecter des périphériques, ainsi qu’un emplacement pour carte microSD pour le stockage d’images et de fichiers.
Caractéristiques
- Microcontrôleur : ESP32-S Dual Core
- Caméra : OV2640
- Connectivité : WiFi 802.11 b/g/n, Bluetooth v4.2 BR/EDR et BLE
- Mémoire Flash : 4MB
- GPIO : Plusieurs broches disponibles
- Emplacement carte SD : Oui
Fonctionnement
L’ESP32-CAM se connecte à des réseaux WiFi pour des applications IoT telles que la surveillance vidéo et la reconnaissance d’images. Il peut être programmé via l’IDE Arduino.
Applications
- Surveillance vidéo : Utilisation comme caméra de sécurité.
- Projets IoT : Applications nécessitant la capture et le traitement d’images.
- Prototypage rapide : Développement de solutions connectées.
Ce tutoriel vous guide à travers la capture d’images et la sauvegarde de celles-ci sur une carte microSD en utilisant le lecteur intégré.
Matériel nécessaire
- ESP32-CAM
- L’Adaptateur Programmateur pour ESP32-CAM ou Adaptateur FTDI
- Câble micro-USB
- Carte microSD
Configuration de l’IDE Arduino
- Installation de l’IDE Arduino :
- Téléchargez et installez l’IDE Arduino depuis le site officiel.
- Ajout du support pour ESP32 :
- Ouvrez l’IDE Arduino.
- Allez dans Fichier > Préférences.
- Dans la section URL de gestionnaire de cartes supplémentaires, ajoutez :
https://dl.espressif.com/dl/package_esp32_index.json. - Allez dans Outils > Gestionnaire de cartes et recherchez “esp32”.
- Sélectionnez “esp32” et cliquez sur “Installer”.
- Configuration de la carte :
- Sélectionnez Outils > Type de carte > ESP32 Wrover Module.
Connexions
-
- Connectez l’ESP32-CAM à un adaptateur de programmation.
- Connexions pour l’adaptateur FTDI: RX à TX, TX à RX, 5V à VCC, GND à GND.
Télécharger le Driver pour Windows: ICI
Exemple de Code Arduino
Voici un exemple de code pour clignoter la led interne du ESP32-CAM et capturer une image avec la caméra et la sauvegarder sur une carte microSD en utilisant le lecteur intégré chaque 10s:
#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);
}