De AI-Thinker ESP32_camera module



Het eerste wat me opviel was dat er blijkbaar meerder ESP32 cam types zijn. O.a. de ESP32 CAM OV2640 2MP Type C of Grove CP2104 USB TTL Development Board, en de veel komende versie gewoon aangeduid als ESP32-Cam. Verder ook nog een ESP32 cam van RS die op een standaard ESP6266 lijkt.
Veel IO poorten van de ESP zijn gebruikt voor een camera. Ook daar blijken verschillende camera's met verschillende aansluitingen voor gebruikt te worden. Er is o.a. de OV2640 camera die veel meegeleverd wordt. Handig om te weten als je een ESP32 cam wil gaan bestellen.
Wat je bij de meest gangbare ESP32 cam IC's mist is de USB aansluiting. Dus weer met de FTDI en alle daarbij voorkomende problemen werken. Er zit er een sd kaart lezer en een camera met flash (flitslicht) aansluiting op de ESP32. Er zit een vierhoekje aan de onderzijde waar je een verbinding moet solderen voor het gebruik van interne antene of externe antene.
Specificaties van de ESP32 cam is vrijwel gelijk aan de ESP32.(met uitzondering dus van de USB aansluiting en camera)

802.11b/g/n Wi-Fi
Bluetooth 4.2 with BLE
UART, SPI, I2C and PWM interfaces
Clock speed up to 160 MHz
Computing power up to 600 DMIPS
520 KB SRAM plus 4 MB PSRAM
Supports WiFi Image Upload
Multiple Sleep modes
Firmware Over the Air (FOTA) upgrades possible
9 GPIO ports
Built-in Flash LED


De OV2640 camera:

2 Megapixel sensor
Array size UXGA 1622Χ1200
Output formats include YUV422, YUV420, RGB565, RGB555 and 8-bit compressed data
Image transfer rate of 15 to 60 fps

Een ESP met een afmeting van 27*40.5*4.5mm en in de diepe slaap modus een gebruik heeft van 6mA.
De camera kan ingezet worden in diverse IoT projecten. 'Sky is the limmit' maar hier gaat dat verder want nu kan je draadloos over 802.11b/g/n Wi-Fi, de beelden verzenden.
De module beschikt over bleutooth 4.2 en WiFi en beschikt over 520 kb Sram.

Onder de metalen plaat is de ruimte voor de SDkaart. Hou er rekening mee dat de ESP32 soms meer vermogen wil trekken via de USB/FTDI dan de PC kan leveren. Tijdens het laden van de sketch kan dat een probleem gaan geven. Heb ik niets van gemerkt maar ik gebruik de 5V uitgang van de FTDI en de 5V ingang van de ESP32 bij het laden van de sketch.

De bekabeling zoals de afbeelding van randomnerdtutorials. De grijze kabel van IO0 naar gnd is nodig tijdens het programeren en daarna niet meer.
Sluit de module aan en verander in de Arduino IDE het board naar ESP Wrover Module
Uploadspeed 921600
Flash freq 80 mHz
Flash mode QIO
Partition Schema Hug App (3MB No Qta)
Core debug none

De externe antene of de interne antene kan je zelf kiezen. De groene lijn bij de antene aansluiting is de verbinding met de externe antene en de rode lijn met de interne antene.

Mijn eerste ervaring met de ESP32 is met de ESP32CAM.
Een onboard camera met gezichts herkenning.
De ESP32CAM heeft geen USB aansluiting dus weer de FTDI232 pakken om de ESP32Cam van data te voorzien. Die had ik al weer een hele tijd geleden gebruikt dus eerst maar weer de juiste drivers instaleren.
Met mijn telefoon vergrootglas (camera) een foto gemaakt van het IC Het is lastig om zonder camera in een speciale hoek tegen het licht, het IC te lezen. Maar blijkt gewoon een standaard IC te zijn FT232R.
D pinsextern te benaderenGPIOgebruikt voor
ja GPIO 0 bepaald of de ESP in FLASH mode is of niet, intern is deze GPIO verbonden via een 10K weerstand aan de plus. GPIO 0 aan massa is dus FLASHmode. Normal mode is dus een losse GPIO0.
ja GPIO 1 en GPIO 3 heb je nodig als TX en RX om de data op de ESP32Cam te zetten.
ja GPIO 2 SDkaart, data0.
ja GPIO 3
ja GPIO 4 SDkaart, data1 en flitslicht. (kan problemen geven bij SD kaart en flitslicht gebruik.)
D0 GPIO 5 camera
ja GPIO 12 SDkaart, data2
ja GPIO 13 SDkaart, data3
ja GPIO 14 SDkaart, CLK.
ja GPIO 15 SDkaart, CMD.
ja GPIO 16
D1 GPIO 18 camera,
D2GPIO 19 camera,
D3GPIO 21 camera,
GPIO 22 camera, PCLK.
GPIO 23 camera, HREF.
GPIO 25 camera, VSYNC.
GPIO 26 camera, SDA.
GPIO 27 SCL.
GPIO 32 POWER PIN.
GPIO 33 is de interne rode led.
D6 GPIO 34 camera
D7 GPIO 35 camera
D4 GPIO 36 camera Y8
D5 GPIO 39 camera
Volgens randomnerds kan je het probleem met SDkaart en flitslicht voorkomen door SD_MMC.begin("/sdcard", true) op te nemen. Maar het flits effect blijkt wel aan te blijven maar geeft minder licht.
De ESP32cam aansluiten op de FTDI232 volgens ROBOTZERO.ONE:
ESPCAM FTDI
5V op 5V
GND op GND
UOT op RXD
UOR op TXD
IO0 verbinden met ESP32 gnd tijdens Flashen.

kies bestand -> voorkeuren -> en vul bij 'meer boardmanagers urls:' https://dl.espressif.com/dl/package_esp32_index.json in (eventueel een komma tussen de vorige voorkeur)
restart de Arduino IDE
kies bij boards -> boardsmanager -> type achter all: ESP32 en selecteer -> ESP32 by Espressif Systems
restart de Arduino IDE
kies board -> ESP Wrover Module of AI-Thinker.
kies voorbeelden -> ESP32 -> Camera -> CameraWebServer
kies bij poort -> de juiste compoort (vaak de onderste)
kies bij hulpmiddelen/tools -> partitie schema ->Huge APP (3MB No OTA)<-
druk op de reset knop (onderzijde) van de ESP32Cam.
kies opload

En nu zou het moeten uploaden maar ik krijg de melding dat het bestand/script te groot is. Bij Randomnerds hebben ze die foutmeldingen op een rijtje gezet met de oplossingen erbij.

1) Failed to connect to ESP32 timed out waiting for packet header (geen verbinding en duurt te lang) De ESP32 is niet in de Flashing mode. Vermoedelijk is de bekabeling niet goed.
It means that you haven’t selected the right partition scheme. Make sure you select the right partition scheme. In your Arduino IDE, go to Tools > Partition Scheme, select “Huge APP (3MB No OTA)“.
Het bleek dat bij mij de instelling Huge app niet juist was.
Uploaden lukt nu maar bij serial monitor lees ik:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
Tja je moet natuurlijk wel na het uploaden de verbinding tussen IO0 en gnd verwijderen anders verwacht de ESP32Cam een nieuwe sketch. De verbinding verbroken en een nieuwe reset geeft een nieuwe melding via serieel monitor:

[E][camera.c:1049] camera_probe(): Detected camera not supported.
[E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004
bij de oplossingen kom ik ook de melding tegen en wordt geadviseerd om de #define CAMERA_MODEL_AI_THINKER te gebruiken.
Na de upload weer een andere melding:
Brownout detector was triggered

ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8


Ik verwacht echter de melding dat hij het netwerk zoekt:
Serial.print(".");
Serial.println("");
Serial.println("WiFi connected");
Omdat ik die meldingen niet krijg is er dus weer iets anders aan de hand. Ook daar is een oplossing (3) voor:
Niet genoeg spanning bij het programeren. De USB kabel kan te lang zijn(zal vermoedelijk wel kloppen), usb voeding te laag etc.
Kabel aangesloten aan de laptop en nu krijg ik tijdens het uploaden een foutmelding. Eerst maar eens een korte kabel kopen. Daarna kan ik proberen met 5V te flashen. Wordt blijkbaar vaker gedaan maar ik ben er huiverig voor.

Writing at 0x001a4000... (100 %)
Wrote 2100768 bytes (1661726 compressed) at 0x00010000 in 22.0 seconds (effective 764.2 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 119...

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.0 seconds (effective 1638.4 kbit/s)...
Hash of data verified.

Ziet er naar uit dat alles goed ging maar toch krijg ik weer -> Brownout detector was triggered <-.
Op aanraden van randomnerdtutorials i.p.v. 3.3V de 5 Volt aansluiting op de FTDI proberen. Maar die wil helemaal geen verbinding maken. Ik krijg alleen maar .....---..... te zien. Later las ik dat je op dat moment de reset op de ESP32 moet indrukken. Dat helpt.
Met paar dagen later met verse zin een andere FTDI aangesloten en nu lijkt alles goed te gaan. Serial monitor geeft aan wat het IP adres is geworden en ik krijg op dat IP adres wat in beeld en een (1) foto maken lukt ook. Het SD kaartje even geformateerd op fat 32 Plotseling kreeg ik via serial monitor:
[E][sccb.c:154] SCCB_Write(): SCCB_Write Failed addr:0x30, reg:0x12, data:0x80, ret:-1
[E][camera.c:1049] camera_probe(): Detected camera not supported.
[E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004
Dus alle cameras uit proberen.
CAMERA_MODEL_WROVER_KIT geprobeerd, geeft ook foutmelding.
CAMERA_MODEL_ESP_EYE geprobeerd, geeft ook foutmelding.
CAMERA_MODEL_M5STACK_PSRAM, geeft ook foutmelding.
CAMERA_MODEL_M5STACK_WIDE, geeft ook foutmelding.
CAMERA_MODEL_AI_THINKER, geeft ook foutmelding.
Niet vergeten serial monitor af te sluiten en een een verbinding te maken tussen GPIO en GND om te booten. OOK NIET vergeten de SD kaart terug te zetten.
Elke camera die ik probeer te instaleren, geeft een fout melding maar als ik # randomnerdtutorials pir-motion-detector instaleer en GPIO13 aan GND verbind, wordt er een foto gemaakt en op SD kaart opgeslagen.Hier maak ik uit op dat de camera goed is en het dataoverzetten ook.
Een dump van de serial monitor eens in Google gegooid

Guru Meditation Error: Core 0 panic'ed (IllegalInstruction). Exception was unhandled.
Memory dump at 0x400e44fc: f01d020c a6971c0d 00a0c202
Core 0 register dump:
PC : 0x400e4500 PS : 0x00060e30 A0 : 0x800e4705 A1 : 0x3ffcde00
A2 : 0x0000002c A3 : 0x00000000 A4 : 0x00000001 A5 : 0x00000000
A6 : 0x0000002b A7 : 0x00000001 A8 : 0x0000001e A9 : 0x0000002a
A10 : 0x00000055 A11 : 0x0000007f A12 : 0x3ffc7ac0 A13 : 0x0000001e
A14 : 0x00000000 A15 : 0x0000002b SAR : 0x00000007 EXCCAUSE: 0x00000000
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0x00000000

Backtrace: 0x400e4500:0x3ffcde00 0x400e4702:0x3ffcde60 0x400e482f:0x3ffcdeb0 0x400e2716:0x3ffcded0 0x400e2b2c:0x3ffcdef0 0x400d9d0f:0x3ffcdfb0 0x400d9fa2:0x3ffcdfe0 0x4011242c:0x3ffce010 0x4011251c:0x3ffce040 0x4011281a:0x3ffce070 0x4010ebe6:0x3ffce0a0 0x4009454b:0x3ffce0c0 0x4008db4d:0x3ffce100
Het antwoord vond ik op https://github.com/espressif/arduino-esp32/issues/2547.

This is saying that a program instruction was not valid. Usually that is a hardware issue, makes sure you don't have anything connected to to FLASH buss pins 6..11.
It could be your FLASH has a bad byte that is not correctly storing the program.
Did a decoding on the backtrace to find out it's phy related. You helped me to realize that my ESP connected to a USB hub(into a 2.1A socket thou) is struggling to turn on when my phone is charging from the same hub.

Hier steek ik weer wat van op. Blijkbaar gaat er met het data opslaan iets fout of een deel van het geheugen is defect (kan niet opgeslagen worden). Vermoedelijk bij mij het laatste. Als ik meer geugen nodig heb krijg ik de brounout melding. Dus een nieuwe ESP32 besteld.
De nieuwe ESP32 (na een paar maander wachten) aangesloten en het voorbeeld sketch doet meteen wat het belooft. Uiteraard had ik alle foutmeldingen van verkeerde instellingen al voorkomen door dat ik de instellingen nog wist. CAMERA_MODEL_AI_THINKER kiezen en beeld.
.De gezichts herkenning en gezichts detectie kan alleen in lage resolutie en werkt traag. Verder vind ik het er goed uitzien.
Heel veel steun gehad van Randomnerdtutorials.
OP https://randomnerdtutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/ een sketch waarmee de ESP32 cam verbonden kan worden met Home Assistant. Uiteindelijk is alles gelukt. Zie 3DprinterCam.


https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/
Settings:

Changing ESP32-CAM Camera Settings Arduino Sketch
To change the image settings, after initializing the camera, use the following lines:
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

The following table shows each function and the values accepted:

Function Meaning Values
set_brightness() Set brightness -2 to 2
set_contrast() Set contrast -2 to 2
set_saturation() Set saturation -2 to 2
set_special_effect() Set a special effect 0 – No Effect
1 – Negative
2 – Grayscale
3 – Red Tint
4 – Green Tint
5 – Blue Tint
6 – Sepia
set_whitebal() Set white balance 0 – disable 1 – enable
set_awb_gain() Set white balance gain 0 – disable 1 – enable
set_wb_mode() Set white balance mode 0 – Auto
1 – Sunny
2 – Cloudy
3 – Office
4 – Home
set_exposure_ctrl() Set exposure control 0 – disable – enable
set_aec2() 0 – disable 1 – enable
set_ae_level() -2 to 2
set_aec_value() 0 to 1200
set_gain_ctrl() 0 – disable 1 – enable
set_agc_gain() 0 to 30
set_gainceiling() 0 to 6
set_bpc() 0 – disable 1 – enable
set_wpc() 0 – disable 1 – enable
set_raw_gma() 0 – disable 1 – enable
set_lenc() Set lens correction 0 – disable 1 – enable
set_hmirror() Horizontal mirror 0 – disable 1 – enable
set_vflip() Vertical flip 0 – disable 1 – enable
set_dcw() 0 – disable 1 – enable
set_colorbar() Set a colorbar 0 – disable 1 – enable


Voorbeeld van https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/:
// 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
}

bronnen:
randomnerdtutorials.com/esp32-cam-ov2640-camera-settings
Camera instellingen