Search Code

Koyarwar ESP32 42/55 - Ɗaukar Hoto da Kamara ajiye akan Micro SD CAM-1 | Kunshin ESP32 na SunFounder

Koyarwar ESP32 42/55 - Ɗaukar Hoto da Kamara ajiye akan Micro SD CAM-1 | Kunshin ESP32 na SunFounder

A cikin wannan koyawa, za mu yi amfani da microcontroller na ESP32 tare da katin ƙarawa na SunFounder don ɗaukar hotuna ta amfani da kyamara da adana su kai tsaye a kan micro SD card. Wannan aikin yana amfani da damar da ke cikin ESP32, gami da Wi-Fi da Bluetooth, don ƙirƙirar na'urar ɗaukar hoto mai ƙarami. A ƙarshen wannan koyawa, za ka sami tsarin aiki wanda zai iya ɗaukar da adana hotuna, waɗanda za a iya samun damar su daga baya a kan kwamfuta.

extension_bopard_camera

Ga waɗanda suke sababbi ga tsarin ESP32, wannan kit ɗin yana ba da dandamali mai fa'ida don ayyuka daban-daban, gami da wannan. Kyamaran da aka yi amfani da ita a wannan aikin ita ce OV2640, wadda ke ba da ƙuduri na pixels 1600x1200. Duk da cewa ba za ta kai ingancin wayoyin zamani ba, tana isa ga ayyukan ɗaukar hoto na asali. Don fayyace kowane mataki, ka tabbata ka duba bidiyon da ke tare da wannan koyawa (a cikin bidiyo a 00:00).

20240103_163227858_iOS

Bayanin Kayan Aiki

Babban abubuwan da ke cikin wannan aikin sun haɗa da microcontroller na ESP32, ƙirar kyamara (OV2640), da micro SD card don adanawa. ESP32 microcontroller ne mai ƙarfi wanda ke da haɗin Wi-Fi da Bluetooth, wanda ya sa ya dace da aikace-aikacen IoT. Ƙirar kyamara tana ɗaukar hotuna, waɗanda ESP32 ke sarrafa su.

esp32-41-setting-3

Micro SD card ɗin yana aiki azaman wurin adana hotunan da aka ɗauka. A cikin wannan tsari, ESP32 yana sadarwa da ƙirar kyamara ta amfani da takamaiman GPIO pins, kuma ana adana hotuna a cikin tsarin JPEG akan SD card. Wannan yana ba da damar samun da kallon hotuna cikin sauƙi daga baya.

  • Tabbatar an daidaita kyamara daidai lokacin shigar da ita a cikin allon ESP32.
  • Yi amfani da micro SD card mai ƙarfin 32 GB ko ƙasa don guje wa matsalolin dacewa.
  • Haɗa GPIO 0 zuwa GND don yanayin shirye-shirye.
  • Kula da samar da wutar lantarki don guje wa matsalolin brownout.
  • Tsayar da kyamara a tsaye yayin ɗaukar hotuna don guje wa hotuna marasa haske.

Umarnin Haɗin Waya

Don haɗa ƙirar kyamara ta ESP32, da farko ka tabbata an kashe wutar ESP32. Haɗa micro SD card module zuwa ESP32 ta amfani da waɗannan pins: haɗa CS pin na SD card zuwa GPIO 5 na ESP32, MOSI zuwa GPIO 23, MISO zuwa GPIO 19, da SCK zuwa GPIO 18. Na gaba, haɗa pins na ƙirar kyamara kamar haka: PWDN zuwa GPIO 32, XCLK zuwa GPIO 0, SIOD zuwa GPIO 26, da SIOC zuwa GPIO 27. Pins na bayanan pixel Y2 zuwa Y9 ya kamata a haɗa su zuwa GPIO 5 zuwa GPIO 39 kamar yadda aka ayyana a cikin lambar ka.

Tabbatar ka haɗa pins na ƙasa da wutar lantarki daidai. Ana iya kunna ESP32 ta batirin da ke cikin kit ɗin. Bayan haɗin waya, tabbatar cewa haɗin sun tsaya lafiya kafin kunna na'urar. Idan ka bi umarnin sosai, ya kamata ka ga kyamara ta fara aiki daidai lokacin da ka loda lambar.

Misalan Lamba & Bayani

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

A cikin lambar, muna farawa ta haɗa ɗakunan karatu da ake buƙata da ayyana saitunan pins na kyamara. An fara pictureNumber don kiyaye adadin hotunan da aka ɗauka.

int pictureNumber = 0;

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);  // Kashe mai gano brownout
  Serial.begin(115200);
  camera_config_t config;
  // Saitunan ƙirar kyamara
  config.ledc_channel = LEDC_CHANNEL_0;
  // Ƙarin saitunan kyamara...

Aikin setup yana fara sadarwar serial da daidaita saitunan kyamara. Saitunan sun haɗa da sigogi kamar ledc_channel, pin_d0, da xclk_freq_hz don ingantaccen aiki.

Na gaba, muna sarrafa tsarin ɗaukar hoto ta amfani da madauki don ɗaukar hotuna da yawa. Ana adana bayanan hoton zuwa SD card tare da sunan fayil dangane da pictureNumber.

for (int shoot = 0; shoot < 5; shoot++) {
    camera_fb_t *fb = esp_camera_fb_get(); // Ɗauki hoto
    String path = "/picture" + String(pictureNumber) + ".jpg"; // Hanyar fayil
    File file = fs.open(path.c_str(), FILE_WRITE); // Buɗe fayil don rubutu
    // Rubuta bayanan hoto zuwa fayil
    file.write(fb->buf, fb->len);
    // Sabunta lambar hoto a cikin EEPROM
    EEPROM.write(0, pictureNumber);
}

Wannan madauki yana ɗaukar hotuna har zuwa biyar, inda ake adana kowane hoto da sunan fayil na musamman. Amfani da EEPROM yana ba da damar shirin ya tuna lambar hoto ta ƙarshe, yana tabbatar da cewa kowane sabon hoto yana da alamar musamman.

Nuni / Abin da Za Ka Yi Tsammani

Lokacin da kake kunna lambar, ESP32 zai fara kamara da katin SD. Bayan danna maɓallin sake kunnawa akan ESP32, zai ɗauki jerin hotuna, waɗanda za a ƙidaya su a jere daga 0 zuwa 255 bisa ga ƙimar EEPROM. Bayan ɗaukar hotunan, za ka iya cire ƙaramin katin SD kuma ka duba hotunan a kwamfutarka.

Matsalolin gama-gari sun haɗa da tabbatar da ƙaramin katin SD an tsara shi da kyau kuma an saka shi, da kuma kiyaye tsayayyen matsayi na kamara don guje wa hotuna marasa haske. Idan ka ci karo da matsalolin kamara ba ta ɗaukar hotuna ba, sake duba wayoyi da saitunan da aka saita a cikin lambar (a bidiyon a 06:45).

Lokutan Bidiyo

  • 00:00 Fara
  • 1:39 Gabatarwa
  • 5:19 Bayanin lambar ESP32 Camera
  • 11:10 Zaɓin allon ESP32 da tashar COM a cikin Arduino IDE
  • 12:52 Ɗaukar hotuna a ciki da gwajin waje

Hotuna

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
Harshe: 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
}

Albarkatun da kuma shafukan da za a duba

Fayiloli📁

Babu fayiloli da ake da su.