ESP32-Cam mit merkwürdigem Verhalten

Wie dem Titel zu entnehmen, habe ich bei der ESP32-Cam ein Verhalten welches ich mir nicht erklären kann.
Ich will um mir ein FoMo Modell erstellen zu können Bilder sammeln. Für so ein Model benötigt man viele Bilder ( >50 ) von einem Objekt das man identifizieren möchte. Um das zu automatisieren habe ich mir einen Sketch geschrieben der alle 5 Sekunden ein Bild machen und auf die SD Karte speichen soll, was auch finktioniert. Aufstellen muss ich die Cam im Freien und habe deshalb Gehäuse dafür gedruckt, sie sehen so aus, das Dach oben ist abnehmbar:
ESP_Cam_Box

Das Gehäuse wird am Stativ befestigt und steht dann so auf der Terasse:
ESP_Cam_Box_02

Un jetzt zum merkwürdigen verhalten:
So bald das Dach auf dem Gehäuse ist, macht die CAM keine Bilder mehr, außer:
ich halte etwas im Abstand von 50cm oder weniger vor das Objetiv
ich bewege das Stativ

Das Umgebungslicht spiel dabei keine Rolle, das verhalten war an dem sonnigen Tag genauso wie Heute wo es trüb ist.
Das Verhalten ist bei beiden Cameras gleich, die Camera mit dem verstellbaren Objektiv zeigt es etwas deutlicher.
So bald das Dach abgenommen ist läuft alles wie geplant, - nein, das Dach drückt nirgends drauf, auch nicht auf die SD Karte :wink: Ohne Dach habe ich Gestern und Vorgestern jeweils etwa 3500 Bilder aufgenommen.

Hat da schon mal jemand eine ähnliche Beobachtung gemacht?

Einen Verdacht habe ich noch: Die Cam's haben irgendwo am Gehäuse noch einen Sensor mit welchem die Belichtung gemessen wird, kann da aber nichts sehen.
Weiß da jemand etwas? Am DaBla habe ich auch keinen Hinweis gefunden.

Ich denke ich habe den Fehler gefunden:
Das Dach darf unten nicht so hell sein ! Ich habe versuchsweise den Deckel der kleinen Cam unten mit schwarzem Tape beklebt, seit dem Blitzt sie vor sich hin.
Morgen dann der gleiche Versuch mit der Großen, - wenn Der das gleiche Resultat bringt denke ich eindeutig...

1 Like

Falsch gedacht...: Heute ist es mal wieder etwas heller draußen, und die Cam macht keine Bilder mehr.
Wenn ich die Hand in einer Entfernung von 40cm und weniger vor das Objektiv halte macht sie Bilder wie erwartet.

Also weitersuchen...

Irgendwie komme ich bei der Geschichte nicht weiter, deshalb die Bitte an ESP32-Cam besitzer mal zu überprüfen ob Eure Boards auch so verhalten.

Hier zum Testen mal der Sketch von der "Randomnerd" Seite, ich habe den, meinen (der allerdings auch davon abgeleitet ist) und inzwischen wohl die Hälfte aller auf Github gefundenen Timelapse Sketche durch.

Summary
/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-ov2640-camera-settings/
*********/

#include "esp_camera.h"
#include "FS.h"                // SD Card ESP32
#include "SD_MMC.h"            // SD Card ESP32
#include "soc/soc.h"           // Disable brownout problems
#include "soc/rtc_cntl_reg.h"  // Disable brownout problems
#include "driver/rtc_io.h"

// Pin definition for CAMERA_MODEL_AI_THINKER
// Change pin definition if you're using another ESP32 with camera module
#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

// Keep track of number of pictures
unsigned int pictureNumber = 0;

//Stores the camera configuration parameters
camera_config_t config;

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  
  //Initialize the camera  
  Serial.print("Initializing the camera module...");
  configInitCamera();
  Serial.println("Ok!");
 
  //Initialize MicroSD
  Serial.print("Initializing the MicroSD card module... ");
  initMicroSDCard();
}

void loop() {
  //Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());

  //Take and Save Photo
  takeSavePhoto(path);
  pictureNumber++;
  delay(5000); 
}

void configInitCamera(){
  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; //YUV422,GRAYSCALE,RGB565,JPEG

  // Select lower framesize if the camera doesn't support PSRAM
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 10; //10-63 lower number means higher quality
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Initialize the Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  s->set_brightness(s, 0);     // -2 to 2
  s->set_contrast(s, 0);       // -2 to 2
  s->set_saturation(s, 0);     // -2 to 2
  s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
  s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable
  s->set_wb_mode(s, 0);        // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
  s->set_exposure_ctrl(s, 1);  // 0 = disable , 1 = enable
  s->set_aec2(s, 0);           // 0 = disable , 1 = enable
  s->set_ae_level(s, 0);       // -2 to 2
  s->set_aec_value(s, 300);    // 0 to 1200
  s->set_gain_ctrl(s, 1);      // 0 = disable , 1 = enable
  s->set_agc_gain(s, 0);       // 0 to 30
  s->set_gainceiling(s, (gainceiling_t)0);  // 0 to 6
  s->set_bpc(s, 0);            // 0 = disable , 1 = enable
  s->set_wpc(s, 1);            // 0 = disable , 1 = enable
  s->set_raw_gma(s, 1);        // 0 = disable , 1 = enable
  s->set_lenc(s, 1);           // 0 = disable , 1 = enable
  s->set_hmirror(s, 0);        // 0 = disable , 1 = enable
  s->set_vflip(s, 0);          // 0 = disable , 1 = enable
  s->set_dcw(s, 1);            // 0 = disable , 1 = enable
  s->set_colorbar(s, 0);       // 0 = disable , 1 = enable
}

void initMicroSDCard(){
  // Start Micro SD card
  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;
  }
}

void takeSavePhoto(String path){
  // Take Picture with Camera
  camera_fb_t  * fb = esp_camera_fb_get();

  
  
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }

  // Save picture to microSD card
  fs::FS &fs = SD_MMC; 
  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());
  }
  file.close();
  
  //return the frame buffer back to the driver for reuse
  esp_camera_fb_return(fb); 
}

Noch mal zum Verhalten der ESP32-CAM:
Die Cam macht und speichert Bilder so lange das Licht ein bestimmtes Level nicht übersteigt.
Heisst: Am Sofa oder sonst wie Indoor und ohne direkte Sonneneinstrahlung, funktioniert das alles wie erwartet. So bald ich mit der Cam aber raus gehe und die Sonne scheint werden keine Bilder mehr aufgenommen. Schiebt sich eine Wolke vor die Sonne, bekomme ich wieder Bilder.

So langsam bin ich bei den ESP32-CAM Modulen am Zweifeln was da verkauft wird...
Ich hatte ja schon 2, welche mit einem "Bild auf SD Karte speichern" Sketch ja nur Bilder machen wenn das Licht schlecht ist, mit dem CameraWebserver aus den ESP Beispielen aber einwandfrei funktionieren.
Weil ich die die ESPcams aber eigentlich für Zeitrafferaufnahmen nutzen möchte (und nicht mehr wusste an welcher Einstellnung ich noch was probieren könnte) habe ich mir jetzt noch mal 2 gekauft.
Leider zeigen die das gleiche Verhalten: Gutes Licht, es wird kein Bild aufgenommen!
Zusätzlich funktionieren die beiden Neuen nicht mit dem CameraWebserver Beispiel und die Blitz LED brennt schon leicht so bald man das Board mit Strom versorgt...

Mahlzeit!
Das ist wirklich seltsam. Meine Cam macht auch Aufnahmen bei gleißend hellem Licht.
An den ganzen Einstellungen haben ich praktisch nix gesetzt:

  if (highRes && psramFound())  {
    //config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    //Reduce for Telegram
    config.frame_size = FRAMESIZE_SXGA;
    config.jpeg_quality = 10;
    config.fb_count = 1;
    Serial.println("High Res");
  }
  else
  {
    //config.frame_size = FRAMESIZE_SVGA;
    config.frame_size = FRAMESIZE_SXGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
    Serial.println("Low Res");
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK)  {
    Serial.printf("Camera init failed with error 0x%x", err);
    return err;
  }
  sensor_t *s = esp_camera_sensor_get();
  s->set_ae_level(s, -2);
  return err;

Tagesaktuelle Aufnahme, nachdem die Sonne durch die Wolkendecke brach:

Was ich noch gemacht habe, das ESP32 Board auf 1.06 belassen. Sonst startete es ständig neu, die Bilder hatten einen massiven Blaustich und Streaming ging gar nicht mehr.

OK, das habe ich noch nicht probiert... wird Morgen gemacht, Heute wird's nicht mehr hell genug.

Aus welchem Sketch / Beispiel ist der Codeschnipsel ? Er Unterscheidet sich in dieser Zeile
if (highRes && psramFound()) {
von dem was ich habe, - ich habe highRes && nicht mit drin, - will aber auch keine highRes Bilder.

Und erklärt für mich auch nicht weshalb mit den beiden Boards, die Gestern gekommen sind, das CameraWebserver Beispiel nicht mehr geht...
Da bekomme ich im Serial Monitor eine Fehlermeldung dass sich die Camera nicht initialisieren lässt.

Ja, da habe ich eine Variable hinzugefügt, um auszuprobieren wie sich das Ganze verhält.
Den gesamten Code kannst Du hier sehen:

Du initialisierst aber die Kamera mit der höchsten Auflösung.

Und aktivierst ja einige Funktionen, wo ich mir gut vorstellen kann, dass die ein oder andere Kombination möglicherweise zu so einem Verhalten führen könnte.

s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable
  s->set_exposure_ctrl(s, 1);  // 0 = disable , 1 = enable
  s->set_aec_value(s, 300);    // 0 to 1200
  s->set_gain_ctrl(s, 1);      // 0 = disable , 1 = enable
  s->set_wpc(s, 1);            // 0 = disable , 1 = enable
  s->set_raw_gma(s, 1);        // 0 = disable , 1 = enable
  s->set_lenc(s, 1);           // 0 = disable , 1 = enable
  s->set_dcw(s, 1);            // 0 = disable , 1 = enable

Dann nehme ich mal an, dass die Kameras keinen PSRAM haben. Liest man immer mal wieder, dass sich manche Hersteller den gespart haben.

Ja, sieht so aus...
Ich habe Gestern Abend auch mal Tante Google mit der Fehlermeldung gefüttert und bin recht schnell auf diesen Thread gestoßen: esp32-cam-esp-core-dump-flash
Das Ändern der .csv bringt bei mir aber keine Besserung, das müsste ich wohl noch auf die Werte meiner ESPs anpassen.
Wenn ich die .csv auf die Werte ändere die im Thread genannt sind, dann bekomme ich bereits beim kompilieren eine Fehlermeldung dass der PSram nicht passt.
Rücksetzen auf die die 1.06er Bordpakete bringt auch eine Fehlermeldung, - der Kompiler vermisst da irgend etwas die serielle Verbindung betreffend, die genaue Fehlermeldung hab' ich nicht notiert.
Was bei dem verlinktem Thread aber auch eindeutig herauszulesen ist: bei den ESP32-Cam Boards ist viel Schrott am Markt...

Na ja, Bilder machen geht ja mit allen Modulen, jetzt muss ich halt noch Einstellungen finden dass dies auch bei Sonnenschein passiert...

Nachdem ich jetzt noch ein "interessantes" Verhalten festgestellt habe mache ich mal den ESP32-Cam "Erfahrungsbericht" weiter, vorher jedoch die Frage: Wie kann man herausfinden wie viel PSRAM tatsächlich vorhanden ist? Bezeichnet sind meine alle mit ESP32 S, ohne weiteren Zusatz.

Weil ich das Gefummel mit dem FTDI Adapter und den Jumperkabeln nicht gerade mag, hatte ich mir die ersten beiden ESP32-Cam's mit dem Adapterboard gekauft. Eines hat von Anfang an nicht richtig funktioniert, das Zweite hat sich dann Gestern Morgen verabschiedet.
Also doch Kabelgefummel... Vorsichtshalber noch mal geguckt wie der FTDI angeschlossen wird und, ich weiß nicht wie oft, auf diese Abbildung gestoßen:


Wenn ich so anschließe, endet jeder Uploadversuch mit einer Fehlermeldung... War aber auch zu erwarten, denn dieser GND Pin ist, wie in einem anderen Thread schon beschrieben, ja gar kein richtiger GND.
Deshalb GND auf den GND neben dem 5V Anschluß gesetzt, auf hochladen gecklickt und bei "Connect....." schön brav den Reset Knopf gedrückt, - Ergebnis : Fehlermeldung... OK, zu spät gedrückt, nächster Versuch, etwas früher drücken, - Fehlermeldung. Verkabelung zum xten mal überprüft, - verd... weshalb kommt da ständig diese Fehlermeldung...?
Irgendwann hab ich dann nach dem Upload Button klicken den Resetknopf nicht schnell genug gefunden und, hä, was ist jetz das ? Wieso läd der jetzt hoch? Also noch mal: Hochladen angeklickt, nix gedrückt, läd hoch...
OK, wielleicht weil es eh das verkorkste Board ist (wo die LED immer glimmt und das Webserverbeispiel nicht läuft)... Eines meiner "alten" Boards geholt, das gleich Spiel: Hochladen geht nur OHNE Restknopf drücken ! Bei allen 4 ESP32-CAMs die ich habe (ausprobiert) ...

Jetzt frag' ich mich schon ob alle Anleitungsschreiber die das obige Bild benutzt haben und alle "Hochlade- Restknopfdrücker" das wirklich jemals selbst mit einer ESP32-CAM ausprobiert haben, oder ob die Anleitungen einfach nur von mir unbekannter Quelle kopiert wurden. Ähnlich genug sind sich ja so wohl Texte als auch Abbildungen...
Oder es gibt tatsächlich so viele Boardvarianten...

Einziges was ich sehe Du klemmst den FTI auf 5V dadurch ist auf RX, TX 5 V Pegel, normal kann man den FTI auf 3,3V umschalten dadurch ist auf den ESP Pins auch 3,3V.
Mit 5V kann man die Pins unterständen kaputt machen.

Das Bild ist ja nicht von mir sondern das aus einer der vielen Anleitungen im Internet. Einige Anleitungen erwähnen sogar explizid dass man auf 5V jumpern soll... Ich bin allerdings auf 3,3V, nur eben den GND neben dem 5V Pin genommen.

Da wird das nicht sicher funktionieren.
Die 3,3V werden vom Schnittstellen-IC erzeugt und der liefert nicht genug Strom für den ESP32.
Da solltest du besser eine eigene Spannungsversorgung mit 3,3Volt aufbauen.

Was ist denn an deinem Adapter für die CAM gestorben ?

Damit meinte ich nur den FTI nicht als Versorger, der FTI Schaft nicht den ESP richtig befeuern. Kenne jedoch nicht was für einer das ist, Es ist ein "Programmer" und kein Netzteil.
So wie Du schreibst das beste für Cam ist das Unterteil mit USB + den CH xx Chip

Ja, so flashe ich die CAM zum ersten mal. Danach setze ich die auf ein eigenes Board mit eigener Versorgung und per OTA. Das hat so bisher am besten funktioniert. Allerdings bin ich da noch im "Versuchsstadium". Also immer noch am testen.
Aktuell habe ich noch 2 wichtigere Projekte hier am entstehen, daher ist die CAM nicht wichtig.

Ich hatte vor einiger Zeit mal die Ergiebigkeit der 3,3V zusammen gesucht:

  • FTDI (das Original): 50 mA
  • CP2102: 100mA
  • CH340: 25 mA

Gruß Tommy

2 Likes

Danke @Tommy56, das mit dem CH wusste ich, war schon öfters wegen den China NANO, MEGA, UNO.

Das muss ich mir mal ablegen (aber so, dass ich es wiederfinde) :wink:
Und bei keinem reicht es für den ESP32.

Nach dem Sine "Ich mach mir kleine Datenbank", nur irgend wann ist die so groß, lang das man wider sucht wie Bekloppter :wink:

Dafür gibt es dann eine Datenbank für die Suchbegriffe.