ESPion : une caméra autonome pour nichoir
L'intégration d'une caméra dans un nichoir pour petits passereaux, qui est le projet à l'origine de l'ESPion, impose plusieurs contraintes importantes. Contrainte d'espace d'abord : le circuit électronique et la caméra doivent tenir dans un nichoir d'environ 14x14x25cm, sans gêner l'entrée des oiseaux. En outre, la caméra doit être fixée à une distance suffisante du fond du nichoir pour avoir un cadre d'image assez large et pouvoir faire le point. La deuxième contrainte concerne l'alimentation électrique : le nichoir étant fixé à l'extérieur, dans un arbre et à bonne hauteur (2 à 2,5 mètres), le circuit ne doit pas dépendre d'une prise secteur et doit pouvoir fonctionner sur accumulateur. Le circuit électronique doit également être protégé des contraintes environnementales liées à son utilisation extérieure : la conception doit garantir l'étanchéité à l'eau et à la poussière et le maintien d'une température de fonctionnement acceptable. Autre conséquence de ce contexte d'utilisation, un raccordement au réseau internet pour récupérer le flux vidéo de la caméra n'est pas possible sans le déploiement d'une infrastructure importante ; la caméra doit dans ce cas disposer d'un stockage de données local et/ou d'une connectivité sans fil. Enfin, la caméra fonctionnant dans la quasi-obscurité du nichoir, elle doit pouvoir capter suffisamment d'informations pour que le projet présente un intérêt, ce qui implique qu'elle puisse capturer des images infrarouges et disposer d'un éclairage du même type (un éclairage en lumière visible étant exclu pour ne pas déranger les oiseaux). Si plusieurs solutions commerciales clé-en-main existent (à des prix prohibitifs), aucune d'entre elles ne répond à toutes les contraintes énumérées plus haut. L'objectif est donc de proposer une solution dans un budget contenu, moyennant quelques concessions.
La fonction de calcul a été confiée à un microcontrôleur ESP32-CAM. D'un point de vue technique, « (l)es microcontrôleurs se caractérisent par un plus haut degré d'intégration, une plus faible consommation électrique, une vitesse de fonctionnement plus faible (de quelques mégahertz jusqu'à plus d'un gigahertz) et un coût réduit par rapport aux microprocesseurs polyvalents utilisés dans les ordinateurs personnels. » Les microcontrôleurs sont en général spécialisés dans la réalisation d'une tâche spécifique, comme l'ESP32, qui intègre un processeur de signal numérique « optimisé pour exécuter des applications de traitement numérique du signal » (1). Il est en outre capable de gérer de nombreuses entrées et sorties, ce qui lui permet d'intégrer dans sa configuration ESP32-CAM un module de caméra OV2640 2 mégapixels à courte focale et un lecteur de carte µSD. Ce microcontrôleur permet ainsi de capturer un flux d'images, de l'enregistrer localement ou de le diffuser en direct en Wifi. Ces caractéristiques en font le meilleur candidat pour le projet.
L'ESP32-CAM possède néanmoins plusieurs inconvénients. Ses capacités de calcul limitées nécessitent d'abord d'optimiser le programme de streaming fourni en exemple. Celui-ci gère l'encodage du flux vidéo, génère le serveur web qui permet d'accéder au flux depuis un navigateur et propose plusieurs autres fonctionnalités, comme la reconnaissance faciale et diverses options de compatibilité. Yves Pelletier a ainsi réalisé une version minimaliste de ce programme (simplification de l'interface web, retrait de la fonction de reconnaissance faciale, retrait des options de compatibilité) qui permet de passer de « 1400 lignes de code réparties en 4 fichiers » à un seul fichier de 225 lignes. L'interface de paramétrage de la caméra (exposition, luminosité, contraste...) disparaissant dans l'opération, ces options sont rendues accessible via quelques lignes de code rajoutées au programme simplifié. Ensuite, l'ESP32-CAM possède une antenne Wifi intégrée d'une portée insuffisante, qui dans le cadre de ce projet doit être remplacée par une antenne externe, au prix d'un peu de travail de soudure (2). La résolution du signal vidéo peut également être limitée dans le programme du microcontrôleur en fonction de la qualité de la réception du Wifi. Enfin, l'opération la plus délicate consiste à retirer la colle qui immobilise la bague de mise au point du module de caméra OV2640, puis à retirer le filtre infrarouge logé derrière (3). Ces interventions au scalpel peuvent s'avérer destructives si elles sont mal réalisées, mais elles permettent d'une part de gagner en netteté (mise au point), et d'autre part de parer à l'absence de lumière visible dans le nichoir. Sans son filtre infrarouge, et grâce à l'ajout d'une LED infrarouge au circuit (voir le schéma ci-dessous), la caméra peut dès lors capturer des images dans le spectre invisible, en « fausses couleurs », sans déranger les occupants (4).
Une fois résolues les contraintes de taille, de coût, de capture et de récupération du flux vidéo, reste à dimensionner l'alimentation électrique. L'ESP32-CAM fonctionnant ici de manière autonome, le choix s'est porté sur un accumulateur de secours 5V USB (autrement appelé powerbank). Ce type de produits possède en général un bon rapport encombrement/capacité/prix, et son interface USB permet de l'employer à d'autres fins en dehors de la période d'utilisation du nichoir. La capacité de l'accumulateur a été déterminée par l'autonomie souhaitée de la caméra, qui devait correspondre à peu près à la période allant de la nidification d'un couple à l'envol des jeunes. Pour les mésanges et les moineaux, on peut ainsi compter 2 semaines d'incubation, 3 semaines de présence au nid avant l'envol, auxquelles on peut ajouter 2 semaines de nidification en amont, soit un total de 7 semaines. Afin de disposer d'une telle autonomie, l'ESP32-CAM a été pourvu d'un dispositif d'allumage/extinction via un relais radiocommandé (acheté sous forme de module prêt à l'emploi). Ainsi, seul le relais est alimenté en permanence (5mA en veille) et la caméra n'est allumée que lorsqu'on la regarde, c'est-à-dire lorsque le nichoir est manifestement occupé. Grâce à ce système et un accumulateur de 10000mAh, le circuit a pu effectivement fonctionner pendant 7 semaines.
L'accumulateur, le relais radiocommandé et l'antenne Wifi externe ont été placés dans un boîtier IP65 accolé au nichoir afin de ne pas l'encombrer, de protéger ces éléments contre les intempéries et de récupérer l'accumulateur sans déranger le nid si nécessaire. Seuls le module de caméra et la LED infrarouge ont été fixés sous le toit du nichoir, dans un boîtier de récupération en plastique transparent, à l'abri de l'humidité. L'accumulateur a été installé mi-mars afin de lui épargner les températures trop froides qui auraient entamé son autonomie.
A l'arrivée, on obtient un dispositif dont l'efficacité est certes modeste (fonctionnement intermittent, résolution faible, latence possible, qualité visuelle), mais qui est très peu intrusif, peu coûteux par rapport aux solutions existantes, plutôt robuste, économe en énergie et très autonome. Sa réalisation, qui peut s'avérer délicate, présente plusieurs intérêts :
- Il permet d'approfondir l'exploration des microcontrôleurs et d'un langage de programmation compilé (le C), déjà abordés dans la réalisation du Megafon Lenina ;
- Il nécessite d'aborder quelques notions d'optique importantes (nature de la lumière, vision humaine et couleurs, longueurs d'onde, distance focale, exposition...) ;
- Il constitue une première approche des principes de l'image numérique ;
- Il permet de se questionner sur les contraintes fortes liées au déploiement de systèmes embarqués ;
- Il oblige à replacer la pratique de l'électronique de loisirs dans une hiérarchie où le respect de l'écologie des passereaux prime sur l'enjeu technique ou pédagogique.
Parmi les améliorations possibles, l'ajout d'un port USB externe pour la recharge de l'accumulateur pourrait se révéler très utile pour ne pas avoir à ouvrir le boîtier. Les réglages de l'image et le calibrage de la puissance de la LED infrarouge pourraient en outre être optimisés.
Fichiers
Notes
1. Il s'agit du Tensilica Xtensa LX6, prédécesseur du LX7 décrit sur la page dédiée du constructeur.
2. Cette opération est décrite ci-dessous. À noter que certains modules sont livrés déjà prêts pour l'utilisation d'une antenne externe.
3. Idem. L'opération est entièrement décrite (en anglais) et illustrée sur le blog Mark's Bench.
4. Attention, à haute intensité ou sur une longue durée, la lumière infrarouge peut provoquer des dommages à l’œil, tout comme la lumière visible. Bien qu'elle soit de faible puissance, il convient donc de limiter autant que possible la quantité de lumière émise par la LED en ajustant la valeur de la résistance placée en série. Par ailleurs, l'ESP32-CAM et équipé d'une LED blanche intégrée qui a été désactivée dans le programme (cf. le code source).
Instructions
Toutes les commandes doivent être exécutées en tant que superutilisateur. Le code indiqué entre chevrons < > est à remplacer par la valeur correspondante. Le code suivant un double slash / / est un commentaire.
N.B. : la plupart des informations proviennent du blog Electronique en amateur.
Matériel
- ESP32-CAM avec module de caméra OV2640 x1 > 14,30€ (/pièce) ;
- antenne wifi 2,4Ghz avec connecteur RP-SMA mâle x1 > 6,80€ (/pièce) ;
- adaptateur µFL vers RP-SMA femelle 10cm x1 > 3,60€ (/pièce) ;
- convertisseur USB-série TTL 3,3/5V x1 > 4,90€ (/pièce) ;
- relais 5V-12V radiocommandé 433MHz x1 > 8,86€ (/pièce) ;
- boîtier ABS 158x82x54mm IP65 x1 > 6,59€ (/pièce) ;
- passes-fils polypropylène IP66 x3 > 0,39€ (/pièce, lot de 10) ;
- nichoir en mélèze avec trou d'envol 32mm x1 > 29,90€ (/pièce) ;
- batterie externe USB 5V/10000mAh x1 > 17,99€ (/pièce) ;
- résistance 220Ω x1 > 0,169€ (/pièce, lot de 10) ;
- LED infrarouge (890nm) x1 > 0,511€ (/pièce, lot de 10) ;
- carte de circuit imprimé pour prototypage > 2,06€ (/pièce) ;
- fil de câblage multibrins (souple) 24AWG > 0,15€ (15,00€/30m) ;
- étain à souder > 0,10€ (9,50€/100g).
Coût de revient estimé : 96,32€. Le coût est calculé à partir des catalogues RS Components (composants), Gotronic (modules), Aliexpress (modules), Boulanger (batterie) et LPO (nichoir). Les prix relevés sont ceux des composants à l'unité ou vendus en petites quantités.
Ressources
- https://electroniqueamateur.blogspot.com/2020/01/esp32-cam-premiere-utilisation-avec.html
- https://electroniqueamateur.blogspot.com/2020/01/esp32-cam-un-web-server-minimaliste.html
- https://marksbench.com/electronics/removing-ir-filter-from-esp32-cam
- https://framboiseaupotager.blogspot.com/2017/09/controler-distance-tout-appareils.html
- https://marksbench.com/electronics/esp32-cam-antenna-workaround/
- https://projetsdiy.fr/esp32-cam-aithinker-flash-firmware-test
Principe de fonctionnement
A la mise sous tension de l'ESP32-CAM, le programme compilé espion.ino s'exécute. Ce programme permet à l'ESP32-CAM de fonctionner comme un serveur de streaming : il génère un flux vidéo (capture et encodage des images) sur le port 81, ainsi qu'un serveur web, accessible sur le port 80, et une page web qui sert d'interface (minimaliste) pour afficher le flux vidéo. Il gère en outre la connexion au réseau wifi spécifié. Il est alors possible d'accéder au flux vidéo de l'ESP32-CAM depuis un navigateur (client) connecté au même réseau en tapant son adresse IP.
Préparation matérielle
Utilisation de l'antenne externe
Instructions tirées du blog Mark's bench
Afin d'utiliser l'antenne wifi externe, il convient de vérifier que la résistance située à proximité du connecteur de l'antenne est soudée dans la bonne position (voir schéma ci-dessous). Si ce n'est pas le cas, il faut utiliser l'antenne interne ou dessouder puis ressouder la résistance dans la position souhaitée. L'opération est très délicate, aussi il est préférable de tester la qualité de la transmission wifi avec l'antenne intégrée avant de se lancer dans le dessoudage. En cas de problème, Mark propose un plan de secours sur son blog.
Suppression du filtre infrarouge de la caméra
Instructions tirées du blog Mark's bench
- Déconnecter le module de caméra de l'ESP32-CAM.
- A l'aide d'un cutter ou d'un scalpel, gratter doucement la colle entre le barillet de l'objectif (disque cranté central) et le boîtier de la caméra (cerclage). Une fois la colle retirée, le barillet doit être mobile.
- Dévisser délicatement le barillet de l'objectif (sens inverse des aiguilles d'une montre) avec deux doigts. L'objectif est entièrement dévissé, il se désolidarise du boîtier. Le filtre infrarouge est fixée à l'arrière du barillet (surface rosée et brillante) par un petit anneau en plastique et collé à la lentille de l'objectif. N.B. : la surface irisée au fond du boîtier est le capteur de la caméra et doit être protégé de la poussière et des projections le temps de l'opération.
- Toujours à l'aide d'une lame fine, couper délicatement l'anneau en plastique qui maintien le filtre IR, puis décoller délicatement le filtre IR de la lentille, en prenant soin de ne pas abîmer la lentille.
- Une fois le filtre retiré, s'assurer qu'il n'y a pas de poussière ni sur le capteur ni sur la lentille, puis revisser soigneusement le barillet dans le boîtier. N.B. : le barillet peut facilement se visser de travers, il faut faire particulièrement attention à cette étape.
- Il est désormais possible de régler la netteté en vissant ou dévissant le barillet (attention, le barillet se sépare du boîtier s'il est trop dévissé).
Connexion en mode programmation
L'ESP32-CAM est d'abord connecté en mode programmation avant d'être connecté en mode autonome dans le montage final. Connecter l'ESP32-CAM et le convertisseur USB-série comme sur le schéma ci-contre. Le port I/O 0 est relié à la masse pendant la phase de programmation du module (mode flash de la mémoire du microcontrôleur). Cette liaison est retirée ensuite. Connecter le convertisseur à l'ordinateur via le port USB puis appuyer sur le bouton Reset de l'ESP32-CAM. Après chaque téléversement d'un programme sur le module, appuyer sur le bouton Reset pour prendre en compte les changements. Le convertisseur USB-TTL n'est utilisé que pour la programmation, il est retiré dans le montage final.
Préparation logicielle
Installer l'environnement de programmation Arduino IDE.
Solution 1 : utiliser le programme d'exemple
Le programme d'exemple CameraWebServer est particulièrement volumineux et complexe dans sa construction. Il est conseillé d'adopter la solution 2 (voir plus bas).
Pour fonctionner, le script CameraWebServer fait appel au langage Python et à certaines de ses bibliothèques, notamment pyserial. Au cas où ils ne seraient pas installés sur l'ordinateur, ouvrir un terminal et taper :
// Solution 1 :
apt update
apt install python3
apt install python-pip
pip install pyserial
// Solution 2 (non testée) :
apt update
apt install python3
apt install python-serial
- Lancer l'environnement de programmation Arduino IDE. Dans Fichier > Préférences > URL de gestionnaire de cartes supplémentaires, ajouter l'adresse https://dl.espressif.com/dl/package_esp32_index.json puis confirmer avec OK.
- Dans Outils > Type de carte > Gestionnaire de cartes, chercher "esp32 by Espressif Systems" dans la liste et cliquer sur Installer.
- Sélectionner la carte : Outils > Type de carte > AI Thinker ESP32-CAM.
- Ouvrir le menu Fichier > Exemples > ESP32 > Camera > CameraWebServer.
- Ouvrir la console série : Outils > Moniteur série et sélectionner la vitesse 115200 bauds.
- Brancher la carte (c'est-à-dire l'adaptateur USB/TTL) à l'ordinateur et appuyer sur le bouton Reset de la carte. Cliquer sur Téléverser. Si tout se passe bien, aucune erreur ne devrait apparaître.
- L'adresse IP de la carte devrait apparaître dans la console série. Dans un navigateur, taper : http://adresse_ip_esp32 . Le flux vidéo de l'ESP32-Cam devrait apparaître.
Solution 2 : utiliser le programme simplifié
Afin de clarifier le code, simplifier l'interface web et éliminer les fonctions inutiles pour le projet (reconnaissance faciale, ajustement des paramètres d'image, paramètres pour d'autres cartes), le programme de l'ESPion ne se base pas sur le programme d'exemple mais sur le code proposé par Yves Pelletier. Grâce à ses modifications, on passe de "1400 lignes de code réparties en 4 fichiers" à un seul fichier de 225 lignes.
- Télécharger le script espion.ino et l'ouvrir dans Arduino IDE.
- Modifier les lignes 15 et 16 en remplaçant les étoiles par les identifiants du réseau Wifi :
const char* ssid = "nom_reseau_wifi" // ligne 15
const char* password = "mot_de_passe_wifi" // ligne 16
- Enregistrer le script dans le répertoire voulu. Ouvrir la console série : Outils > Moniteur série et sélectionner la vitesse 115200 bauds.
- Brancher la carte (c'est-à-dire l'adaptateur USB/TTL) à l'ordinateur et appuyer sur le bouton Reset de la carte. Cliquer sur Téléverser. Si tout se passe bien, aucune erreur ne devrait apparaître.
- L'adresse IP de la carte devrait apparaître dans la console série. Dans un navigateur, taper : http://adresse_ip_esp32 . Le flux vidéo de l'ESP32-Cam devrait apparaître.
N.B. : la plupart des navigateurs se connectent automatiquement via https. Si c'est le cas, il faut retirer le "s" pour forcer la connexion non sécurisée à un appareil du réseau local, ou paramétrer une exception de sécurité (selon le navigateur).
Paramètres de la caméra
Suite à la simplification du programme, l'interface graphique qui permettait l'ajustement des paramètres d'image (contraste, luminosité, exposition…) a été supprimée. Sans son filtre infrarouge, le rendu visuel de la caméra n'est pas satisfaisant en l'état. Les lignes suivantes, tirées du programme d'exemple, ont été ajoutées (ligne 193) pour permettre de corriger l'image si nécessaire :
// Paramètres de correction de l'image
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, -2); // -2 > x < 2
s->set_contrast(s, 2); // -2 > x < 2
s->set_saturation(s, -2); // -2 > x < 2
s->set_denoise(s, 0); // // Débruitage. Valeur : 0 ou 1
s->set_special_effect(s, 2); // Effet "Greyscale"
s->set_ae_level(s, 0); // Correction de l'exposition. Valeur : -2 > x < 2
s->set_bpc(s, 0); // ? Valeur : 0 ou 1
s->set_wpc(s, 1); // Correction des tâches ? Valeur : 0 ou 1
s->set_raw_gma(s, 1); // Correction gamma. Valeur : 0 ou 1
s->set_lenc(s, 1); // Correction optique. Valeur : 0 ou 1
s->set_hmirror(s, 0); // Miroir horizontal. Valeur : 0 ou 1
s->set_vflip(s, 0); /// Miroir horizontal. Valeur : 0 ou 1
D'autre part, l'allumage de la LED infrarouge (port GPIO 16) est contrôlé par le programme espion.ino (ligne 229). La LED blanche intégrée au microcontrôleur est également désactivée dans le code (ligne 234).
Paramétrage du Récepteur RF
N.B. : la procédure d'appairage des émetteur/récepteur fonctionne pour le module référencé sur la page du projet sur le blog. Il devrait fonctionner pour tous les modules de même conception, mais ce n'est pas garanti. Dans le doute, il est préférable de suivre la procédure du constructeur ou du revendeur.
L'émetteur et le récepteur radio qui commandent le relais doivent être appairés selon la procédure suivante (seul le mode verrouillage a été testé) :
- Mode momentané (le même bouton commute le relais lorsqu'il est appuyé et dé-commuter le relais lorsqu'il est relâché) : appuyer une fois sur le bouton d'apprentissage du module (la LED du module s'allume), puis une fois sur le bouton ON ou OFF de l'émetteur (la LED du module s'allume trois fois).
- Mode bascule (le même bouton commute le relais à la première pression et dé-commute le relais à la deuxième pression) : appuyer deux fois sur le bouton d'apprentissage du module (la LED du module s'allume), puis une fois sur le bouton ON ou OFF de l'émetteur (la LED du module s'allume trois fois).
- Mode verrouillage (un bouton pour commuter le relais, un bouton pour dé-commuter) : appuyer trois fois sur le bouton d'apprentissage du module (la LED du module s'allume), puis une fois sur le bouton ON de l'émetteur (la LED du module s'allume trois fois), puis une fois sur le bouton OFF de l'émetteur (la LED du module s'allume trois fois).
Montage final et intégration
Cf. schéma final. Une LED infrarouge et sa résistance sont branchés sur le port GPIO 16 de l'ESP32-CAM. Le relais est placé entre l'ESP32-CAM et l'alimentation (bien étudier le schéma). Le reste du montage ne présente pas de problème particulier.