Accueil > ARDUINO > Commande d’un afficheur NeoPixel WS2812 avec Arduino
dimanche 28 février 2021, par
Les afficheurs Neopixel d’Adafruit (https://www.adafruit.com/category/168) sont des leds RGB adressables de type WS2812 ou WS2811. Ces leds sont montées en cascade les unes après les autres.
La documentation des leds WS2812 : https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
chaque led utilise 4 broches :
Les schéma suivants, issus de la documentation technique expliquent le principe de branchement :
données transmises à chaque led
chaque led reçoit 3 octets (soit 24 bits) dans l’ordre GRB (Green Red Blue). Dans chacun des 3 octets le bit de poids fort (MSB) est transmis en premier.
identifier les niveaux logiques 0 et 1
La différence entre un niveau logique 0 et un niveau logique 1 est déterminée par les durées d’état haut ou état bas du signal.
Les durées sont les suivantes :
la trame de commande des leds.
La trame émise par le microcontrôleur aura une longueur qui va varier suivant le nombre de "pixel" (=nombre de led WS2812) utilisés.
La suite de ce tutoriel se fera avec le modèle NeoPixel Jewel d’Adafruit. https://www.adafruit.com/product/2226
Dans cet exemple, la broche 7 de la carte Arduino est utilisée pour commander le module NeoPixel contenant 7 leds WS2812.
Nous allons utiliser la bibliothèque proposée par Adafruit sous licence LGPL.
Il est conseillé limiter l’éclairement des diodes lors des essais afin de ne pas s’éblouir
Commander une led
Le premier programme va permettre d’allumer le premier pixel en blanc (en mettant les mêmes valeurs pour les octets définissant le rouge, le vert et le bleu). Les valeurs de chacun des octets peuvent varier de 0 à 255.
#include <Adafruit_NeoPixel.h> int DataIn = 7; Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { pixels.clear(); pixels.setPixelColor(0, pixels.Color(10, 10, 10)); pixels.show(); }
le programme en détail :
on appelle la bibliothèque NeoPixel d’Adafruit
#include <Adafruit_NeoPixel.h>
Déclaration des variables :
Adafruit_NeoPixel pixels(nombre de pixels, broche de la carte Arduino, mode);
int DataIn = 7; Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);
On entre dans la fonction d’initialisation void setup() qui ne s’exécute qu’une seule fois lors du démarrage du programme et on initialise la commande du module à leds
void setup() { pixels.begin(); }
Enfin, on exécute la boucle infinie void loop().
void loop() { pixels.clear(); pixels.setPixelColor(0, pixels.Color(10, 10, 10)); pixels.show(); }
couleur | pixels .Color(octetR, octetG, octetB) |
rouge | pixels .Color(10, 0, 0) |
vert | pixels .Color(0, 10, 0) |
bleu | pixels .Color(0, 0, 10) |
jaune | pixels .Color(10, 10, 0) |
... | ... |
Réglage de luminosité
La bibliothèque incorpore un réglage de luminosité des leds :
pixels.setBrightness(octet de luminosité);
Exemple de programme :
#include <Adafruit_NeoPixel.h> int DataIn = 7; Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { pixels.setBrightness(10); pixels.clear(); pixels.setPixelColor(0, pixels.Color(100, 100, 100)); pixels.show(); }
Dans le programme précédent l’éclairement de chaque led vaudra :
(10/255) x (100/255) = 0,015 = 1,5 % de l’éclairement maximum
Commander l’ensemble des leds
En utilisant une structure for(initialisation ; condition ; modification), on va affecter les valeurs d’éclairement RGB à chacun des pixels (plutôt que d’écrire 7 fois pixels.setPixelColor(...) ) pour ensuite émettre le signal de commande.
#include <Adafruit_NeoPixel.h> int DataIn = 7; int i; Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { pixels.clear(); for (i = 0; i <= 6; i++) { pixels.setPixelColor(i, pixels.Color(10, 10, 10)); } pixels.show(); }
Allumer puis éteindre les leds les unes après les autres.
Le programme suivant va allumer les leds en jaune les unes après les autres puis les éteindre
#include <Adafruit_NeoPixel.h> int DataIn = 7; int i; Adafruit_NeoPixel pixels(7, 7, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { pixels.clear(); for (i = 0; i<=6; i++) { pixels.setPixelColor(i, pixels.Color(10, 10, 0)); pixels.show(); delay(1000); } for (i = 0; i<=6; i++) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); pixels.show(); delay(1000); } }
Clignotement des leds en rouge
Enfin, ce dernier programme permet d’allumer progressivement les leds en rouge puis recommence le cycle
#include <Adafruit_NeoPixel.h> int DataIn = 7; int i; int valeur; Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { pixels.clear(); for (valeur = 0; valeur <= 40; valeur++) { for (i = 0; i <= 7; i++) { pixels.setPixelColor(i, pixels.Color(valeur, 0, 0)); } pixels.show(); delay(20); } }