Contrôle de lumières RVB par détection de mots-clés TinyML
Composants et fournitures
| Arduino Nano 33 BLE Sense | ×1 |
Applications et services en ligne
- Edge Impulse Studio
À propos du projet
Le concept
L'apprentissage automatique en périphérie (edge) est extrêmement utile pour créer des appareils capables d'accomplir des tâches « intelligentes » avec beaucoup moins de programmation et de diagrammes logiques qu'avec du code traditionnel. C'est pourquoi je voulais intégrer une détection de mots-clés en périphérie qui reconnaît certains mots et exécute une action en fonction de ce qui a été dit.
Matériel
Ce projet n'utilise qu'un seul composant : un Arduino Nano 33 BLE Sense. La magie opère dans le modèle d'apprentissage automatique. Cette carte regorge de capteurs : microphone, IMU 9 axes, capteur environnemental, capteur de geste/proximité/couleur/lumière ambiante (APDS-9960). Le microcontrôleur est un nRF52840 à 64 MHz avec 1 Mo de flash et 256 Ko de RAM. Le projet utilise aussi sa LED RVB intégrée pour afficher la couleur courante.
Configuration d'Edge Impulse
J'ai créé un nouveau projet sur Edge Impulse et installé l'outil CLI Edge Impulse. Cela permet à l'Arduino Nano de communiquer avec le service cloud pour recevoir des commandes et envoyer des données de capteurs automatiquement. J'ai téléchargé le firmware Edge Impulse le plus récent et l'ai flashé sur la carte en double-cliquant sur le bouton reset pour entrer en mode bootloader, puis en exécutant flash_windows.bat.
Ensuite, j'ai lancé edge-impulse-daemon et suivi l'assistant de configuration. La Nano apparaît maintenant dans la liste des appareils du projet, permettant de capturer et téléverser des échantillons pour l'entraînement et les tests.
Collecte des échantillons
L'entraînement d'un modèle ML nécessite beaucoup de données. Je voulais les modes suivants pour la LED RVB :
- On (Allumer)
- Off (Éteindre)
- Red (Rouge)
- Green (Vert)
- Blue (Bleu)
J'ai enregistré environ 1 minute de son pour chaque mode, en répétant le mot à intervalles de 1-2 secondes, puis je les ai découpés.
Mais ce n'est pas suffisant : le bruit de fond et d'autres mots donneraient de faux positifs. Heureusement, Edge Impulse fournit des jeux de données pré-construits pour le bruit et les mots « inconnus ». J'ai utilisé leur outil « Upload Existing Data » pour importer ces fichiers audio dans les données d'entraînement.
Enfin, j'ai rééquilibré le jeu de données pour obtenir la répartition recommandée 80-20 entre entraînement et test.
Entraînement du modèle
L'impulsion que j'ai conçue prend l'audio comme données temporelles avec une fenêtre de 1 seconde et un chevauchement de 500 ms. Elle passe par un bloc MFCC (coefficient cepstral de fréquence Mel) puis dans un bloc réseau de neurones Keras.
Le bloc MFCC permet de configurer le traitement audio avec un spectrogramme visuel. J'ai gardé les paramètres du réseau neuronal mostly par défaut, mais j'ai :
- Réduit le seuil de confiance minimum de 0,80 à 0,70
- Ajouté de l'augmentation de données : bruit additionnel et masquage de bandes temporelles
Cela aide à éviter le sur-apprentissage (overfitting) en diversifiant les données d'entraînement.
Déploiement sur l'Arduino Nano 33 BLE Sense
La carte agit comme un microphone toujours actif qui échantillonne continuellement l'audio et détecte si un mot-clé a été prononcé. Une fois détecté, le mot-clé est converti en index pour décoder la couleur désirée. Pour "on" ou "off", la LED passe au gris clair ou au noir (éteint).
J'ai téléchargé le modèle comme bibliothèque Arduino, l'ai ajoutée à l'IDE Arduino, compilé et flashé sur la Nano.
Code
RGBLEDKeywordDetection (C/C++)
Le code complet utilise la bibliothèque PDM pour l'acquisition audio, le SDK Edge Impulse pour l'inférence continue, et contrôle la LED RVB intégrée (broches 22, 23, 24). Points clés :
- EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW = 3 : découpage de la fenêtre de modèle en 3 tranches pour l'inférence continue
- CONFIDENCE_THRESHOLD = 0.7 : seuil de détection
- Mapping des actions :
LED_ON, LED_OFF, LED_RED, LED_GREEN, LED_BLUE, NONE - Fonction
performAction(): mappe le label détecté vers l'action correspondante (changement couleur ou on/off) - Gestion des tampons audio double-buffer pour l'acquisition PDM sans interruption
- Callback PDM
pdm_data_ready_inference_callbackpour remplir les tampons d'inférence
Le code inclut toutes les fonctions nécessaires : initialisation PDM, inférence continue, conversion int16 vers float pour le classifieur, et nettoyage mémoire.
Note : Le modèle doit être entraîné pour le capteur microphone (EI_CLASSIFIER_SENSOR_MICROPHONE), sinon une erreur de compilation se produit.
Processus de fabrication
- Sécurité Industrial IoT : tendances clés et meilleures pratiques 2020
- Edge & Cloud Computing dans l'IoT : aperçu évolutif concis
- Pourquoi l'edge computing est essentiel pour le succès de l'IoT
- Edge Computing : accélérer le déploiement de l'IA en périphérie du réseau
- Quatre étapes éprouvées pour réussir l'edge computing dans les usines intelligentes
- Microsoft dévoile Azure Edge Zones pour alimenter les charges de travail IoT et IA compatibles 5G
- Pourquoi l'open source stimule l'innovation à la périphérie — eBook essentiel
- Système de détection d'armes chimiques ultra-sensible pour menaces de faible niveau
- Pourquoi vous devez maintenir vos détecteurs de gaz en parfait état : 3 raisons essentielles