mercredi 10 juin 2020

Matrice de LEDs RGB 16 X 16 WS2812B et Arduino


J'ai récemment reçu une matrice constituée de 256 LEDs RGB qui permet de créer des animations multicolores assez impressionnantes.  


Il  m'arrive souvent, lorsque je reçois un article que j'avais commandé en ligne, de m'apercevoir qu'il est beaucoup plus petit que ce que j'avais imaginé. Cette fois, c'est tout le contraire: la matrice de LEDs forme un carré de 16 cm par 16 cm, soit environ 6 fois la surface de la carte Arduino Uno que j'ai utilisé pour la contrôler.

Les connecteurs

À l'endos du panneau, la présence de 8 câbles conducteurs pourrait laisser croire que les connexions seront complexes, mais ce n'est pas le cas. 3 connexions suffisent pour faire fonctionner la matrice:
  • Nous branchons n'importe lequel des 3 fils rouges à la borne positive d'une source de tension continue de 5 V.
  • Nous branchons le fil noir (ou un des deux fils blancs) à la masse (GND de l'Arduino et borne négative de la source de tension).
  • Un seul fil sert à la réception des instructions en provenance de l'Arduino: le fil vert identifié "DIN", que nous brancherons, par exemple, à la broche 3 de l'Arduino.
Les connexions non-utilisées servent à faciliter la combinaisons de plusieurs matrices afin de former un panneau plus grand (ce que je ne ferai pas dans cet article).

Prenez soin de bien choisir votre source de tension: 256 LEDs allumées en même temps peuvent consommer beaucoup de courant. Utiliser la sortie 5 V de l'Arduino Uno n'est pas une très bonne idée.


Installation de la bibliothèque FastLED

J'ai installé la bibliothèque FastLED par Daniel Garcia (on peut passer par le gestionnaire de bibliothèque de l'IDE Arduino).


Pour vérifier que tout fonctionne bien, je vous suggère d'essayer l'exemple "Blink" fourni avec la bibliothèque (menu Fichier - Exemples - FastLED - Blink).


Cet exemple ne fait rien de bien spectaculaire: il fait clignoter en rouge la LED numéro zéro de votre matrice. Mais il contient la liste des principales configurations possibles. Dans mon cas, j'ai décommenté la ligne dédiée au contrôleur WS2812B.


Une LED située dans un coin de la matrice s'est effectivement mise à clignoter, mais en vert, ce qui m'a permis de savoir que ma matrice est de type GRB plutôt que RGB.  En remplaçant, dans le sketch, la mention "RGB" par "GRB", la LED s'est mise à clignoter en rouge, tel que prévu.


Avec ces informations, j'ai pu essayer d'autres exemples fournis avec la bibliothèque FastLED, comme par exemple le spectaculaire "ColorPalette", à la condition de remplacer les paramètres appropriés:
  • LED_PIN: 3
  • NUM_LEDS: 256
  • LED_TYPE : WS2812B
  • COLOR_ORDER: GRB



Il nous reste toutefois à régler un petit irritant: le contrôleur WS2812B et la bibliothèque FastLED ne sont pas conçus de façon spécifique pour des matrices bi-dimensionnelles; on peut aussi les utiliser pour des rubans de LEDs. Pour cette raison, les LEDs sont simplement numérotées de 0 à 255, mais dans un ordre bien peu pratique.

Ainsi, sur ma matrice, la LED numéro 0 est celle qui est située dans le coin inférieur gauche. Sur cette ligne, les numéros augmentent à mesure qu'on se déplace vers la droite, jusqu'à la LED numéro 15. La LED numéro 16 est située juste au-dessus de la LED numéro 15, et sur cette ligne les numéros augmentent à mesure qu'on se déplace vers la gauche.

Voici un sketch qui allume chaque LED à tour de rôle, de 0 à 255. C'est une façon simple de vérifier dans quel ordre elles sont numérotées.

-
-

Installation de la bibliothèque LEDMatrix

Heureusement, il existe des bibliothèques spécialement conçues pour combler les lacunes de FastLED. J'ai choisi la bibliothèque LEDMatrix par Jorgen - VikingGod. 

Cette bibliothèque, qui doit être combinée à la bibliothèque FastLED, permet de contrôler les LEDs de la matrice à partir du numéro de ligne et du numéro de colonne. De plus, la bibliothèque met à notre disposition un certain nombre de méthodes pour faciliter le contrôle de notre matrice de LEDs:
  • DrawPixel(x, y, couleur) : pour allumer une LED en particulier
  • DrawLine(x0, y0, x1, y1, couleur): pour tracer une ligne
  • DrawRectangle(x0, y0, x1,y1, couleur): pour tracer le contour d'un rectangle
  • DrawCircle(xc,  yc,  r, couleur) pour tracer le contour d'un cercle
  • DrawFilledRectangle(x0, y0, x1,y1, couleur): pour tracer un rectangle plein
  • DrawFilledCirclee(xc,  yc,  r, couleur) pour tracer un cercle plein
Le motif peut être déplacé d'un pixel dans n'importe quelle direction grâce à ShiftLeft(), ShiftRight(), ShiftDown(), ShiftUp(), et plusieurs effets de miroirs peuvent être utilisés afin de dupliquer une partie de l'écran: HorizontalMirror(), VerticalMirror(), QuadrantMirror(), QuadrantRotateMirror(), TriangleTopMirror(), TriangleBottomMirror(), QuadrantTopTriangleMirror(), QuadrantBottomTriangleMirror().

Voici un sketch qui illustre l'utilisation de certaines de ces méthodes.



-
-

La matrice de LEDs utilisée pour la rédaction de ce tuto a été fournie gratuitement par DigitSpace.

Yves Pelletier (TwitterFacebook)



2 commentaires:

  1. Bonjour, j'ai réalisé un projet sur la base de bandes de LED montées en carré. J'y ai passé pas mal de temps, et j'ai mis en place quelques outils sympa pour, par exemple:
    - faire des slideshows
    - faire des transitions (fondu, décallage horizontal ou vertical)
    - un Pong (mes contrôleurs s'y prêtent)
    - un éditeur d'images sur PC
    - la possibilité de copier-coller une image depuis votre logiciel de dessin préféré
    - la compression des images (et décompression à la volée), cmppression en RLE, par extraction de palette, par palette ET RLE, par Huffman.
    - L'envoi en direct sur la matrice via câble série pour ne pas avoir à compiler à chaque modification.
    Oui, j'avais un petit moment à perdre ;)
    Vous ne voudrez pas forcément publier ce pavé, mais cela pourra vous intéresser.
    En tout cas, voilà le lien vers la conception, avec 2 vidéos à la fin. Le code est à dispo s'il vous intéresse: https://www.lairdubois.fr/creations/9621-la-valumineuse-la-valise-lumineuse.html

    RépondreSupprimer