Cari Kode

Tutorial ESP32 42/55 - Mengambil Foto dengan Kamera simpan di Micro SD CAM-1 | Kit ESP32 SunFounder

Tutorial ESP32 42/55 - Mengambil Foto dengan Kamera simpan di Micro SD CAM-1 | Kit ESP32 SunFounder

Dalam tutorial ini, kita akan menggunakan mikrokontroler ESP32 beserta papan ekstensinya dari SunFounder untuk mengambil foto menggunakan kamera dan menyimpannya langsung ke kartu micro SD. Proyek ini memanfaatkan kemampuan bawaan ESP32, termasuk Wi-Fi dan Bluetooth, untuk membuat perangkat pengambil foto yang ringkas. Di akhir tutorial ini, Anda akan memiliki pengaturan yang berfungsi untuk mengambil dan menyimpan gambar, yang nantinya dapat diakses di komputer.

extension_bopard_camera

Bagi Anda yang baru mengenal ekosistem ESP32, kit ini menyediakan platform serbaguna untuk berbagai proyek, termasuk proyek ini. Kamera yang digunakan dalam proyek ini adalah OV2640, yang menawarkan resolusi 1600x1200 piksel. Meskipun mungkin tidak sebanding dengan kualitas ponsel pintar modern, kamera ini cukup untuk tugas pengambilan gambar dasar. Untuk memperjelas setiap langkah, pastikan untuk menonton video yang menyertai tutorial ini (di video pada 00:00).

20240103_163227858_iOS

Penjelasan Perangkat Keras

Komponen utama dalam proyek ini meliputi mikrokontroler ESP32, modul kamera (OV2640), dan kartu micro SD untuk penyimpanan. ESP32 adalah mikrokontroler yang kuat dengan kemampuan Wi-Fi dan Bluetooth terintegrasi, menjadikannya ideal untuk aplikasi IoT. Modul kamera menangkap gambar, yang kemudian diproses oleh ESP32.

esp32-41-setting-3

Kartu micro SD berfungsi sebagai media penyimpanan untuk gambar yang ditangkap. Dalam pengaturan ini, ESP32 berkomunikasi dengan modul kamera menggunakan pin GPIO tertentu, dan gambar disimpan dalam format JPEG di kartu SD. Ini memungkinkan pengambilan dan penampilan foto dengan mudah nantinya.

  • Pastikan kamera terorientasi dengan benar saat memasangnya ke papan ESP32.
  • Gunakan kartu micro SD dengan kapasitas 32 GB atau kurang untuk menghindari masalah kompatibilitas.
  • Hubungkan GPIO 0 ke GND untuk mode pemrograman.
  • Perhatikan catu daya untuk menghindari masalah brownout.
  • Jaga kamera tetap stabil saat mengambil foto untuk menghindari gambar buram.

Instruksi Pengkabelan

Untuk mengkabel modul kamera ESP32, pertama pastikan ESP32 dalam keadaan mati. Hubungkan modul kartu micro SD ke ESP32 menggunakan pin berikut: hubungkan pin CS kartu SD ke GPIO 5 ESP32, MOSI ke GPIO 23, MISO ke GPIO 19, dan SCK ke GPIO 18. Selanjutnya, hubungkan pin modul kamera sebagai berikut: PWDN ke GPIO 32, XCLK ke GPIO 0, SIOD ke GPIO 26, dan SIOC ke GPIO 27. Pin data piksel Y2 hingga Y9 harus dihubungkan ke GPIO 5 hingga GPIO 39 seperti yang didefinisikan dalam kode Anda.

Pastikan untuk menghubungkan pin ground dan daya dengan benar. ESP32 dapat diberi daya oleh baterai yang disertakan dalam kit. Setelah pengkabelan, pastikan koneksi aman sebelum menyalakan perangkat. Jika Anda mengikuti instruksi dengan cermat, Anda akan melihat kamera melakukan inisialisasi dengan benar saat Anda mengunggah kode.

Contoh Kode & Penjelasan

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

Dalam kode, kita mulai dengan menyertakan pustaka yang diperlukan dan mendefinisikan konfigurasi pin kamera. Variabel pictureNumber diinisialisasi untuk melacak jumlah foto yang diambil.

int pictureNumber = 0;

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);  // Nonaktifkan detektor brownout
  Serial.begin(115200);
  camera_config_t config;
  // Pengaturan konfigurasi untuk kamera
  config.ledc_channel = LEDC_CHANNEL_0;
  // Pengaturan kamera tambahan...
}

Fungsi setup menginisialisasi komunikasi serial dan mengonfigurasi pengaturan kamera. Konfigurasi mencakup parameter seperti ledc_channel, pin_d0, dan xclk_freq_hz untuk kinerja optimal.

Selanjutnya, kita menangani proses pengambilan gambar dengan menggunakan loop untuk mengambil beberapa foto. Data gambar disimpan ke kartu SD dengan nama file berdasarkan pictureNumber.

for (int shoot = 0; shoot < 5; shoot++) {
    camera_fb_t *fb = esp_camera_fb_get(); // Ambil Gambar
    String path = "/picture" + String(pictureNumber) + ".jpg"; // Jalur file
    File file = fs.open(path.c_str(), FILE_WRITE); // Buka file untuk menulis
    // Tulis data gambar ke file
    file.write(fb->buf, fb->len);
    // Perbarui nomor gambar di EEPROM
    EEPROM.write(0, pictureNumber);
}

Loop ini menangkap hingga lima gambar, di mana setiap gambar disimpan dengan nama file yang unik. Penggunaan EEPROM memungkinkan program untuk mengingat nomor gambar terakhir, memastikan bahwa setiap gambar baru memiliki pengidentifikasi unik.

Demonstrasi / Apa yang Diharapkan

Saat Anda menjalankan kode tersebut, ESP32 akan menginisialisasi kamera dan kartu SD. Setelah menekan tombol reset pada ESP32, kamera akan mengambil serangkaian foto, yang akan diberi nomor secara berurutan dari 0 hingga 255 berdasarkan nilai EEPROM. Setelah mengambil gambar, Anda dapat melepas kartu micro SD dan melihat foto-foto tersebut di komputer Anda.

Kesalahan umum yang sering terjadi meliputi memastikan kartu micro SD diformat dengan benar dan dimasukkan dengan baik, serta menjaga posisi kamera tetap stabil untuk menghindari gambar buram. Jika Anda mengalami masalah dengan kamera yang tidak mengambil gambar, periksa kembali kabel dan konfigurasi yang diatur dalam kode (di video pada menit 06:45).

Stempel Waktu Video

  • 00:00 Mulai
  • 1:39 Pendahuluan
  • 5:19 Penjelasan Kode Kamera ESP32
  • 11:10 Memilih papan ESP32 dan port COM di Arduino IDE
  • 12:52 Mengambil foto uji di dalam dan luar ruangan

Gambar

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

Sumber daya & referensi

Berkas📁

Tidak ada file tersedia.