Vous avez toujours rêvé de donner un peu de personnalité à votre robot ? Une simple LED peut faire toute la différence ! Dans cet article, nous allons explorer comment programmer une LED pour qu’elle donne l’impression que votre robot est vivant. C’est un projet parfait pour les débutants en robotique de loisir.
Pourquoi Animer une LED ?
Animer une LED peut transformer un simple robot en une créature interactive. Cela peut simuler des émotions, indiquer l’état du robot ou simplement ajouter une touche esthétique. C’est une manière simple mais efficace de rendre votre projet plus engageant.
Matériel Nécessaire
Avant de commencer, assurez-vous d’avoir le matériel suivant :
- Une carte Arduino (ou tout autre microcontrôleur compatible)
- Une LED (de préférence RGB pour plus de variations)
- Résistances (généralement 1 Kohms pour protéger la LED)
- Câbles de connexion
- Une breadboard
Étapes de Programmation
1. Configuration de Base
Commencez par connecter votre LED à la carte Arduino.
Voici un schéma simple :

- Connectez la patte longue de la LED côté rond (anode) à une résistance, puis à une broche numérique PWM de l’Arduino.
- Connectez la patte courte côté plat (cathode) à la masse (GND) de l’Arduino.
NB : Pour les composants électroniques, vous pouvez (re)voir l’article sur les kits de démarrage : Choisir son kit de démarrage Arduino
2. Écrire le Code
Ouvrez l’IDE Arduino et commencez un nouveau projet.
Voici le code pour animer la LED :
int ledPin = 3; // Broche où la LED est connectée void setup() { pinMode(ledPin, OUTPUT); // Définir la broche comme sortie } void loop() { // Allumer la LED progressivement for (int brightness = 0; brightness <= 255; brightness++) { analogWrite(ledPin, brightness); delay(10); // Attendre 10ms entre chaque incrément } // Eteindre la LED progressivement for (int brightness = 255; brightness >= 0; brightness--) { analogWrite(ledPin, brightness); delay(10); // Attendre 10ms entre chaque incrément } }
3. Téléverser et Tester
Téléversez le code sur votre Arduino et observez la magie opérer. La LED devrait s’allumer et s’éteindre progressivement, simulant une respiration.
NB : pour programmer une carte arduino, vous pouvez (re)voir l’article : Programmer une carte Arduino
Conseils Pratiques
- Expérimentez avec les délais : Modifiez les valeurs de
delay()
pour ajuster la vitesse de l’animation. - Utilisez une LED RGB : Pour plus de dynamisme, utilisez une LED RGB et changez les couleurs en fonction de l’état du robot.
- Ajoutez des capteurs : Intégrez des capteurs pour que la LED réagisse à l’environnement (par exemple, s’allume plus fort dans l’obscurité).
Code non-bloquant pour une LED animée
Nous avons créer un code qui anime une led, mais il reste bloqué pendant les moments d’attente, ce qui empêche d’exécuter d’autres tâches.
Pour créer un code qui ne bloque pas l’exécution d’autres tâches, nous allons utiliser la fonction millis()
d’Arduino. Cette fonction permet de mesurer le temps écoulé sans bloquer le programme, contrairement à la fonction delay()
qui va bloquer l’exécution et empêcher de réaliser d’autres tâches.
Voici comment vous pouvez adapter le code pour animer une LED de manière non bloquante :
1. Configuration de Base
Assurez-vous d’avoir connecté votre LED à la carte Arduino comme décrit précédemment.
2. Écrire le Code
Voici le code non-bloquant pour animer la LED sans bloquer l’exécution d’autres tâches :
const int ledPin = 3; // Broche où la LED est connectée int brightness = 0; // Luminosité actuelle de la LED int fadeAmount = 10; // Quantité de luminosité à changer à chaque étape unsigned long previousMillis = 0; // Stocke le dernier temps où la LED a changé d'état const long interval = 50; // Intervalle de temps entre chaque changement de luminosité (en millisecondes) void setup() { pinMode(ledPin, OUTPUT); // Définir la broche comme sortie } void loop() { animerLED(); // Appeler la fonction pour animer la LED // Ici, vous pouvez ajouter d'autres tâches à exécuter en parallèle // par exemple, lire des capteurs, envoyer des données, etc. } void animerLED() { unsigned long currentMillis = millis(); // Obtenir le temps actuel // Vérifier si l'intervalle de temps est écoulé if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Mettre à jour le temps précédent // Modifier la luminosité de la LED brightness = brightness + fadeAmount; // Inverser la direction de la variation de luminosité aux extrêmes if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } // Vérifier que la luminosité ne dépasse pas les limites if (brightness > 255) brightness = 255; if (brightness < 0) brightness = 0; // Appliquer la nouvelle luminosité à la LED analogWrite(ledPin, brightness); } }
Dans ce code, nous avons isolé l’animation dans la fonction animerLED()
pour pouvoir ajouter d’autres appels de fonctions dans la fonction loop()
pour les futures autres tâches à exécuter.
La fonction animerLED()
utilise dans variables en dehors de la fonction pour mémoriser son état. A chaque appel, la fonction va vérifier combien de temps s’est écoulé pour savoir si elle doit faire quelque chose et si oui elle utilise son état précédent pour mettre à jour l’animation.
3. Téléverser et Tester
Téléversez ce code sur votre Arduino. La LED devrait s’allumer et s’éteindre progressivement, simulant une respiration, tout en permettant à d’autres tâches de s’exécuter en parallèle.
NB : Ces tâches devront elles aussi être non-bloquantes pour que toutes les tâches puissent s’exécuter alternativement et donner l’impression qu’elles s’exécutent en parallèle.
Conseils Pratiques
- Ajustez l’intervalle : Modifiez la valeur de
interval
pour ajuster la vitesse de l’animation. - Ajoutez des tâches : Utilisez la même technique avec
millis()
pour ajouter d’autres tâches non bloquantes dans la boucle principale. - Utilisez des fonctions : Pour un code plus propre, encapsulez les différentes tâches dans des fonctions séparées.
BONUS : Version avec Fonction Sinus
En bonus, voici la version non-bloquante avec une fonction sinusoïdale afin que l’animation soit plus jolie.
#include <math.h> const int ledPin = 3; // Broche où la LED est connectée unsigned long previousMillis = 0; // Stocke le dernier temps où la LED a changé d'état const long interval = 30; // Intervalle de temps entre chaque changement de luminosité (en millisecondes) float angle = 0; // Angle pour la fonction sinus void setup() { pinMode(ledPin, OUTPUT); // Définir la broche comme sortie } void loop() { animerLEDSinus(); // Appeler la fonction pour animer la LED } void animerLEDSinus() { unsigned long currentMillis = millis(); // Obtenir le temps actuel // Vérifier si l'intervalle de temps est écoulé if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Mettre à jour le temps précédent // Calculer la luminosité en utilisant une fonction sinus int brightness = (sin(angle) + 1) * 127.5; // Convertir la valeur de -1 à 1 en 0 à 255 angle += 0.1; // Incrémenter l'angle // Appliquer la nouvelle luminosité à la LED analogWrite(ledPin, brightness); } }
Ce code reprend la version non bloquante, mais ici la fonction animerLEDSinus()
utilise une fonction pour calculer la luminosité à appliquer en fonction de l’angle qui représente le temps qui s’écoule.
Conclusion
Félicitations, vous venez de donner vie à vos créations robotiques avec une simple LED ! Ce projet est une excellente introduction à l’intéraction avec les humains et à la programmation non-bloquante. N’hésitez pas à partager vos créations et vos idées sur notre site. Laissez un commentaire ci-dessous pour nous dire comment vous avez personnalisé votre animation LED ou comment je peux vous aider à rendre non-bloquant un bout de code.
Prêt à aller plus loin ? Pourquoi ne pas essayer d’ajouter des sons ou des mouvements pour rendre votre robot encore plus vivant ? À vos outils, et amusez-vous bien !
Amicalement,
Thierry
Avez-vous déjà utilisé des artifices lumineux en construisant vos robots ? Comment les avez-vous programmés ? Vos conseils et retours d’expérience sont précieux pour la communauté.
Laissez un commentaire ci-dessous pour nous dire comment vous avez personnalisé votre animation LED ou comment je peux vous aider à rendre non-bloquant un bout de code. Votre contribution peut aider d’autres passionnés à progresser rapidement.
Rejoignez la conversation et faisons grandir la communauté !