[TUTO] Caméra à focale fixe basée sur ESP32

Tags: #<Tag:0x00007f282df237b0>

Bonjour à tous,

Voici un tutoriel qui vous permettra de réaliser à faible coût des petites caméras à focale fixe. Elles sont intégrables dans Jeedom soit par flux RSTP, soit par snapshot, et disposent d’un mini serveur web qui permet aussi de lancer un flux jpeg sur un navigateur.

Une fois terminé, cela va ressembler à ça :

Boitier%20Camera%20vue%20Globale
(Crédits à Yaabaa pour le design)

En vrai (et en blanc…) :
Vue%20g%C3%A9n%C3%A9rale%202%20b

3 J'aimes

Liste de courses :

  • Un ESP32 CAM. C’est la version plus puissante de l’ESP8266… une version a été intégrée sur un chipset spécifiquement prévu pour accueillir une mini caméra à focale fixe (mais néanmoins étonnante de qualité – pour le prix), et une carte SD.
    On en trouve partout à vendre. En particulier chez AliExpress : https://fr.aliexpress.com/item/33031193519.html
    La version avec l’antenne externe a une meilleure portée Wifi, mais il y a une petite manip de soudure à faire qui nécessite une petite panne et une bonne loupe !
    Bon, ceci dit, on ne va pas se mentir : pour le prix, la caméra OV2640 n’est pas d’une qualité monstrueuse… elle fait 2Mpx et est capable de prendre un flux de 1600x1200 mais les résultat restent moyens à longue distance.

  • Un convertisseur USB / série ; de préférence non FTDI, car il semble que certaines versions de l’ESP32 CAM soient allergiques au FTDI… la version qui m’a servi à faire ce tutoriel a néanmoins accepté un FTDI. Bref, avec cette version, en ce qui me concerne ça a fonctionné : https://www.amazon.fr/dp/B01C2P9GD2
    Sinon, prenez un convertisseur basé sur CP2102. Il y en a sur Amazon, comme celui-ci : https://www.amazon.fr/DSD-TECH-Convertisseur-broches-Compatible/dp/B072K3Z3TL

  • Si les câbles ne sont pas fournis : https://fr.aliexpress.com/item/32891879068.html

  • Et pour finir, il vous faudra une alim USB type chargeur de téléphone / tablette (https://fr.aliexpress.com/item/4000288345109.htm par exemple) et du câble USB avec les fils +5V / Gnd dénudés. On en trouve plein sur AliExpress : https://fr.aliexpress.com/item/4000143731716.html

C’est tout… ah, non, il faut aussi une imprimante 3D si vous voulez un boîtier sympa… mais on peut faire sans. Je reviendrai sur le boîtier en fin de tutoriel.

Du coup, la caméra coûte environ 5~7€, le convertisseur 7€, le câble USB 2.5€, l’alim 5€ et les fils Dupont 2€. Soit environ 23€ ! Sachant que le convertisseur et les fils, vous ne les achèterez qu’une seule fois, les caméras suivantes reviennent à une dizaine d’euros si vous utilisez la même alim pour jusqu’à 3 caméras…

Au passage, si vous êtes pressé, il y a un kit tout prêt sur Amazon : https://www.amazon.fr/KeeYees-ESP32-CAM-Bluetooth-Convertisseur-FT232RL/dp/B07S83X9NM

Installer l’environnement (IDE) Arduino

Pour pouvoir flasher l’ESP32 avec le code permettant d’utiliser la caméra, il faut installer l’IDE Arduino et y inclure les bibliothèques de l’ESP32.

Commencez par télécharger et installer l’IDE Arduino, à récupérer ici : https://www.arduino.cc/en/main/software

Après l’installation, il faut charger les librairies pour l’ESP32 ; pour cela il faut configurer l’application pour les télécharger chez le fabricant :

  • Allez dans Fichier / Préférences et dans le champ « URL de gestionnaire de cartes supplémentaires » entrez :
    https://dl.espressif.com/dl/package_esp32_index.json
    Arduino-Preferences

  • Puis allez dans le gestionnaire de cartes : Outils / Type de carte / Gestionnaire de cartes et installez le module ‘ESP32’ en le tapant dans le champ de recherche.
    Arduino-Gestionnaire1
    Arduino-Gestionnaire2

  • Configurez les paramètres de téléchargement vers un ESP32 : allez dans Outils et paramétrez les valeurs suivantes :
    Arduino-Config%20flash

Votre interface Arduino est prête pour utiliser un ESP32…

Gestion du convertisseur USB / Série sous Windows :

Branchez votre convertisseur en USB sur votre ordinateur et acceptez le téléchargement des drivers via internet si Windows vous le propose. En principe, si votre Windows n’est pas trop vieux, il ne devrait même pas y avoir besoin de drivers…

Pour vérifier que votre appareil est reconnu, il faut aller dans le gestionnaire de périphériques (click droit sur le menu démarrer / rechercher / tapez ‘gestionnaire de périphériques ‘ et lancez le résultat de la recherche – ou alors faites Windows + R et tapez ‘devmgmt.msc’).

Ensuite, allez dans la section « Ports Comm et LPT » et vérifiez que vous avez bien un appareil ayant généré un port COM. Vous pouvez tester que c’est le bon en le débranchant / rebranchant.
Port%20COM

Il vaut mieux qu’il n’y ait pas deux ports COM avec le même numéro dans la liste. Si c’est le cas, double cliquez sur votre appareil, allez dans «Paramètres du port / avancé » et changez le numéro du port pour un non utilisé.
Port%20COM%20reconfig

De même vous pouvez mettre à jour les drivers en en allant sur l’onglet « Pilote ».
Port%20COM%20M%C3%A0J%20driver

Lorsqu’il est correctement reconnu, votre convertisseur est prêt à servir.

Connexions physiques convertisseur / ESP32

Il faut 5 câbles Dupont femelle / femelle :

  • Du +5V du convertisseur vers le 5V de l’ESP
  • Du GND du convertisseur vers le GND de l’ESP
  • Du TX du convertisseur vers le RX de l’ESP
  • Du RX du convertisseur vers le TX de l’ESP
  • Un pour mettre à la masse le GPIO0 lors du flash

PNG
Photo%20connexions%20flash%20b

Les jumpers ou interrupteurs, lorsqu’ils sont présents sur les convertisseurs, peuvent avoir plusieurs usages : envoyer des signaux E/S de 3.3V ou de 5V ou bien commuter l’alim Vcc sur 3.3V ou 5V.

Dans mon cas, je l’ai laissé sur 5V et le flash se passe bien… sur 3.3V ça ne marche pas ; y compris en alimentant l’ESP en 3.3V…

Flasher l’ESP32

Maintenant il faut envoyer du programme dans l’ESP. Pour cela il y a deux notions :

  • Le sketch contenant le programme principal ‘.ino’
  • Les bibliothèques nécessaires ‘lib’

Il faut commencer par récupérer le .zip contenant sketch et bibliothèques ici (c’est un fichier zippé ; enlevez l’extension .pdf pour le remettre en .zip) :
ESP32_RTSP_Cam_v1.8.7z.pdf (237,3 Ko)
(mis à jour v1.8 avec les bonnes bibliothèques)

Dedans vous trouverez le sketch nommé « ESP32_RTSP_Cam.ino » et dans le dossier « lib », six dossiers (ArduinoJson, Auto-connect, Micro-RTSP, PageBuilder, AsyncTCP et ESPAsyncWebServer) à transférer dans votre environnement Arduino. Les bibliothèques de l’IDE Arduino sont normalement dans « C:\Users<votre utilisateur>\Documents\Arduino\libraries ». Si ce n’est pas le cas, réouvrez les préférences d’Arduino (Fichier / Préférences) et vous trouverez l’emplacement adéquat.

Le sketch peut être ouvert de n’importe quel emplacement mais il est mieux de le ranger dans le dossier Arduino dans Documents.

Une fois le sketch ouvert, vous pouvez vérifier que toutes les bibliothèques nécessaires sont présentes en cliquant sur le bouton de vérification…
V%C3%A9rifier

Il est possible que vous ayez des « Attention :… » mais normalement la vérification doit se terminer par un message du style :

Le croquis utilise 1010698 octets (32%) de l’espace de stockage de programmes. Le maximum est de 3145728 octets.
Les variables globales utilisent 73152 octets (22%) de mémoire dynamique, ce qui laisse 254528 octets pour les variables locales. Le maximum est de 327680 octets.

Il n’y a plus qu’à flasher l’ESP32 avec ce code.

Néanmoins, avant de flasher, vous pouvez modifier quelques paramètres :

  • #define RESOLUTION FRAMESIZE_UXGA // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA : permet de modifier la qualité d’image.
  • #define PIN_FLASH_LED -1 : permet de faire flasher la led à chaque capture d’image fixe. Mettre 4 si vous voulez avoir le flash.

Si vos connexions sont correctes, et votre convertisseur reconnu, vous pouvez brancher le tout sur le port USB de votre PC, et récupérer le port COM dans le gestionnaire de périphériques.

Il faut ensuite définir ce port COM dans l’IDE Arduino, pour cela retournez dans ‘Outils’ et sélectionnez le port COM correct.
Arduino-PortCOM

Et pour finir, cliquer sur ‘Téléverser’…
T%C3%A9l%C3%A9verser

Après pas mal de messages, vous devriez voir apparaître des lignes représentant un progression en pourcentage (l’écran ne scrolle pas tout seul) puis un message indiquant un reset de l’ESP.

Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 24:0a:c4:a6:7a:84
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...

Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 3855.1 kbit/s)...
Hash of data verified.
Compressed 17392 bytes to 11186...

Writing at 0x00001000... (100 %)
Wrote 17392 bytes (11186 compressed) at 0x00001000 in 0.1 seconds (effective 966.2 kbit/s)...
Hash of data verified.
Compressed 1010816 bytes to 548716...

Writing at 0x00010000... (2 %)
Writing at 0x00014000... (5 %)
Writing at 0x00018000... (8 %)
Writing at 0x0001c000... (11 %)
Writing at 0x00020000... (14 %)
Writing at 0x00024000... (17 %)
Writing at 0x00028000... (20 %)
Writing at 0x0002c000... (23 %)
Writing at 0x00030000... (26 %)
Writing at 0x00034000... (29 %)
Writing at 0x00038000... (32 %)
Writing at 0x0003c000... (35 %)
Writing at 0x00040000... (38 %)
Writing at 0x00044000... (41 %)
Writing at 0x00048000... (44 %)
Writing at 0x0004c000... (47 %)
Writing at 0x00050000... (50 %)
Writing at 0x00054000... (52 %)
Writing at 0x00058000... (55 %)
Writing at 0x0005c000... (58 %)
Writing at 0x00060000... (61 %)
Writing at 0x00064000... (64 %)
Writing at 0x00068000... (67 %)
Writing at 0x0006c000... (70 %)
Writing at 0x00070000... (73 %)
Writing at 0x00074000... (76 %)
Writing at 0x00078000... (79 %)
Writing at 0x0007c000... (82 %)
Writing at 0x00080000... (85 %)
Writing at 0x00084000... (88 %)
Writing at 0x00088000... (91 %)
Writing at 0x0008c000... (94 %)
Writing at 0x00090000... (97 %)
Writing at 0x00094000... (100 %)
Wrote 1010816 bytes (548716 compressed) at 0x00010000 in 8.4 seconds (effective 957.9 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 1536.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Vous pouvez débrancher le convertisseur, enlever le shunt entre GPIO0 et GND et rebrancher le convertisseur pour réalimenter l’ESP. Dans l’IDE Arduino, cliquez sur Outils / Moniteur Série puis configurez la vitesse à 115200 baud et faites un reset de l’ESP.

Le moniteur doit indiquer (entre autres choses) « -> Created streamer width=1600, height=1200 »
Moniteur%20S%C3%A9rie

Félicitations, votre ESP CAM est programmé !

Première connexion, définition du Wifi

Initialement, l’ESP crée un point d’accès wifi (AP) car il n’a aucun paramètre de connexion en mémoire.

Il faut donc vous munir d’un smartphone ou d’un tablette et vous connecter sur le réseau Wifi nommé « ESP-xxxx » en utilisant le mot de passe ‘configesp’.

Là vous allez arriver sur un ‘Portail Captif’ directement après la connexion, où vous devez cliquer sur le menu en haut à droite :
autoconnect1

Il faut ensuite cliquer sur « Configure New AP »
autoconnect2

Puis sélectionner votre réseau Wifi, entrer le mot de passe et valider…
Nota : vous aves à ce moment la possibilité de passer en IP fixe en décochant la case ‘Enable DHCP’.
Autoconnect3

Un écran vous indiquera ensuite les caractéristiques de la connexion effectuée par l’ESP, notamment son IP.

Voilà… après un dernier reset, votre ESP peut être utilisé.

Connexion sur le navigateur

Après avoir tapé l’adresse de l’ESP CAM dans votre navigateur, vous devriez voir un menu de ce style :
Serveur%20Web

  • Snapshot URL sert à faire fonctionner la caméra en mode ‘snapshot’ (image individuelle à chaque appel de l’URL). Attention, il y a toujours une image de retard sur ce que vous voyez à l’écran à chaque appel de l’URL.
    Si vous avez activé le paramètre “#define PIN_FLASH_LED 4” la led flesh s’allumera brièvement à chaque capture d’image.
  • HTTP MJPEG URL : permet d’obtenir un flux vidéo sur le navigateur
  • RTSP MJPEG URL : permet de configurer un flux RTSP
  • WiFi settings page : permet de retourner dans les pages de configuration du Wifi.
    Vous y retrouverez les mêmes menus que ceux vu lors de la première configuration du Wifi.

Inclusion dans Jeedom

Bon, maintenant que nous avons une belle image affichable à l’écran, il n’y a plus qu’à intégrer le tout dans Jeedom… bien entendu, il faut le plugin « Camera ».

Ensuite la configuration est relativement simple :
PNG

J’ai montré les deux configs : le RTSP et le Snapshot. En principe une seule est suffisante.

Et… c’est tout !

Boitier imprimé 3D

Pour compléter, je vous propose un petit boîtier sympathique, trouvé sur www.thingiverse.com.
C’est un boitier en forme de sphère. Assez facile à imprimer et bien conçu :

Boitier%20Camera%20vue%20Globale

Eclat%C3%A9%20boitier%20cam

Comme je suis censé en créditer l’auteur (les images présentées ci-dessus sont les siennes), voici un lien vers sa page Thingiverse : https://www.thingiverse.com/Yaabaa/about . Il a fait une variante avec un boîtier carré qui est très sympa aussi.

Après impression en PETG , ça donne ça :
Photo%20pi%C3%A8ces%20boitier%20b

On y clipse l’ESP, en ayant auparavant mis un petit morceau de mousse (celle sur laquelle est fixé l’ESP à la réception) pour maintenir la caméra :
Photo%20Int%C3%A9gration%20ESP%20b

Photo%20soudure%20antenne%20b

Le boîtier est prévu pour le montage de l’antenne :
Photo%20assemblage%20termin%C3%A9%20b

Concernant l’antenne, si vous utilisez l’antenne externe, il faut casser une résistance qui relie la sortie radio à l’antenne en cuivre sur le circuit imprimé, et refaire un pont avec le contact à proximité du micro connecteur d’antenne :
Photo%20zoom%20soudure

Ce n’est pas simple… il faut une panne de fer à souder très fine, et une bonne loupe pour y voir quelque chose (en tout cas à mon âge avancé :wink:). Le circuit est blindé de vernis qui empêche le pontage de se faire facilement…on voit bien le résultat sur la photo !

Pour la finition il y a une petite bague qui va devant de boitier. Le fichier .stl de la bague fourni sur Thingiverse n’est pas à la bonne taille. Voici la pièce correcte (enlevez l’extension .pdf) :
Bague v2.STL.pdf (42,3 Ko)

Alimentation

Cette partie finale traite de l’alimentation électrique du module… j’ai choisi de ne pas chercher à garder le convertisseur série dans le boitier… tant pis si ça complique les mises à jour futures.

Du coup il faut passer un câble USB avec les fils d’alim dénudés à travers le petit trou prévu dans la partie arrière du boîtier puis souder sur les pins +5V et GND de l’ESP.

Ça donne ça (j’ai voulu y mettre de la faine thermo pour faire propre… mais ça fait sale !) :
Soudure%20b

Ensuite on clipse les deux partie du boîtier (il y a un détrompage, mais il faut s’assurer que l’image n’est pas à l’envers un fois le boîtier assemblé et posé dans le sens de fixation… sinon recommencez l’intégration de l’ESP dans le boîtier).

Il n’y a a plus qu’à brancher le câble USB dans un bloc chargeur et c’est parti !
Vue%20g%C3%A9n%C3%A9rale%202%20b

J’espère que ce tuto vous a plu et donné envie de faire le montage. N’hésitez pas à répondre / réagir, voire poster des photos de vos montages.

Bonsoir,
J’en ai fait une il y a quelques mois avec le .ino avec la reconnaissance faciale qui n’a jamais fonctionné au final. J’utilise l’url de streaming. Ca marche mais quelques fois je dois débrancher et rebrancher car plus de streaming.

As-tu ce pb ?

Du coup je vais re televerser avec ton code pour tester.
Merci pour le temps passé pour le partage.

Hello,

Pas eu ce problème, mais je n’ai pas de caméra en usage permanent pour l’instant.

Un truc qui est sûr, c’est qu’on ne peut avoir qu’un seul flux à la fois avec le code que je propose. Le dernier à se connecter sur le flux éjecte le précédent…

Il me semble avoir lu quelque part qu’avec la version 1.02 des bibliothèques ESP32, la reconnaissance faciale ne fonctionne pas.

Si tu as déjà récupéré le code, reprends-le (ou corrige en direct) car il y avait un bug : le flash était actif par défaut.

Super post ! Je cherchais justement un boîtier, pour le reste j’ai déjà fait, je n’avais pas vu ton tuto avant, dommage j’aurais moin galéré…

J’ai aussi remarqué qu’on ne pouvait pas se connecter a plusieurs sur le stream, tu as trouvé un moyen de contourner le problème ?

Non, je suis une bille en C… j’ai donc récupéré (et réussi à faire compiler) du code tout fait.

Si des developpeurs C passent par ici il y aurait matière à amélioration :

  • Sécuriser l’accès par login / MdP (et que ça reste compatible Jeedom…)
  • Multistream (quoique… je ne sais pas si l’ESP32 supportera… il chauffe déjà bien !)

Hello,

Un petit retour après plusieurs semaines d’utilisation : je n’ai eu qu’une seule déconnexion où j’ai du resetter la caméra… c’est plutôt stable.

LO,
Merci pour ton retex. Toujours ancien code et 1 french IPL depuis quelques semaines aussi.

bonjour
est il possible d’adapter une camera pour vision nocturne ?

Hello,
Je ne sais pas, je n’ai pas essayé. Tu as un modèle en tête ?
Il faudra qu’il puisse être géré par une bibliothèque ESP32 existante dans tous les cas.