Funktioniert ESP32-S3-Cam N16R8 mit OV2640 Kamera?

Hallo Zusammen,
da meine ESP32 Cam zwar funktionierte (mit direkter Stromversorgung an 3.3V), aber die Bildqualität und die lange Latenz sowie Verbindungsabbrüche einfach nervten dachte ich es wäre eine gute Idee für mehr Speicher zu sorgen und dafür ein ESP32-S3-CAM N16R8 zu benutzen.
Das will aber mit dem Beispielsketch "Kamera Webserver" nicht funktionieren. Jetzt frage ich mich, ob überhaupt jemand diese Konfiguration zum funktionieren gebracht hat.

Lasst es mich bitte wissen, alles was ich bei Tante Google gefunden habe endete im Nirwana...

Grüße
Rainer

Ja, das funktioniert bei mir problemlos.

Die Bildqualität ändert sich dabei aber nicht, bei meinen Boards auch die Verbindungsqualität nicht wesentlich so lange ich keine externe Antenne verwende.

Hast Du in den Kamera Einstellungen die Pinbelegung für das Board angepasst? Ich habe das "Wrover" Board ausgewählt.

Ich habe das Beispiel "Kamere Webserver" aber etwas verändert und bin nicht mehr sicher ob die Basis der Arduino Kamere Webserver war oder der von FreeNove... Ist schon ein paar Jahre her, ich denke fast es war das FreeNove Beispiel...

Hallo herbk,
sehr interessant, bei mir funktioniert der upload ohne Fehler,
im seriellen Monitor wird auch alles angezeigt wie es sein soll,
(inkl. freier PSRam).
Ich habe das ESP32S3 dev modul ausgewählt, wie in verschiedenen Foren empfohlen.
Die Einstellunge habe ich im Bild festgehalten....

Falls etwas auffält wäre ich für Hinweise dankbar.

Grüße
Rainer

Bei einem ESP32 S3 interesant

Ihr habt recht... Ich habe zuletzt ein Wrover Modul verwendet und deshalb gewechselt, - sorry

Ich hab noch mal ein wenig im Archiv gegraben und denke wir reden von zweierlei Einstellungen... Für Upload und ist das ESP32S3 Dev Module richtig, in den Einstellungen für die Kamera in der board_config.h muss die "ESP_EYE" aktiviert und die "AI_THINKER" deaktiviert werden.

Und ja, jetzt sicher, ich habe das CamereWebServer Beispiel von FreeNove verwendet, - weshalb weiß ich aber nicht mehr, - das war 2023...

Schau mal bei Dräger, ist sogar Testsketch dabei


Die markierten Parameter, mal 16 mal 8 MB, widersprechen sich. Leider gibt es für "ESP32S3 Dev Module" keine passende Auswahl für 16 MB Flash.

Danke Euch,

@herbk Danke, ich hatte CAMERA_MODEL_ESP32S3_EYE aktiviert.
Ich benutze eine externe Antenne.
Mit dem upload wollte ich bloß darauf hinweisen dass sich der Sketch korrekt kompilieren lässt.
@fony Das Beispiel von Draeger ist ein anderes Board, siehe Bild.
@agmue Das ist mir aufgefallen, aber wie ich das repariere soll weiß ich nicht.

Hier das von mir benutzte Board, darum geht es:

Danke Euch
Grüße
Rainer

Sieht aus wie dieses hier:

Kann das stimmen?

Ja, das Board ist identisch.

Hast Du sonst noch etwas an dem Board angeschlossen? wenn ja, an welchen Pins?

Nein, an dem Board ist ausser dem 24-pin Kabel (20cm mit Verbinder) der Kamera nichts angeschlossen, die Kamera liefert mit dem selben Anschluß am ESP32 Cam Modul ein Bild.

Grüße
Rainer

Dann finde ich bei CAMERA_MODEL_ESP32S3_EYE eine gute Übereinstimmung:

#elif defined(CAMERA_MODEL_ESP32S3_EYE)
#define PWDN_GPIO_NUM  -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM  15
#define SIOD_GPIO_NUM  4
#define SIOC_GPIO_NUM  5

#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16

#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM  7
#define PCLK_GPIO_NUM  13

Damit der ganze Speicher genutzt werden kann, könntest Du "4D Systems gen4-ESP32 Modules (ESP32-S3)" in der IDE auswählen:

Die Kamera hat er aber ausgewählt...

Das ist die Pinbelegung bei mir, ist aber kein identisches Board, - nur sehr ähnlich und ich weiss das es einige mit Ähnliche mit unterschiedlichen Pinbelegungen für die Kamera gibt.

#elif defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

Stimmt, den Text für Dich hatte ich übersehen. Wir sind uns einig :blush:

Danke Euch,
das gibt wieder einen langen Abend, aber ich probiere Eure Tipps natürlich aus bis das funktioniert.

Grüße
Rainer

Die geschwätzige Debug-Ausgabe (Core Debug Level Verbose) hat mir beim Verständnis geholfen. Dort habe ich auch die Bestätigung für die komplette RAM-Nutzung gefunden.

Hallo,
es bleibt spannend.
Wenn das Board von 4D Systems eingestellt ist kann ich keinen PSRam auswählen,
der AP wird erstellt, aber die serielle Ausgabe schweigt.
Im Browser wird die übliche Maske der Kamera angezeigt,
aber kein Bild bzw. das Symbol zerissenes Bild.
Vermutlich ist an der Pinbelegung der Kamera was faul, denn das zeigte ja auch das ESP32S3 Dev Module.
Ich suche mal die Pinbelegung der Kamera, vllt fällt da was auf.

Hier mal der Sketch, vielleicht mache ich ja generell was falsch.


#include <Arduino.h>

#include "esp_camera.h"

#include <WiFi.h>




// ===========================

// Select camera model in board_config.h

// ===========================

#include "board_config.h"




// ===========================

// Enter your WiFi credentials

// ===========================

const char* ssid = "25m Stand 1";

const char* password = "12345678"; // Min. 8 Zeichen

const int channel = 1; //Kanal festlegen, 1-13 möglich




void startCameraServer();

void setupLedFlash();




void setup() {

  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_sccb_sda = SIOD_GPIO_NUM;

  config.pin_sccb_scl = SIOC_GPIO_NUM;

  config.pin_pwdn = PWDN_GPIO_NUM;

  config.pin_reset = RESET_GPIO_NUM;

  //config.xclk_freq_hz = 12000000;

  config.xclk_freq_hz = 20000000;             //Original

  config.frame_size = FRAMESIZE_SXGA;           // Hier die Auflösung mit PSram einstellen!!!!

  //config.pixel_format = PIXFORMAT_GRAYSCALE;  //  bringt nix

  config.pixel_format = PIXFORMAT_JPEG;  // for streaming

  //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition

  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;

  config.fb_location = CAMERA_FB_IN_PSRAM;

  config.jpeg_quality = 12;

  config.fb_count = 1;





  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality

  //                      for larger pre-allocated frame buffer.

  if (config.pixel_format == PIXFORMAT_JPEG) {

    if (psramFound()) {

      config.jpeg_quality = 10;             //war 10, mögich 0-64, kleiner = besser

      config.fb_count = 2;                  //war 2, Anzahl Bilder im PSRAM zwischenspeichern

      config.grab_mode = CAMERA_GRAB_LATEST;

    } else {

      // Limit the frame size when PSRAM is not available

      config.frame_size = FRAMESIZE_SVGA;

      config.fb_location = CAMERA_FB_IN_DRAM;

    }

  } else {

    // Best option for face detection/recognition

  

    config.frame_size = FRAMESIZE_240X240;

#if CONFIG_IDF_TARGET_ESP32S3

    config.fb_count = 2;

#endif

  }




#if defined(CAMERA_MODEL_ESP_EYE)

  pinMode(13, INPUT_PULLUP);

  pinMode(14, INPUT_PULLUP);

#endif




  // 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;

  }




  sensor_t *s = esp_camera_sensor_get();

  

  //Versuch Flip/Mirror fest einstellen funktioniert!

  s->set_vflip(s, 0); // 1 = V-Flip ON, 0 = OFF (Vertikal spiegeln)

  s->set_hmirror(s, 0); // 1 = H-Mirror ON, 0 = OFF (Horizontal spiegeln)






  // initial sensors are flipped vertically and colors are a bit saturated

  if (s->id.PID == OV3660_PID) {

    s->set_vflip(s, 1);        // flip it back

    s->set_brightness(s, 1);   // up the brightness just a bit

    s->set_saturation(s, -2);  // lower the saturation

  }

  /*// drop down frame size for higher initial frame rate

  if (config.pixel_format == PIXFORMAT_JPEG) {    

    s->set_framesize(s, FRAMESIZE_SXGA);               // war QVGA, hat die Einstellungen oben überschrieben

  }*/




#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)

  s->set_vflip(s, 1);

  s->set_hmirror(s, 1);

#endif




#if defined(CAMERA_MODEL_ESP32S3_EYE)

  s->set_vflip(s, 1);

#endif




// Setup LED FLash if LED pin is defined in camera_pins.h

#if defined(LED_GPIO_NUM)

  setupLedFlash();

#endif




 // WiFi Modus auf AP setzen

  WiFi.mode(WIFI_AP);




  // softAP(ssid, password, channel, hidden, max_connection)

  // Kanal (3. Parameter) wird hier gesetzt

  if (WiFi.softAP(ssid, password, channel)) {

    Serial.print("Access Point erstellt.");

    Serial.print("SSID: ");

    Serial.println(ssid);

    Serial.print("Kanal: ");

    Serial.println(channel); // Zeigt den gesetzten Kanal (1-13)

    Serial.print("IP-Adresse: ");

    Serial.println(WiFi.softAPIP());




    startCameraServer();




    Serial.println("");




    Serial.print("Camera Ready! Use 'http://");

    Serial.print(WiFi.softAPIP());

    Serial.println("' to connect");




  } else {

    Serial.println("Fehler beim Erstellen des AP.");

  }

  

  // PSRAM Initialisierung prüfen

  if(psramFound()){

    Serial.println("PSRAM gefunden!");

    Serial.print("Gesamt PSRAM: ");

    Serial.print(ESP.getPsramSize() / 1024);

    Serial.println(" KB");

    

    Serial.print("Freier PSRAM: ");

    Serial.print(ESP.getFreePsram() / 1024);

    Serial.println(" KB");

  } else {

    Serial.println("Kein PSRAM gefunden oder nicht aktiviert.");

  }

}




void loop() {

  // Do nothing. Everything is done in another task by the web server

  delay(10000);

  /*  delay(500);

    // PSRAM Initialisierung prüfen

  if(psramFound()){

    Serial.println("PSRAM gefunden!");

    Serial.print("Gesamt PSRAM: ");

    Serial.print(ESP.getPsramSize() / 1024);

    Serial.println(" KB");

    

    Serial.print("Freier PSRAM: ");

    Serial.print(ESP.getFreePsram() / 1024);

    Serial.println(" KB");

  } else {

    Serial.println("Kein PSRAM gefunden oder nicht aktiviert.");

  }

  */

}

Grüße und einen schönen Sonntag

Rainer

Ich verwende Arduino IDE 2.3.6; ESP32 Core 3.3.5

Das ist standardmäßig ausgewählt, allerdings bin ich gerade nicht sicher, ob das auch funktioniert. Daher zurück zu "ESP32S3 Dev Module".

Einstellungen

leicht abgewandeltes RGB-Testprogramm aus dem IDE-Fundus
#define RGB_BRIGHTNESS 64 // Change white brightness (max 255)
#define PIN_NEOPIXEL 48


// the setup function runs once when you press reset or power the board

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("\nEnde Setup, Programmstart ...");
  // No need to initialize the RGB LED
}

// the loop function runs over and over again forever
void loop() {
  rgbLedWrite(PIN_NEOPIXEL, RGB_BRIGHTNESS, 0, 0);  // Red
  delay(1000);
  rgbLedWrite(PIN_NEOPIXEL, 0, RGB_BRIGHTNESS, 0);  // Green
  delay(1000);
  rgbLedWrite(PIN_NEOPIXEL, 0, 0, RGB_BRIGHTNESS);  // Blue
  delay(1000);
  rgbLedWrite(PIN_NEOPIXEL, 0, 0, 0);  // Off / black
  delay(1000);
}

Der serielle Monitor zeigt dann nach dem Hochladen 101 Zeilen, wovon mir diese wichtig erscheinen:

SPIRAM Memory Info:
------------------------------------------
  Total Size        :  8388608 B (8192.0 KB)
...
  Bus Mode          : OPI
------------------------------------------
Flash Info:
------------------------------------------
  Chip Size         : 16777216 B (16 MB)
...
  Bus Mode          : QIO

Kannst Du das reproduzieren?

Hallo agmue,
Danke für Deine Mühen.
Ja, die Ausgabe ist bei mir die selbe:

19:16:26.211 -> SPIRAM Memory Info:

19:16:26.211 -> ------------------------------------------
19:16:26.211 -> Total Size : 8388608 B (8192.0 KB)
...
19:16:26.211 -> Bus Mode : OPI

19:16:26.243 -> Flash Info:

19:16:26.243 -> ------------------------------------------
19:16:26.243 -> Chip Size : 16777216B (16 MB)
...
19:16:26.276 -> Bus Mode : QIO

Ich benutze Arduino IDE 2.3.10, ESP32 Core 3.3.10

Bin gerade dabei die Pinbelegung Hardwareseitig zu prüfen, eine echte Fummelei.....

Grüße
Rainer