LEDs RGB Pilotables
LED WS2812
Les LEDs de type WS2812 sont la combinaison de 3 LEDs trichromes (rouge, verte et bleue) et d’un circuit de commande numérique (registres à décalage et PWM pour chacune des couleurs).
Elles se pilotent donc en numérique par le biais d’une trame binaire de 8 bits par couleur (vert, rouge, bleu – 256 niveaux par couleur), soient 24 bits au total.
Les ‘0’ et les ‘1’ sont codés de la façon suivante :
Les temps haut et bas sont quantifiés : T0H = 0.35us / T0L = 0.8us / T1H = 0.7us / T1L = 0.6us / RES > 50 us.
L’intérêt de ces modules de LED est la possibilité de les mettre en cascade :
Ainsi, on peut transmettre une suite de N x 24 bits successifs pour pouvoir contrôler l’intégralité des N LEDs.
ATTENTION Il existe des matrices de LED basées sur des LED de type SK6812, qui se programme de la même façon que les WS2812, à ceci prêt qu’il faut envoyer 32 bits par LED et non 24 bits. Le dernier octet à émettre est vide (‘0’), mais il faut l’émettre 🙂
Bibliothèques nécessaires
Pour pouvoir utiliser cet exemple, les deux bibliothèques suivantes sont nécessaires :
- PixelArray – pour gérer des tableaux d’entiers
- WS2812 – pour gérer les signaux à transmettre aux LEDs
Vous trouverez les bibliothèques en suivant ce lien : WS2812 LEDs control - MBED6
Bibliothèque PixelArray
La bibliothèque PixelArray
permet de créer et de mettre à jour un tableau de pixels de 3 octets (RGB).
Il est créé à l’aide de la commande suivante :
PixelArray px(10);
L’objet px
est alors un tableau de 10 pixels contenant chacun les champs : (R)ed (B)lue (G)reen.
Il est alors possible de modifier chacun de ces pixels à l’aide de 3 fonctions :
void SetR(int i, int val); void SetB(int i, int val); void SetG(int i, int val);
qui permettent respectivement de changer la couleur rouge (SetR), la couleur bleu (SetB) et la couleur verte (SetG) de la LED numéro i
(la première ayant le numéro 0 et la dernière N-1) avec la valeur val
comprise entre 0 et 255 (0 = 0% – 255 = 100%).
Par exemple, pour mettre la couleur R = 20% – B = 40% – G = 20% sur la troisième LED, on peut utiliser les instructions suivantes :
px.SetR(2, 20*255/100.0); px.SetB(2, 40*255/100.0); px.SetG(2, 20*255/100.0);
Sur les versions White des LED, la fonction SetI permet de rajouter du blanc.
Il est également possible d’aller lire chacune des valeurs des pixels grâce aux commandes :
int GetR(int i); int GetB(int i); int GetG(int i);
qui permettent respectivement de récupérer la couleur rouge (SetR), la couleur bleu (SetB) et la couleur verte (SetG) de la LED numéro i
(la première ayant le numéro 0 et la dernière N-1).
Pour récupérer la valeur rouge de la 5ème LED, il faudra par exemple faire :
int k = px.GetR(4);
Bibliothèque WS2812
La bibliothèque WS2812
permet de mettre à jour la matrice de LED en respectant le protocole demandé par le fabricant de ces LED.
Il est créé à l’aide de la commande suivante :
WS2812 ws(D10, NB_LED, WS2812_WHI);
L’objet ws
permet alors de piloter un bandeau de NB_LED
LEDs sur la broche D10
de la carte Nucléo.
Il existe deux versions de LED : avec ou sans la composante blanche (white). Pour des LEDs avec cette composante, le dernier paramètre doit être WS2812_WHI. Pour des LEDs standard, le dernier paramètre doit être WS2812_STD.
Il est indispensable d’initialiser la matrice à l’aide de la commande suivante :
ws.set_timings(6, 13, 14, 5); ws.break_trame();
La première fonction permet de spécifier le bon timing sur le protocole de sortie. Ces valeurs sont spécifiques à la carte Nucleo L476RG.
Enfin, pour transmettre les données, il faut utiliser la fonction send_leds :
ws.send_leds(px.get_array());
Exemple d’application
Un exemple complet est disponible ici : Exemple WS2812
Pour la partie artistique, laissez libre cours à votre imagination… Et n’hésitez pas à m’envoyer vos meilleurs programmes !