Come fare delle foto con una microcamera connessa ad arduino o altra scheda senza che sia connessa al pc(esp32 cam)

Ciao a tutti
Sto utilizzando una esp32 cam con il modulo esp32 cam mb, ma non voglio usarla come telecamera di videosorveglianza. Vorrei utilizzare una microcamera con arduino per fare delle foto a una piantina mentre cresce, cioè posizionare la esp32 cam sopra la piantina e fargli fare uno scatto ogni giorno e poi riprendere tutte le immagini. Ho pensato alla esp32 perchè ha lo slot microsd e ho letto recentemente proprio sul forum di arduino che arduino non ha potenza a sufficenza per elaborare le immagini, non so esattamente cosa voglia dire, perchè inizialmente volevo utilizzare un modulo ov7670...
Non credo che posso scattare delle foto di qualità neanche con l'esp32 cam, perchè il problema è che io volevo fare in modo che la microcamera non sia connessa al computer.
Ma le riprese che ho visto che vengono fatte sia con l'ov7670 che con il modulo esp32 sono come quelle del cellulare, sinceramente non ho capito se l'elaborazione del segnale viene fatto dal computer o dal modulo, credo dal computer e è per questo che le immagini salvate sulla microsd vengono viola, sfocate o in ogni caso pessime? O dipende da qualcos'altro? forse dal flash troppo rapido? Scusate l'ignoranza...
Posto il codice che ho utilizzato per il modulo.
Ma in sostanza io posso ottenere delle foto come quelle del cellulare con arduino e una microcamera collegata ad esso, anche con l'aggiunta di altri componenti? O utilizzando un'altra scheda? Ovviamente intendo senza che sia collegato al computer...
Chiedo perchè non sono riuscito a capirci un gran chè anche se ho cercato.
Potete chiarirmi le idee e magari spiegarmi anche perchè arduino non è in grado di elaborare le immagini e che cosa significa?


#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;
  }
    
  camera_fb_t * fb = NULL;
  
  // Take Picture with Camera
  fb = esp_camera_fb_get();  
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  // initialize EEPROM with predefined size
  EEPROM.begin(EEPROM_SIZE);
  pictureNumber = EEPROM.read(0) + 1;

  // 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); // payload (image), payload length
    Serial.printf("Saved file to path: %s\n", path.c_str());
    EEPROM.write(0, pictureNumber);
    EEPROM.commit();
  }
  file.close();
  esp_camera_fb_return(fb); 
  
  // 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);
  
  delay(2000);
  Serial.println("Going to sleep now");
  delay(2000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

void loop() {
  
}

Ciao @fedekr.
Le qualità delle immagini dipende essenzialmente dal modulo, il micro "abbinato" serve solo per gestire i dati e salvarli in una SD oppure mostrarli in una pagina web.

L'esp32-cam tipicamente monta un OV2640 che ha una risoluzione massima maggiore rispetto all'OV7670 (16001200 vs 640480).
Di contro però il sensore CMOS usato nell'OV7670 è più grande e sensibile e il modulo è dotato di un'ottica migliore.
Quindi se ti trovi in condizioni di scarsa luminosità e la risoluzione VGA è quanto ti basta, l'immagine sarà qualitativamente migliore.

Con l'esp32-cam ho riscontrato anche io problemi nella gestione del bilanciamento del bianco (immagini con colorazioni strane), soprattutto nella prima immagine catturata dopo un "periodo di riposo".
Se è così anche per te, potresti provare a fare due acquisizioni simultanee e scartare la prima.

I test di cui parlo, li ho fatti nell'ambito dello sviluppo della mia libreria per l'uso dei bot Telegram (quindi cercando di mantenere le dimensioni del file non troppo grandi a discapito un po' della qualità dell'immagine ovviamente).
Se sei interessato ti mando lo sketch di esempio.

Grazie della tua risposta, ti chiedo scusa se ti rispondo solo ora comunque mi hai detto quello che mi serviva sapere essenzialmente, mi sono ingannato perchè ho letto questa cosa che Arduino non è in grado di elaborare le immagini, poi appunto con il modulo ESP32 ho fatto alcune foto ed erano bruttissime, ma ho visto due video riguardo sia il modulo esp32 che l'ov7670 e le immagini trasmesse al computer erano per me ottime, attualmente sto seguendo tutti i passaggi per configurare il modulo ov7670 con Arduino e vedere se le immagini sono come quelle del video che ho visto.
Tuttavia le foto che ho fatto con il modulo esp32 sono diverse da quelle che ho visto in un video (in cui però lui la collega direttamente al pc, io la sto usando con la microsd) non so se è questo il motivo, ma le mie foto sono decisamente di qualità peggiore di quelle ne video, sono tendenti al verde anche in caso di scarsa luminosità, e poi basta pochissima luce perchè diventino totalmente verdi, forse è diverso con il modulo7670? Ma a dire il vero non ho ancora provato a connettere direttamente al pc ne un modulo ne l'altro.

Se vuoi ti posso mandare una foto esempio, magari sai quale è la causa, ma secondo me è il fatto che le sto salvando sulla microsd, non so non ci capisco niente sinceramente...
Se poi vuoi ancora mandarmi quello sketch sono curioso...

No, il fatto che salvi l'immagine sulla SD non ha nulla a che fare con il bilanciamento del bianco sbagliato.

Dipende principalmente dalla configurazione del modulo. Appena riesco ti mando lo sketch di esempio a cui facevo riferimento.

Ok grazie del chiarimento, aspetto il tuo sketch.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.