Код для поиска

ESP32 Урок 42/55 - Съёмка фото с камеры и сохранение на Micro SD CAM-1 | Набор SunFounder для ESP32

ESP32 Урок 42/55 - Съёмка фото с камеры и сохранение на Micro SD CAM-1 | Набор SunFounder для ESP32

В этом руководстве мы будем использовать микроконтроллер ESP32 вместе с его платой расширения от SunFounder для захвата фотографий с помощью камеры и сохранения их непосредственно на micro SD карту. Этот проект использует встроенные возможности ESP32, включая Wi-Fi и Bluetooth, для создания компактного устройства для фотосъемки. К концу этого руководства у вас будет рабочая настройка, которая может делать и сохранять изображения, к которым затем можно будет получить доступ на компьютере.

extension_bopard_camera

Для тех, кто новичок в экосистеме ESP32, этот набор предоставляет универсальную платформу для различных проектов, включая этот. Камера, используемая в этом проекте, — OV2640, которая предлагает разрешение 1600x1200 пикселей. Хотя она может не соответствовать качеству современных смартфонов, ее достаточно для базовых задач захвата изображений. Чтобы уточнить любые шаги, обязательно посмотрите видео, сопровождающее это руководство (в видео на 00:00).

20240103_163227858_iOS

Объяснение аппаратного обеспечения

Основные компоненты в этом проекте включают микроконтроллер ESP32, модуль камеры (OV2640) и micro SD карту для хранения. ESP32 — это мощный микроконтроллер со встроенными возможностями Wi-Fi и Bluetooth, что делает его идеальным для IoT-приложений. Модуль камеры захватывает изображения, которые затем обрабатываются ESP32.

esp32-41-setting-3

Micro SD карта действует как носитель для хранения захваченных изображений. В этой настройке ESP32 общается с модулем камеры, используя определенные GPIO-контакты, и изображения сохраняются в формате JPEG на SD карте. Это позволяет легко извлекать и просматривать фотографии позже.

  • Убедитесь, что камера правильно ориентирована при вставке в плату ESP32.
  • Используйте micro SD карту емкостью 32 ГБ или меньше, чтобы избежать проблем с совместимостью.
  • Подключите GPIO 0 к GND для режима программирования.
  • Обратите внимание на источник питания, чтобы избежать проблем с понижением напряжения.
  • Держите камеру неподвижно при съемке фотографий, чтобы избежать размытых изображений.

Инструкции по подключению

Чтобы подключить модуль камеры ESP32, сначала убедитесь, что ESP32 выключен. Подключите модуль micro 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 Тест съемки фотографий в помещении и на улице

Изображения

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
Язык: 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
}

Ресурсы и ссылки

Файлы📁

Нет доступных файлов.