vous pouvez regarder ce qu'il se fait côté Arducam
Ils proposent une gamme de lentilles M12 compatibles avec les modules ESP32-CAM, avec différentes focales pour ajuster le champ de vision selon vos besoins, du grand angle au téléobjectif.
L’ESP32 est plus rapide qu’un Arduino Uno mais ce n’est pas une plateforme très puissante comparée à un ordinateur ou un Raspberry Pi. Faire une corrélation d’images à 2 ou 3 Hz reste réaliste si vous travaillez avec une résolution réduite (peut être 320x240 pixels ou moins) mais bon ça dépend de l'approche retenue. Si au lieu de comparer pixel par pixel toute l’image, on compare bloc par bloc, ça réduit la quantité de calculs à faire.
L’usage de pow() est coûteux et on évite une passe et l’optimiseur doit conserver les données en cache et regrouper les calculs. Ça devrait aller plus vite.
J'avais déjà vu que cette fonction était une abomination, mais je n'y ai pas pris garde. Je ne sais pas à partir de quelle puissance elle est plus performante. En tous cas, le simple fait de remplacer le pow() par une multiplication fait passer de 9300 µs à 654 µS !! Un gain de 15.
Utilisant votre formulation, je passe à 364 µS et compactant les derniers calculs en deux lignes (trouvé grâce à Perplexity):
J'ai acheté deux modules ESP32 équipés de caméra ov2640.
Mes premiers essais avec le sketch ESP32/camera/cameraWebServer sont infructueux.
J'ai essayé avec différents modules Espressif :
ESP32S3 Dev Module ;
ESP32S3 Dev Module Octal(WROOM2)
ESP32-S3-Box
ESP32-S3-USB-OTG
ESP32S3 CAM LCD
AI THINKER ESP-CAM
Avec le module 1, ça reboot en permanence à l'abord de cette instruction : esp_err_t err = esp_camera_init(&config); avec un message :
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
et tout les données qui vont avec
Avec le module 6 : à la compilation, ça me dit :
A fatal error occurred: This chip is ESP32-S3, not ESP32. Wrong chip argument?
Failed uploading: uploading error: exit status 2
Avec les autres, ça reboot sans information ou ça ne fait rien.
Toutefois, j'ai vu que le PSRAM était du type OPI et non QSPI.
Pour la caméra, j'ai vu (Perplexity) que l'ov2640 correspondait au choix : CAMERA_MODEL_AI_THINKER
Là, je ne sais plus trop quoi faire. Quelle carte choisir, est-ce la caméra choisie est la bonne, la configuration camera_config_t config; est-elle la bonne ?
Trop de choix. J'aurais tendance à dire que le problème est un problème de config. Est-ce que ce sont les bons GPIO affectés à config.
Très bien. Vous utilisez donc une carte ESP32-S3 WROOM N16R8 CAM avec caméra OV2640. Ce module utilise une PSRAM en mode OPI et n’est pas compatible directement avec le sketch cameraWebServer conçu pour les ESP32 classiques.
Voici les GPIO utilisés par défaut sur cette carte :
XCLK = GPIO10
SIOD = GPIO40
SIOC = GPIO39
D7 = GPIO48
D6 = GPIO38
D5 = GPIO11
D4 = GPIO12
D3 = GPIO14
D2 = GPIO47
D1 = GPIO13
D0 = GPIO21
VSYNC = GPIO41
HREF = GPIO42
PCLK = GPIO9
PWDN = -1
RESET = -1
Dans l’IDE Arduino, vous devez choisir la carte ESP32S3 Dev Module, activer la PSRAM si l’option est proposée, et vous assurer que le support OPI est bien activé. Si ce n’est pas le cas, il faut mettre à jour les cartes Espressif dans le gestionnaire de cartes.
Le sketch cameraWebServer d’origine n’est pas prévu pour ce module. Vous devez modifier la structure camera_config_t avec les bonnes affectations GPIO, et vous assurer que les options de PSRAM sont bien compatibles avec le module.
Merci pour cette recherche et pour cette proposition. Malheureusement, ça ne fonctionne toujours pas.
J'avais dit :
J'aurais tendance à dire que le problème est un problème de config. Est-ce que ce sont les bons GPIO affectés à config.
Cela s'avère. En effet, j'ai réussi à trouver le pinout de ma carte et j'ai appliqué ces valeurs : avec l'application cameraWebServer et celle proposée par chatGpt, la caméra est reconnue.
Me connectant cette fois par WiFi, le site est fonctionnel avec l'application cameraWebServer, mais pas avec celle proposée par chatGpt.
Au cas où il y aurait de potentiels clients du module ESP32 que j'ai, voici les données à inclure :
dans board_congig.h : #define CAMERA_MODEL_OV2640_ESP32S3 // Has PSRAM en commentant toutes les autres caméras ;
Je pense que j'avais un autre problème ; ça fonctionne correctement.
Pour autant, si tout cet ensemble fonctionne correctement en mode JPG, ça ne veut rien savoir en mode RGB565 ou en GRAYSCALE.
J'ai essayé tout un tas de configurations, mais je tombe toujours sur :
Camera init OK 0x0E (731) cam_hal: DMA overflow
Je suppose que le DMA a rien à voir avec la PSRAM( 16Mo). En effet, quelle que soit la taille que je choisis : toujours inférieure à 640 x 480, ce qui fait au maxi : 640 x 480 = 307 ko, on est loin des 16 Mo de PSRAM. Que représente donc ce DMA et comment s'affranchir de ce problème.
Le capteur OV2640 encode en JPEG matériellement, ce qui réduit fortement le volume de données à transférer et évite les débordements DMA. En revanche, en mode RGB565 ou GRAYSCALE, le flux brut est bien plus volumineux, je pense que c'est ce qui provoque un dépassement de la capacité DMA ou mémoire du système
essayez une résolution basse, comme FRAMESIZE_QQVGA ou FRAMESIZE_QVGA. Vous pouvez aussi essayer de réduire la fréquence xclk_freq_hz dans camera_config_t à 10 ou 8 MHz.
Le DMA (Direct Memory Access) est un mécanisme qui permet à un périphérique (comme votre caméra) de transférer des données directement vers ou depuis la mémoire, sans passer par le CPU.
Cela évite que le CPU soit bloqué à copier des données octets par octets, ce qui améliore considérablement les performances, surtout pour les transferts volumineux ou rapides.
Le DMA fonctionne avec des canaux configurés pour écouter un périphérique (source), et lorsqu’un événement se produit (comme une fin de ligne d’image), il transfère automatiquement un bloc de données en mémoire (destination). Pendant ce temps, le CPU peut exécuter d’autres tâches.
Pour que cela fonctionne, le DMA doit être bien configuré ➜ adresse source, adresse de destination, taille, déclencheur, priorité... Un débordement (overflow comme vous avez) signifie que les données arrivent plus vite que ce que le DMA ou la mémoire peut gérer.
==> c'est donc quand même potentiellement lié à la mémoire et à la PSRAM mais pas au niveau de la taille (enfin, peut-être que les buffers sont inadaptés)
J'ai un peu essayé tout un tas de configurations avec peu de pixels et un horloge descendu jusqu'à 2 MHz. J'ai même augmenté config.fb_count /*!< Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed) */ jusqu'à 10. J'ai aussi changé la mémoire de transfert en config.fb_location = CAMERA_FB_IN_DRAM;. Rien n'y fait, toujours le même message :
Camera init OK 0x0E (829) cam_hal: DMA overflow
Guru Meditation Error: Core 0 panic'ed (Unhandled debug exception).
Debug exception reason: Stack canary watchpoint triggered (cam_task)
C'est comme si tous ces paramètres étaient ignorés dans ces modes.