ESP32 Упатство 42/55 - Сликање со камера и зачувување на Micro SD CAM-1 | SunFounder's ESP32 комплет
Во ова упатство, ќе го користиме ESP32 микроконтролерот заедно со неговата проширена плоча од SunFounder за да фотографираме со камера и да ги зачуваме директно на микро SD картичка. Овој проект ги користи вградените можности на ESP32, вклучувајќи Wi-Fi и Bluetooth, за да создаде компактен уред за фотографирање. До крајот на ова упатство, ќе имате функционална поставка што може да прави и складира слики, кои подоцна може да ги пристапите на компјутер.
За оние кои се нови во ESP32 екосистемот, овој комплет обезбедува разновидна платформа за различни проекти, вклучувајќи го и овој. Камерата што се користи во овој проект е OV2640, која нуди резолуција од 1600x1200 пиксели. Иако можеби не одговара на квалитетот на современите паметни телефони, таа е доволна за основни задачи за снимање слики. За да ги разјасните сите чекори, задолжително погледнете го видеото што го придружува ова упатство (во видеото на 00:00).
Објаснување на хардверот
Главните компоненти во овој проект вклучуваат ESP32 микроконтролер, модул за камера (OV2640) и микро SD картичка за складирање. ESP32 е моќен микроконтролер со интегрирани Wi-Fi и Bluetooth можности, што го прави идеален за IoT апликации. Модулот за камера снима слики, кои потоа се обработуваат од ESP32.
Микро SD картичката делува како медиум за складирање на снимените слики. Во оваа поставка, ESP32 комуницира со модулот за камера користејќи специфични GPIO пинови, а сликите се зачувуваат во JPEG формат на SD картичката. Ова овозможува лесно преземање и прегледување на фотографиите подоцна.
- Осигурете се дека камерата е правилно ориентирана кога ја вметнувате во ESP32 плочата.
- Користете микро SD картичка со капацитет од 32 GB или помалку за да избегнете проблеми со компатибилноста.
- Поврзете GPIO 0 на GND за програмски режим.
- Обрнете внимание на напојувањето за да избегнете проблеми со пренапон.
- Држете ја камерата стабилна додека фотографирате за да избегнете заматени слики.
Инструкции за жици
За да го поврзете ESP32 модулот за камера, прво осигурете се дека ESP32 е исклучен. Поврзете го модулот за микро SD картичка со ESP32 користејќи ги следниве пинови: поврзете го CS пинот на SD картичката со GPIO 5 на ESP32, 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;
// Дополнителни поставки за камерата...
}
Функцијата setup ја иницијализира сериската комуникација и ги конфигурира поставките на камерата. Конфигурацијата вклучува параметри како ledc_channel, pin_d0 и xclk_freq_hz за оптимални перформанси.
Потоа, го обработуваме процесот на снимање слики користејќи јамка за да направиме повеќе фотографии. Податоците за сликата се зачувуваат на SD картичката со име на датотека засновано на 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, тој ќе направи серија слики, кои ќе бидат нумерирани последователно од 0 до 255 врз основа на вредноста на EEPROM. По снимањето на сликите, можете да ја извадите micro SD-картичката и да ги прегледате сликите на вашиот компјутер.
Вообичаени грешки вклучуваат осигурување дека micro SD-картичката е правилно форматирана и вметната, како и одржување стабилна позиција на камерата за да се избегнат заматени слики. Ако наидете на проблеми со камерата што не снима слики, проверете ги жиците и конфигурациите поставени во кодот (во видеото на 06:45).
Временски ознаки на видеото
- 00:00 Почеток
- 1:39 Вовед
- 5:19 Објаснување на кодот за ESP32 камера
- 11:10 Избор на ESP32 плочка и COM порта во Arduino IDE
- 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
Resources & references
-
DocumentationESP32 Tutorial 42/55- SunFounder doc page taking photodocs.sunfounder.com
Files📁
No files available.