Search Code

ESP32 Упатство 42/55 - Сликање со камера и зачувување на Micro SD CAM-1 | SunFounder's ESP32 комплет

ESP32 Упатство 42/55 - Сликање со камера и зачувување на Micro SD CAM-1 | SunFounder's ESP32 комплет

Во ова упатство, ќе го користиме ESP32 микроконтролерот заедно со неговата проширена плоча од SunFounder за да фотографираме со камера и да ги зачуваме директно на микро SD картичка. Овој проект ги користи вградените можности на ESP32, вклучувајќи Wi-Fi и Bluetooth, за да создаде компактен уред за фотографирање. До крајот на ова упатство, ќе имате функционална поставка што може да прави и складира слики, кои подоцна може да ги пристапите на компјутер.

extension_bopard_camera

За оние кои се нови во ESP32 екосистемот, овој комплет обезбедува разновидна платформа за различни проекти, вклучувајќи го и овој. Камерата што се користи во овој проект е OV2640, која нуди резолуција од 1600x1200 пиксели. Иако можеби не одговара на квалитетот на современите паметни телефони, таа е доволна за основни задачи за снимање слики. За да ги разјасните сите чекори, задолжително погледнете го видеото што го придружува ова упатство (во видеото на 00:00).

20240103_163227858_iOS

Објаснување на хардверот

Главните компоненти во овој проект вклучуваат ESP32 микроконтролер, модул за камера (OV2640) и микро SD картичка за складирање. ESP32 е моќен микроконтролер со интегрирани Wi-Fi и Bluetooth можности, што го прави идеален за IoT апликации. Модулот за камера снима слики, кои потоа се обработуваат од ESP32.

esp32-41-setting-3

Микро 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 може да се напојува со батеријата што е вклучена во комплетот. По поврзувањето, осигурете се дека врските се безбедни пред да го вклучите уредот. Ако внимателно ги следите инструкциите, треба да видите дека камерата правилно се иницијализира кога ќе го поставите кодот.

Примери на код и објаснување

esp32-41-setting-2
esp32-41-setting-1

Во кодот, започнуваме со вклучување на потребните библиотеки и дефинирање на конфигурациите на пиновите за камерата. Променливата 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 Тест за фотографирање во затворен и на отворен простор

Images

esp32-41-setting-3
esp32-41-setting-3
extension_bopard_camera
extension_bopard_camera
20240103_163227858_iOS
20240103_163227858_iOS
esp32-41-setting-1
esp32-41-setting-1
esp32-41-setting-2
esp32-41-setting-2
843-ESP32 Tutorial 42/55- Arduino code for taking photo and saving it
Language: C++
/*********
  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
}

Resources & references

Files📁

No files available.