ኮድ ይፈልጉ

የESP32 ትምህርት 42/55 - ካሜራ በመጠቀም ፎቶ መውሰድ እና በማይክሮ ኤስዲ CAM-1 ላይ ማስቀመጥ | SunFounder የESP32 ኪት

የESP32 ትምህርት 42/55 - ካሜራ በመጠቀም ፎቶ መውሰድ እና በማይክሮ ኤስዲ CAM-1 ላይ ማስቀመጥ | SunFounder የESP32 ኪት

በዚህ መማሪያ ውስጥ፣ ከSunFounder የተገኘውን የESP32 ማይክሮኮንትሮለር ከማስፋፊያ ሰሌዳው ጋር በመጠቀም ካሜራ በመጠቀም ፎቶዎችን ለማንሳት እና በቀጥታ በማይክሮ ኤስዲ ካርድ ላይ ለማስቀመጥ እንሞክራለን። ይህ ፕሮጀክት የESP32 አብሮ የተሰሩ ችሎታዎችን፣ ዋይ ፋይ እና ብሉቱዝን ጨምሮ፣ የታመቀ ፎቶ የሚያነሳ መሳሪያ ለመፍጠር ይጠቀማል። በዚህ መማሪያ መጨረሻ ላይ፣ ምስሎችን የሚያነሳ እና የሚያከማች የሚሰራ ዝግጅት ይኖርዎታል፣ ከዚያም በኋላ በኮምፒውተር ላይ ማግኘት ይችላሉ።

extension_bopard_camera

ለESP32 ስነ-ምህዳር አዲስ ለሆኑ ሰዎች፣ ይህ ኪት ለተለያዩ ፕሮጀክቶች ሁለገብ መድረክ ይሰጣል፣ ይህንንም ጨምሮ። በዚህ ፕሮጀክት ውስጥ ጥቅም ላይ የዋለው ካሜራ OV2640 ሲሆን፣ የ1600x1200 ፒክሰል ጥራት ይሰጣል። ከዘመናዊ ስማርትፎኖች ጥራት ጋር ባይመሳሰልም፣ ለመሰረታዊ ምስል የመቅረጽ ተግባራት በቂ ነው። ማንኛውንም እርምጃ ለማብራራት፣ ከዚህ መማሪያ ጋር የተያያዘውን ቪዲዮ መመልከትዎን ያረጋግጡ (በቪዲዮው በ00:00)።

20240103_163227858_iOS

ሃርድዌር ተብራርቷል

በዚህ ፕሮጀክት ውስጥ ዋና ዋና ክፍሎች የESP32 ማይክሮኮንትሮለር፣ የካሜራ ሞጁል (OV2640) እና ለማከማቻ የሚያገለግል ማይክሮ ኤስዲ ካርድ ያካትታሉ። ESP32 የተዋሃደ ዋይ ፋይ እና ብሉቱዝ ችሎታ ያለው ኃይለኛ ማይክሮኮንትሮለር ነው፣ ለIoT አፕሊኬሽኖች ተስማሚ ያደርገዋል። የካሜራ ሞጁሉ ምስሎችን ይይዛል፣ ከዚያም በESP32 ይሰራሉ።

esp32-41-setting-3

ማይክሮ ኤስዲ ካርዱ ለተያዙ ምስሎች እንደ ማከማቻ መሳሪያ ይሰራል። በዚህ ዝግጅት ውስጥ፣ ESP32 ከካሜራ ሞጁሉ ጋር የተወሰኑ GPIO ፒንዎችን በመጠቀም ይግባባል፣ እና ምስሎቹ በኤስዲ ካርዱ ላይ በJPEG ቅርጸት ይቀመጣሉ። ይህ በኋላ ላይ ፎቶዎችን በቀላሉ ለማግኘት እና ለመመልከት ያስችላል።

  • ወደ ESP32 ሰሌዳ ሲያስገቡ ካሜራው በትክክል መቅጠሩን ያረጋግጡ።
  • ተኳሃኝነት ችግሮችን ለማስወገድ 32 ጊባ ወይም ከዚያ ያነሰ አቅም ያለው ማይክሮ ኤስዲ ካርድ ይጠቀሙ።
  • ለፕሮግራም አወጣጥ ሁነታ GPIO 0ን ከGND ጋር ያገናኙ።
  • የብራውን-አውት ችግሮችን ለማስወገድ ለኃይል አቅርቦቱ ትኩረት ይስጡ።
  • የተዝበላሉ ምስሎችን ለማስወገድ ፎቶ በሚነሱበት ጊዜ ካሜራውን በተረጋጋ ሁኔታ ያቆዩት።

የሽቦ አገናኝ መመሪያዎች

የESP32 ካሜራ ሞጁሉን ለማገናኘት፣ በመጀመሪያ ESP32 ከኃይል መቋረጡን ያረጋግጡ። የማይክሮ ኤስዲ ካርድ ሞጁሉን ከESP32 ጋር የሚከተሉትን ፒንዎች በመጠቀም ያገናኙ፡ የኤስዲ ካርዱን 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 ጋር መገናኘት አለባቸው።

የመሬት (ground) እና የኃይል ፒንዎችን በትክክል ማገናኘትዎን ያረጋግጡ። 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_channelpin_d0 እና xclk_freq_hz ያሉ መለኪያዎችን ለተመቻቸ አፈጻጸም ያካትታል።

በመቀጠል፣ ብዙ ፎቶዎችን ለማንሳት loop በመጠቀም የምስል የመቅረጽ ሂደቱን እንይዛለን። የምስል ዳታው በ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);
}

ይህ loop እስከ አምስት ምስሎችን ይይዛል፣ እያንዳንዱ ምስል በልዩ የፋይል ስም ይቀመጣል። EEPROM መጠቀም ፕሮግራሙ የመጨረሻውን የፎቶ ቁጥር እንዲያስታውስ ያስችላል፣ ይህም እያንዳንዱ አዲስ ምስል ልዩ መለያ እንዲኖረው ያረጋግጣል።

ማሳያ / ምን እንደሚጠበቅ

ኮዱን ሲያስኬዱ፣ ESP32 ካሜራውን እና የኤስዲ ካርዱን ያስነሳል። በESP32 ላይ ያለውን የሪሴት ቁልፍ ከተጫኑ በኋላ፣ ተከታታይ ምስሎችን ይወስዳል፣ እነዚህም በEEPROM እሴት መሰረት ከ0 እስከ 255 በቅደም ተከተል ይቆጠራሉ። ምስሎቹን ከወሰዱ በኋላ፣ ማይክሮ ኤስዲ ካርዱን አውጥተው ምስሎቹን በኮምፒውተርዎ ላይ ማየት ይችላሉ።

የቪዲዮ የጊዜ ምልክቶች

  • 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
}

ምንጮች እና ምንጮች

ፋይሎች📁

አንድ ፋይል የለም።