Mangeoire à Oiseaux TinyML à énergie Solaire !

Pour prendre des photos de vos amis oiseaux qui visitent votre mangeoire à oiseaux solaire, vous pouvez utiliser une caméra ESP32 et un Edge Impulse pour les capturer !

IntermédiaireInstructions complètes disponibles10 heures2,242

Éléments Utilisés Dans Ce Projet

Composants Matériels

Machines Et Outils à Main Pour La Fabrication

Histoire

Caméra solaire pour mangeoire à oiseaux

Mon grand-père a offert à ma fille un cadeau « Construisez votre propre mangeoire à oiseaux » pour Noël. Ce serait un excellent projet de construire une caméra de mangeoire à oiseaux à énergie solaire pour ma fille afin qu’elle puisse voir les oiseaux dans sa nourriture pour oiseaux. Il y a eu quelques images de mangeoires d’oiseaux avec reconnaissance d’image sur ce site auparavant. Cependant, ils avaient des SBC Raspberry Pi très lourds et étaient câblés pour l’alimentation. J’ai pensé essayer avec une version à énergie solaire et un MCU moins puissant. Edge Impulse me devient plus familier alors j’ai pensé ajouter la reconnaissance d’image ! Bien qu’il y ait eu quelques problèmes, dans l’ensemble, le projet s’est bien déroulé.

Ma fille de 5 ans a commencé le projet en construisant, dessinant et décorant le nichoir. La photo ci-dessus montre son produit final. Une fois son chef-d’œuvre terminé, j’ai pris le contrôle.

J’avais un panneau 1W et le chargeur solaire Powerboost. De plus, j’avais une batterie de 2500 mAh, 3,7 V. Une caméra ESP32 était également disponible. C’est un microcontrôleur très peu cher (avec l’adaptateur USB), mais il n’a pas beaucoup de mémoire (520 ko pour les modèles à reconnaissance d’image). Cependant, il a le Wifi avec l’ESP32S !

Parce que je voulais placer la mangeoire à oiseaux loin de chez moi, j’ai décidé de me procurer une antenne WiFi externe pour augmenter la portée du MCU. Il était facile de brancher le connecteur uFL sur la caméra ESP-32. …. s’avère qu’il y a deux réglages pour l’antenne. L’antenne embarquée par défaut (avec une résistance de 0 Ohm) et l’antenne externe.

Ce sont les 2 paramètres pour ESP-32 CAM. C’est très petit.

Random Nerd Tutorials propose un excellent tutoriel pour configurer une antenne externe. Je l’ai utilisé. C’était une PAIN avec mon matos rudimentaire (fer à souder, panne standard, sans grossissement), pour retirer la résistance. Ensuite, j’ai mis le joint de soudure entre les deux pastilles d’antenne externes. Ces coussinets sont petits et agrandis dans l’image ci-dessus. C’était pourtant possible ! Pour ce faire, je vous recommande d’utiliser une loupe et une pointe fine avec votre fer à souder. Le paramètre par défaut pour la plupart des cartes est l’antenne intégrée. Si vous souhaitez utiliser une antenne externe, vous devrez la modifier.

Après avoir installé et testé mon antenne externe sur le MCU, j’ai fait un trou sur le côté de la mangeoire pour permettre au câble de l’antenne de passer dans la zone de stockage des aliments où je placerais la caméra. Le boîtier que j’ai utilisé pour monter la caméra était un boîtier imprimé en 3D que j’avais trouvé et imprimé dans ma bibliothèque locale. J’ai utilisé du ruban adhésif double face et de l’adhésif pour fixer la caméra au boîtier en plastique de la mangeoire à oiseaux. Ensuite, j’ai monté le panneau solaire sur le toit de la mangeoire à oiseaux face au sud (puisqu’il se trouve dans l’hémisphère nord).

Panneau solaire fixé au toit. L’antenne est visible à droite

J’ai trouvé un vieux récipient en plastique et j’ai mis le chargeur solaire, le Power boost et la batterie dans un seul paquet. J’ai fait des trous sur les côtés pour insérer le connecteur de mon panneau solaire et le câble USB vers l’ESP32 Cam dans la mangeoire à oiseaux. Une fois cela fait, j’ai attaché le câble au fond avec du ruban adhésif double face.

Comme boîtier, j’ai utilisé un vieux récipient en plastique que je devais contenir le Power Boost et le chargeur solaire.

Il était alors temps d’obtenir le code! J’ai commencé avec l’exemple CameraWebServer, fourni avec la bibliothèque ESP32 dans l’IDE Arduino. Après avoir passé du temps à apprendre comment cela fonctionnait, je l’ai réduit pour supprimer la plupart des fonctionnalités de mon serveur Web. J’avais besoin de la possibilité de visualiser un flux en direct, de déduire la vidéo à l’aide d’Edge Impulse, puis d’enregistrer toutes les photos d’oiseaux sur la carte SD de ma caméra ESP32.

Le codage était généralement bon. Il peut être un peu difficile de comprendre le fonctionnement de l’application. J’ai utilisé Cyber Chef pour décoder le html du serveur Web.

Une fois le serveur Web opérationnel, il était temps de créer le modèle Edge Impulse. Vous pouvez voir mon projet ici. Le modèle était très simple. J’ai téléchargé un ensemble de données sur les oiseaux sur kaggle et sélectionné des oiseaux communs dans ma région. Edge Impulse a créé un ensemble de données composé d’oiseaux et de non-oiseaux. Il y avait environ 1400 images par catégorie. En raison de la mémoire limitée sur le MCU, j’ai dû rester simple afin qu’un classificateur binaire puisse être utilisé. Pour garder le modèle petit, j’ai réduit la résolution à 48×48 mais j’ai gardé l’impulsion en couleur (RVB). Ce n’était pas idéal, mais c’était un compromis que j’ai dû faire.

Classificateur d’images d’oiseaux impulsifs

Les résultats étaient bons, je me suis entraîné pendant 50 époques.

Ensemble de données de la formation du classificateur d’oiseaux

Ce sont les résultats dont je pourrais me passer pour assembler rapidement le modèle. Notez les tailles de flash et de RAM. Il est suffisamment petit pour fonctionner sur un MCU.

Le modèle a ensuite été téléchargé dans une bibliothèque Arduino. C’est là que j’apprécie vraiment l’écosystème Arduino. Edge Impulse vous permet d’importer le modèle en tant que bibliothèque Arduino. Il est facile d’ajouter le modèle comme n’importe quelle autre bibliothèque. Ensuite, vous pouvez inclure votre fichier d’en-tête d’inférence dans l’esquisse Arduino. Louis Moreau, Edge Impulse, a un excellent tutoriel sur la façon d’intégrer les modèles Edge Impulse dans ESP32 Cam. Son code était très clair et j’ai passé beaucoup de temps à le parcourir.

Mon code est assez long donc je n’inclurai pas beaucoup d’extraits. Cependant, vous pouvez le trouver sur mon Github. Le flux général du processus est qu’une image (également connue sous le nom de tampon de trame) est reçue de l’ESP-32 CAM. Le tampon de trame est ensuite converti au format RGB888 et redimensionné à 48×48 pixels (la taille attendue par le modèle Edge Impulse). Le tampon peut ensuite être classé après avoir été redimensionné. Il est très facile d’utiliser le code Edge Impulse pour classer les tampons.

//Effectuer la classification Edge Impulsevoid classify() 

signal_t signal ;
signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_WIDTH ;
signal.get_data = &raw_feature_get_data;

// Envoie un signal au classificateur
EI_IMPULSE_ERROR res = run_classifier(&signal, &result, false /* debug */);

// Renvoie la variable d'erreur "res", alors que data object.array est dans "result".
if (res != 0) If (res!= 0),
Serial.printf("Error....returning\n");
revenir;


//oiseau trouvé !
if(result.classification .value > 0.8)

ei_printf ("**** Bird a été trouvé avec %f probabilités ! ****\n", result.classification .value);
jpg_sent = vrai ;

Un drapeau est créé lorsqu’un oiseau est localisé afin que le code puisse enregistrer l’image sur la carte SD. Le processus continue ! Ce code dure six heures. Ensuite, le MCU passe en veille profonde pour recharger la batterie. La caméra ESP32 consomme environ 1 W (310 mA à 3,3 V) et le panneau solaire que j’ai ne fait que 1 W. Avec la perte et la lumière du soleil imparfaite, c’est probablement moitié moins d’entrée. Je dois donner à la batterie un temps d’arrêt pour qu’elle puisse se recharger. Ci-dessous se trouve le code de sommeil profond, qui s’exécute dans la méthode loop().

// Le plan serait de se réveiller pendant la journée et d'y rester pendant 6 heures avant de s'endormir profondément la nuit. 
//wakeTime fait référence à l'heure à laquelle la caméra est éveillée. Si ce temps dépasse le temps d'exécution, se
rendormir Unsigned long wakeTime = 6 * * ms_TO_S_FACTOR s_TO_HOUR_FACTOR
if(millis() > wakeTime)
Serial.print ("Time in ms:")
Serial.print(String(millis()) );
Serial.println(". Je vais me coucher maintenant"
Serial.flush();
esp_deep_sleep_start();

Ensuite, j’ai eu du mal à comprendre comment afficher les photos après leur enregistrement sur ma carte SD. La majorité des tutoriels que j’ai trouvés montraient simplement comment extraire la carte SD d’une caméra ESP32, puis la mettre dans un ordinateur pour afficher les photos. Je ne voulais pas avoir à marcher jusqu’à la mangeoire à oiseaux pour sortir la carte SD chaque fois que je voulais voir des photos. Je savais qu’il devait y avoir un moyen pour que le Wifi me permette de voir les images sur le serveur Web. Il m’a fallu 2 nuits pour trouver un moyen, avec mes compétences limitées en codage, de pouvoir accomplir cette tâche. Enfin, j’ai trouvé le gestionnaire de fichiers ESP32 SD de jameszah. Il était facile à utiliser et ne nécessitait que quelques lignes de code à intégrer. Cela m’a fait économiser beaucoup de temps et de maux de tête par rapport à essayer de faire le mien.

Après avoir configuré le serveur Web, j’ai pu télécharger les photos depuis ma carte SD. Succès!

Instantané de moi mettant en œuvre le gestionnaire de fichiers ESP32 SD de jameszah

C’était millis() que j’ai utilisé pour obtenir un ID pour mes noms de fichiers lors de la première configuration. Plus tard, j’ai appris que le serveur NTP pouvait être utilisé pour obtenir l’heure actuelle. J’ai pu ajouter la date à mes fichiers. Il est beaucoup plus facile de voir et de savoir quand la photo a été prise.

La Caméra En Action !

Ce ne sont là que quelques exemples des images capturées par la caméra. C’est très excitant!

Qu’est ce que tu regardes? Courir (voler) Ça s’appelle « Attendez ! C’est un appareil photo ? »

Ce fut un projet fantastique et m’a vraiment mis à l’épreuve. Il est autonome et tire son énergie de la lumière du soleil. La batterie stocke l’énergie pour charger une batterie. Je l’aime! Cela a testé mes compétences en ingénierie des systèmes et m’a obligé à concevoir autour d’une mangeoire à oiseaux existante. Il a également testé mon modèle Edge AI avec un MCU limité. Si je le pouvais, j’utiliserais des panneaux solaires de 1,5 à 2 W et une plus grande batterie de 3 Ah.

Même si c’était beaucoup de travail dans l’ensemble, je suis très content du résultat final. J’attends avec impatience le prochain projet ! !

Schémas

Diagramme Matériel ESP32 Bird Cam

Désolé, je suis nouveau sur Fritzing.

Code

Classificateur D’oiseaux Github

Le projet utilise une caméra ESP32 et un modèle Edge Impulse afin de déterminer si un oiseau a visité votre mangeoire à oiseaux. Si l’oiseau est présent, la caméra prendra un instantané et l’enregistrera sur la carte SD. Pour télécharger ou supprimer des photos stockées sur votre carte SD, le gestionnaire de fichiers ESP SD est accessible via un navigateur Web.