Boomerang LED (Va et Vient)
Ce projet implémente l'effet classique de Scanner de LED (souvent associé à la voiture K.I.T.T. de la série K 2000 / Knight Rider ou aux Cylons de Battlestar Galactica). Le faisceau de lumière va d'une extrémité à l'autre du ruban de LED et revient, laissant une traînée de lumière douce (cauda) derrière lui.
C'est un effet très visuel et simple à implémenter sur des rubans de LED adressables WS2812B (NeoPixels) à l'aide de microcontrôleurs comme Arduino.
🛠️ Comment ça marche ?
Le projet utilise la bibliothèque EasyNeoPixels.h pour abstraire la communication avec le ruban.
La fluidité du mouvement et la longueur de la traînée lumineuse sont contrôlées par des paramètres logiques au début du code. L'atténuation de la luminosité est calculée à l'aide de décalages de bits (brightness >> t) pour obtenir d'excellentes performances, même sur des microcontrôleurs 8 bits.
📐 Paramètres et Configuration
#define PIN 6 // Broche de données connectée au ruban de LED
#define LEN 10 // Nombre total de LED sur le ruban
#define TAIL 3 // Longueur de la traînée de la LED
#define DELAY 50 // Vitesse de transition (en millisecondes)
💻 Implémentation de l'Algorithme
Voici le code C++ complet à charger sur votre Arduino :
#include <EasyNeoPixels.h>
#define PIN 6
#define LEN 10
#define TAIL 3
#define DELAY 50
void setup() {
setupEasyNeoPixels(PIN, LEN);
}
void loop() {
// Mouvement Aller (Forward)
for (int i = 0; i < LEN; i++) {
writeEasyNeoPixel(i, 255, 0, 0); // Allume la LED actuelle au maximum (Rouge)
// Génère la traînée en atténuant les LED précédentes
for (int t = 1; t <= TAIL; t++) {
if (i - t >= 0) {
writeEasyNeoPixel(i - t, 255 >> t, 0, 0); // Réduit la luminosité (décalage de bits)
}
}
// Éteint la LED hors de portée de la traînée
if (i - TAIL - 1 >= 0) {
writeEasyNeoPixel(i - TAIL - 1, 0, 0, 0);
}
delay(DELAY);
}
// Mouvement Retour (Backward)
for (int i = LEN - 1; i >= 0; i--) {
writeEasyNeoPixel(i, 255, 0, 0);
for (int t = 1; t <= TAIL; t++) {
if (i + t < LEN) {
writeEasyNeoPixel(i + t, 255 >> t, 0, 0);
}
}
if (i + TAIL + 1 < LEN) {
writeEasyNeoPixel(i + TAIL + 1, 0, 0, 0);
}
delay(DELAY);
}
}
