Accueil > ARDUINO > Commande d’un afficheur NeoPixel WS2812 avec Arduino

Commande d’un afficheur NeoPixel WS2812 avec Arduino

dimanche 28 février 2021, par thebault

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.


Principe de fonctionnement des leds WS2812

- La documentation des leds WS2812 : https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
- chaque led utilise 4 broches :

  • GND : masse
  • Vss ou Pwr : alimentation 5V
  • Data in ou DIN : signal d’entrée numérique en provenance du microcontrôleur ou de la led précédente
  • Datat out ou DO : signal de sortie vers la led suivante

Les schéma suivants, issus de la documentation technique expliquent le principe de branchement :

PNG - 10.3 ko
PNG - 13 ko

- 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.

PNG - 9.7 ko

- 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.

PNG - 8.8 ko

Les durées sont les suivantes :

PNG - 23.9 ko

- 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.

  • chaque pixel prend les 3 premiers octets (G-R-B) qui permettent le contrôle des couleurs Green Red Blue,
  • ensuite il retransmet la trame SANS ces 3 octets vers le pixel suivant,
  • enfin, la trame est terminée par un silence de 50µs minimum avant de recevoir un nouvel ordre de commande.
    PNG - 30.3 ko

La suite de ce tutoriel se fera avec le modèle NeoPixel Jewel d’Adafruit. https://www.adafruit.com/product/2226


Branchements

Dans cet exemple, la broche 7 de la carte Arduino est utilisée pour commander le module NeoPixel contenant 7 leds WS2812.

JPEG - 257.8 ko

Installation de la bibliothèque Arduino

Nous allons utiliser la bibliothèque proposée par Adafruit sous licence LGPL.

  • depuis l’IDE Arduino : Croquis -> inclure une bibliothèque -> Gérer les bibliothèques
    PNG - 51.6 ko
  • dans la barre de recherche de la fenêtre qui s’ouvre, taper neopixel
    PNG - 11.2 ko
  • Installer la bibliothèque
    PNG - 8.8 ko

Programmes

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.

  1. #include <Adafruit_NeoPixel.h>
  2.  
  3. int DataIn = 7;
  4. Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);
  5.  
  6. void setup() {
  7. pixels.begin();
  8. }
  9.  
  10. void loop() {
  11. pixels.clear();
  12. pixels.setPixelColor(0, pixels.Color(10, 10, 10));
  13. pixels.show();
  14. }

Télécharger

le programme en détail :
- on appelle la bibliothèque NeoPixel d’Adafruit

  1. #include <Adafruit_NeoPixel.h>


- Déclaration des variables :

  • on déclare DataIn comme un entier (integer) de valeur 7. Cela correspond au numéro de la broche de commande des leds.
  • pixels est une instance de la classe Adafruit_NeoPixel. La déclaration se fait de la manière suivante :
    Adafruit_NeoPixel pixels(nombre de pixels, broche de la carte Arduino, mode);
  1. int DataIn = 7;
  2. Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);

Télécharger

- 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

  1. void setup() {
  2. pixels.begin();
  3. }

Télécharger

- Enfin, on exécute la boucle infinie void loop().

  1. void loop() {
  2. pixels.clear();
  3. pixels.setPixelColor(0, pixels.Color(10, 10, 10));
  4. pixels.show();
  5. }

Télécharger

  • pixels.clear()  : permet de mettre à 0 (=éteindre tous les pixels)
  • pixels .setPixelColor(0, pixels.Color(10, 10, 10))  : permet de commander un pixel en particulier (le pixel 0 dans ce cas) et de lui affecter les valeurs Red = 10, Green = 10, Blue = 10.
  • La fonction pixels .Color(octetR, octetG, octetB) utilise l’ordre habituel Red-Green-Blue. Les couleurs seront les suivantes (principe de la synthèse additive) :
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)
... ...
  • pixels .show() génère le signal et permet l’affichage du pixel à la couleur voulue.

Réglage de luminosité

La bibliothèque incorpore un réglage de luminosité des leds :
pixels.setBrightness(octet de luminosité);
Exemple de programme :

  1. #include <Adafruit_NeoPixel.h>
  2. int DataIn = 7;
  3. Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);
  4.  
  5. void setup() {
  6. pixels.begin();
  7. }
  8.  
  9. void loop() {
  10. pixels.setBrightness(10);
  11. pixels.clear();
  12. pixels.setPixelColor(0, pixels.Color(100, 100, 100));
  13. pixels.show();
  14. }

Télécharger

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.

  1. #include <Adafruit_NeoPixel.h>
  2. int DataIn = 7;
  3. int i;
  4. Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);
  5.  
  6. void setup() {
  7. pixels.begin();
  8. }
  9.  
  10. void loop() {
  11. pixels.clear();
  12. for (i = 0; i <= 6; i++) {
  13. pixels.setPixelColor(i, pixels.Color(10, 10, 10));
  14. }
  15. pixels.show();
  16. }

Télécharger


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

  1. #include <Adafruit_NeoPixel.h>
  2. int DataIn = 7;
  3. int i;
  4. Adafruit_NeoPixel pixels(7, 7, NEO_GRB + NEO_KHZ800);
  5.  
  6. void setup() {
  7. pixels.begin();
  8. }
  9.  
  10. void loop() {
  11. pixels.clear();
  12. for (i = 0; i<=6; i++) {
  13. pixels.setPixelColor(i, pixels.Color(10, 10, 0));
  14. pixels.show();
  15. delay(1000);
  16. }
  17. for (i = 0; i<=6; i++) {
  18. pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  19. pixels.show();
  20. delay(1000);
  21. }
  22. }

Télécharger


Clignotement des leds en rouge

Enfin, ce dernier programme permet d’allumer progressivement les leds en rouge puis recommence le cycle

  1. #include <Adafruit_NeoPixel.h>
  2. int DataIn = 7;
  3. int i;
  4. int valeur;
  5.  
  6. Adafruit_NeoPixel pixels(7, DataIn, NEO_GRB + NEO_KHZ800);
  7.  
  8. void setup() {
  9. pixels.begin();
  10. }
  11.  
  12. void loop() {
  13. pixels.clear();
  14. for (valeur = 0; valeur <= 40; valeur++) {
  15. for (i = 0; i <= 7; i++) {
  16. pixels.setPixelColor(i, pixels.Color(valeur, 0, 0));
  17. }
  18. pixels.show();
  19. delay(20);
  20. }
  21. }

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL