Кодты іздеу

ESP32 Нұсқаулығы 42/55 - Камерамен фото түсіру және Micro SD картасына сақтау CAM-1 | SunFounder ESP32 жинағы

ESP32 Нұсқаулығы 42/55 - Камерамен фото түсіру және Micro SD картасына сақтау CAM-1 | SunFounder ESP32 жинағы

Бұл оқулықта біз SunFounder компаниясының кеңейту тақтасымен бірге ESP32 микроконтроллерін камера арқылы фотосуреттер түсіру және оларды тікелей 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 түйреуіштері арқылы байланысады, ал суреттер SD картасында JPEG форматында сақталады. Бұл фотосуреттерді кейін оңай алуға және қарауға мүмкіндік береді.

  • ESP32 тақтасына салғанда камераның дұрыс бағытталғанына көз жеткізіңіз.
  • Үйлесімділік мәселелерін болдырмау үшін 32 ГБ немесе одан аз сыйымдылығы бар micro SD картасын пайдаланыңыз.
  • Бағдарламалау режимі үшін GPIO 0-ді GND-ге қосыңыз.
  • Кернеу төмендеуі мәселелерін болдырмау үшін қуат көзіне назар аударыңыз.
  • Бұлыңғыр суреттерді болдырмау үшін фотосурет түсіру кезінде камераны тұрақты ұстаңыз.

Сым қосу нұсқаулары

ESP32 камера модулін қосу үшін алдымен ESP32 өшірілгеніне көз жеткізіңіз. Micro SD карта модулін ESP32-ге келесі түйреуіштер арқылы қосыңыз: SD картасының CS түйреуішін ESP32-нің GPIO 5-ке, 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 сияқты параметрлерді қамтиды.

Әрі қарай, біз бірнеше сурет түсіру үшін циклді қолданып, сурет түсіру процесін өңдейміз. Сурет деректері pictureNumber негізінде файл атауымен SD картасына сақталады.

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-дегі қалпына келтіру түймесін басқаннан кейін, ол EEPROM мәніне негізделген 0-ден 255-ке дейін реттік нөмірленетін суреттер сериясын түсіреді. Суреттерді түсіргеннен кейін, micro SD картаны алып, суреттерді компьютерде көре аласыз.

Жиі кездесетін қателіктерге micro SD картаның дұрыс пішімделгеніне және салынғанына көз жеткізу, сондай-ақ бұлыңғыр суреттерді болдырмау үшін камераның тұрақты орнын сақтау жатады. Егер камера сурет түсірмейтін мәселеге тап болсаңыз, кодтағы сымдар мен конфигурацияларды қайта тексеріңіз (бейнеде 06:45).

Бейне уақыт белгілері

  • 00:00 Басталуы
  • 1:39 Кіріспе
  • 5:19 ESP32 камера коды түсіндірілді
  • 11:10 Arduino IDE-де ESP32 платасын және COM портын таңдау
  • 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
}

Ресурстар мен сілтемелер

Файлдар📁

Файлдар жоқ.