1. Présentation Générale
Ce projet permet de contrôler plusieurs rubans de LEDs WS2812 (NeoPixel) connectés à un Arduino, en leur appliquant différents effets lumineux.
Un programme Python assure la communication entre l’ordinateur (PC, MAC, Raspberry) et l’Arduino via le port série.
L’architecture repose sur un protocole texte simple utilisant des commandes séparées par des virgules.
2. Schéma du Système
- Arduino UNO / MEGA (ou équivalent) connecté à deux rubans WS2812 :
- Ruban 1 : 300 LEDs, pin D2
- Ruban 2 : 144 LEDs, pin D3
- PC exécutant un script Python qui envoie des commandes à l’Arduino via USB (port série).
3. Programme Arduino
3.1. Définition des Rubans
- Ruban 1 : 300 LEDs sur la broche D2
- Ruban 2 : 144 LEDs sur la broche D3
- Les rubans sont stockés dans un tableau
strips[]
pour un accès générique.
3.2. Types d’Effets
Les effets disponibles sont définis dans l’énumération EffectType
:
Nom | Code | Description |
---|---|---|
STOP | 0 | Arrête un effet par son ID |
FIXED | 1 | Affiche une couleur fixe sur une portion de ruban |
BLINK | 2 | Clignotement entre deux couleurs |
CHASE | 3 | Effet chenillard (une LED active qui se déplace) |
FADE | 4 | Transition progressive entre deux couleurs |
RAINBOW | 5 | Cycle arc-en-ciel |
FIRE | 6 | Effet feu (flickering en rouge/orange) |
SNOW | 7 | Effet neige (points blancs aléatoires qui descendent) |
SMOKE | 8 | Effet fumée (dégradés gris aléatoires qui s’estompent) |
3.3. Gestion des Effets
- Jusqu’à 50 effets simultanés (
MAX_EFFECTS
). - Chaque effet est identifié par un ID unique généré lors de sa création.
- Les effets sont stockés dans un tableau
effects[]
.
3.4. Protocole de Communication
Les commandes envoyées à l’Arduino suivent le format :
num,cmd,strip,param1,param2,...
num
: Numéro de séquence (envoyé par le PC)cmd
: Type d’effet (voir tableau ci-dessus)strip
: Numéro du ruban (0 = ruban 1, 1 = ruban 2)paramX
: Paramètres dépendant de l’effet
Exemple de Commandes
- Couleur fixe rouge sur LEDs 0 à 50 du ruban 0 :
1,1,0,0,50,255,0,0
- Clignotement entre rouge et vert (LEDs 10 à 100, intervalle 500ms) :
2,2,1,10,100,255,0,0,0,255,0,500
- Stopper un effet avec ID = 7 :
3,0,7
Réponses de l’Arduino
- Réponse au format :
num,OK/id,code
OK
(1) → commande acceptéeER
(0) → erreur, avec code d’erreur :MSG_LENGTH_3
: commande trop courteSTRIP_NUMBER
: numéro de ruban invalidePARAM_COUNT
: mauvais nombre de paramètresUNKNOWN_CMD
: commande inconnue
4. Programme Python
4.1. Connexion Série
- Paramètres :
- Port :
"COM3"
(Windows) ou"/dev/ttyUSB0"
(Linux) - Baudrate :
115200
- Timeout :
5s
- Port :
4.2. Fonctions Principales
send_line(line)
Envoie une commande à l’Arduino et attend une réponse.- Retourne un tuple (num, status, id)
status = "1"
si succès, sinon"0"
ou"timeout"
stop_effect(id)
Envoie plusieurs requêtesSTOP
pour s’assurer qu’un effet est bien arrêté.
4.3. Exemple d’Utilisation
# Allume un effet FIXED en rouge sur ruban 0 (LEDs 50 à 100)
num_msg, bok, eff_id = send_line("1,1,0,50,100,255,0,0")
print("R <-", num_msg, bok, eff_id)
# Attendre 10 secondes
time.sleep(10)
# Stopper l’effet
stop_effect(eff_id)
4.4. Communication Exemple
S -> 1,1,0,50,100,255,0,0
R <- 1,1,5 # effet créé avec ID=5
...
S -> 2,0,5
R <- 2,1,0 # effet 5 stoppé
5. Sécurité & Limitations
- Alimentation adaptée :
- 300 LEDs WS2812 → jusqu’à 18 A (à pleine luminosité blanche).
- Prévoir une alimentation externe 5V avec puissance suffisante.
- Bien relier les masses (GND) entre l’Arduino et l’alimentation du ruban.
- Le protocole ne gère pas encore les priorités d’effets ni la sauvegarde en EEPROM.
6. Améliorations Possibles
- Ajout d’un protocole JSON au lieu de CSV pour plus de clarté.
- Ajout de commandes pour régler la luminosité globale.
- Gestion de plusieurs effets sur un même segment de ruban.
- Interface graphique (GUI Python, Qt ou Tkinter).
7. Résumé
- Arduino → gère les rubans, applique les effets.
- Python → envoie des commandes série, gère la logique utilisateur.
- Protocole simple CSV → extensible, robuste.
Ce système permet un contrôle temps réel de rubans WS2812 avec une grande flexibilité.
Référence API des Effets LED (Arduino + Python)
Format Général des Commandes
num,cmd,strip,param1,param2,...
- num : Numéro de message (incrémenté par le script Python)
- cmd : Code de l’effet (voir tableau ci-dessous)
- strip : Numéro du ruban (0 = ruban 1, 1 = ruban 2, etc.)
- paramX : Paramètres spécifiques à l’effet
1. Commandes Disponibles
Commande | Code | Description |
---|---|---|
STOP | 0 | Arrête un effet à partir de son ID |
FIXED | 1 | Affiche une couleur fixe sur un segment |
BLINK | 2 | Fait clignoter un segment entre deux couleurs |
CHASE | 3 | Chenillard (LED active qui se déplace) |
FADE | 4 | Transition progressive entre deux couleurs |
RAINBOW | 5 | Effet arc-en-ciel |
FIRE | 6 | Effet feu (flickering rouge/orange) |
SNOW | 7 | Effet neige (points blancs descendant) |
SMOKE | 8 | Effet fumée (points gris estompés) |
2. Paramètres par Effet
STOP (0)
Arrête un effet en cours à partir de son ID.
num,0,id
id
: identifiant de l’effet à stopper (reçu lors de sa création).
Exemple :
5,0,12
➡️ Stoppe l’effet ayant ID = 12.
FIXED (1)
Affiche une couleur fixe sur une plage de LEDs.
num,1,strip,start,end,R,G,B
start
: première LED (index)end
: dernière LEDR,G,B
: couleur (0–255)
Exemple :
6,1,0,0,50,255,0,0
➡️ LEDs 0 à 50 du ruban 0 en rouge.
BLINK (2)
Clignotement entre deux couleurs.
num,2,strip,start,end,R1,G1,B1,R2,G2,B2,interval
R1,G1,B1
: couleur 1R2,G2,B2
: couleur 2interval
: durée d’un état en ms
Exemple :
7,2,1,10,30,255,0,0,0,255,0,500
➡️ LEDs 10–30 du ruban 1 clignotent rouge/vert toutes les 500 ms.
CHASE (3)
Effet chenillard.
num,3,strip,start,end,R,G,B,interval
R,G,B
: couleur de la LED activeinterval
: temps entre déplacements (ms)
Exemple :
8,3,0,0,20,0,0,255,100
➡️ Chenillard bleu sur LEDs 0–20 du ruban 0.
FADE (4)
Transition progressive entre deux couleurs.
num,4,strip,start,end,R1,G1,B1,R2,G2,B2,interval
R1,G1,B1
: couleur de départR2,G2,B2
: couleur de fininterval
: durée d’un cycle de fade (ms)
Exemple :
9,4,1,0,50,255,0,0,0,0,255,200
➡️ LEDs 0–50 du ruban 1 passent progressivement du rouge au bleu toutes les 200 ms.
RAINBOW (5)
Cycle arc-en-ciel.
num,5,strip,start,end,interval
interval
: vitesse du défilement (ms)
Exemple :
10,5,0,0,100,50
➡️ LEDs 0–100 du ruban 0 affichent un arc-en-ciel animé.
FIRE (6)
Effet feu réaliste (rouge/orange clignotant).
num,6,strip,start,end,interval
interval
: vitesse de mise à jour (ms)
Exemple :
11,6,1,0,50,80
➡️ LEDs 0–50 du ruban 1 avec un effet feu.
SNOW (7)
Effet neige (points blancs descendant le long du ruban).
num,7,strip,start,end,interval,density
interval
: vitesse de chute (ms)density
: densité (0–100 %)
Exemple :
12,7,0,0,144,150,10
➡️ LEDs 0–144 du ruban 0 → neige clairsemée (10%).
SMOKE (8)
Effet fumée (points gris estompés).
num,8,strip,start,end,interval,density
interval
: vitesse de génération (ms)density
: densité (0–100 %)
Exemple :
13,8,1,0,50,200,30
➡️ LEDs 0–50 du ruban 1 → fumée dense (30%).
3. Codes de Retour de l’Arduino
- Réponse standard :
num,OK,id
ounum,ER,code
Signification
OK (1)
→ succèsER (0)
→ erreur
Code d’erreur | Valeur | Signification |
---|---|---|
MSG_LENGTH_3 | 0 | Message trop court (< 3 champs) |
STRIP_NUMBER | 1 | Numéro de ruban invalide |
PARAM_COUNT | 2 | Nombre de paramètres incorrect |
UNKNOWN_CMD | 3 | Commande non reconnue |
4. Exemple Session Complète
S -> 1,1,0,0,20,255,0,0
R <- 1,1,4 # effet FIXED créé avec ID=4
S -> 2,2,0,0,20,255,0,0,0,255,0,500
R <- 2,1,5 # effet BLINK créé avec ID=5
S -> 3,0,5
R <- 3,1,0 # effet ID=5 stoppé
Dépendances
1. Arduino (programme embarqué)
Bibliothèques Arduino
Arduino.h
(fournie par défaut)Adafruit_NeoPixel
- Installation via Arduino Library Manager
- Permet de piloter les rubans LED WS2812/WS2812B
Outils
- Arduino IDE
- Port série USB actif (115200 bauds)
2. Python (passerelle série côté PC)
Version minimale
- Python 3.8+
Modules nécessaires
pyserial
pip install pyserial
0 commentaire