![]() |
![]() |
![]() |
|
Leds programmables WS2812 |
|
Maj : 23/06/09
|
Cette page sans prétention n’est là que pour faire découvrir ce composant intéressant à ceux qui sont passés à côté… Il y a beaucoup d’informations sur le Net.
Une WS2812 comporte 3 leds RVB (Red, Green Blue) indépendantes. Chaque couleur est réglable de 0 (éteinte) à 255 (pleine puissance) et la luminosité globale de l’ensemble se règle de 10 (minimum) à 255.
L’astuce est que ces modules ne sont commandés que par un seul fil série et sont cascabables.
La première led a l’adresse 0, la suivante 1, et la dernière d’un panneau 8x32 = 255.
Vous pouvez chaîner autant de panneaux que vos voulez. Un panneau 8*32 revient à 16€ commandé en Chine, c’est un très bon rapport qualité/prix pour ces produits très performants.
Il n'y a pas que les grands panneaux qui présentent de l'intérêt. Ces leds sont disponibles à l’unité, ce qui est très pratique sur une carte de développement pour remplacer les anciennes leds.
Elles existent aussi en bandes de 8 leds toutes montées pour faciliter la soudure.
Il existe deux versions, la WS2812 en 6 pattes, avec séparation des alimentations control et supply, et la WS2812b en 4 pattes que je privilégie pour mes montages.
Les nouvelles générations des excellents ESP32 -S3-DevkitC-1 comprennent une WS2812 en remplacement de la simple led monochrome en G13.Cela m'a donné une nouvelle idée, sur mes anciennes cartes de développement Arduino, j’intégrais toujours cinq leds simples (les 5 couleurs disponibles) pour visualiser les états du programme. Il devient alors possible d’afficher n’importe quelle couleur et intensité sur quelques WS2812 en n’utilisant qu’un seul GPIO.
Dans un premier temps j’ai testé sur une barrette de 8 WS2812, toutes sortes d’animations, mais cela devenait un arbre de Noël un peu ridicule sur une carte de développement.
Le délire calmé, sur mes nouvelles cartes les anciennes cinq leds discrètes sont remplacées par trois WS2812 en 3.3 V, qui offrent raisonnablement plus de choix de séquences en prenant moins de place.
C'est joli, mais si une simple éteinte ne consomme rien, une WS2812 qui possède évidement une électronique interne consomme 1.6 mA éteinte sous 3.3 V et plus de 10 mA allumée, alors qu’une petite led simple se contente de 0.5 mA ; il faudra donc oublier les WS2812 si l’on recherche le « low power »… Voir les détails ici : Consommation leds CMS
Le temps de remplissage d’un panneau 8*32 n’est que de 8mS, c’est très rapide et vous permet de faire des animations style dessin animés (modestes !). |
![]() |
Après avoir commandé mon premier panneau 8*32 , j’ai lu dans la documentation chinoise que la consommation était de 16 A en 5 V !
’avais rien d’aussi puissant et j’ai commandé une alim de 30A. J’ai commencé mes essais, mais surprise, l’ampèremètre ne décollait pas…
Pour le développement, j’ai considérablement réduit la luminosité » (255 -> 10) et baissé la tension (5V ->2.7V) car le panneau est trop éblouissant.
Les mesures réelles ont donné :
Toutes leds allumées (blanc), Brightness 5: // 316 mA at 5V // 69 mA at 2.7 V.
Vous pouvez dont n’alimenter que par une vieille 18650 ou un petit chargeur USB de téléphone…
Attention aux alimentations !
Certains des petits programmes de tests allument toutes les leds du panneau. Avec <brightness = 255>
la consommation peut grimper à 2.5 A sous 5V et 1.5 A sous 3.3V, il ne faut pas prendre la même alimentation sous peine de planter l’Arduino.
Avec le blanc à fond,
cela devient un puissant projecteur consommant 5 A en 5 V, mais il est peu probable que le panneau sera utilisé ainsi. C’est toutefois bien loin des 16A du document absurde chinois.
Bande de 8 leds
Particularités du kit en bande de 8 leds :
1) Il existe tout monté ce qui évite les soudures délicates.
2)
Chaque VDD sur les WS2812 est découplé individuellement à la masse par une petite 0.2µF, soit une capacité totale entre Vdd et Gnd de 1.6 µF.
Consommation individuelle et perception lumineuse : Alimentation en 3.3 V
Pour une couleur donnée, en envoyant une rampe de 0 à 255 et en enregistrant le résultat sur Excel, la consommation est rigoureusement proportionnelle à la valeur de commande (en retranchant la consommation tout éteint de 2.8 mA).
Il suffit de connaitre le courant pour un niveau de 255, pour en déduire les valeurs intermédiaires.
Dans la classe jointe une table donne les valeurs pour chaque couleur en essayant d’équilibrer au mieux avec trois valeurs : luminosité maximum, moyenne, à peine visible.
Ces choix sont difficiles, chaque l’œil perçoit différemment l’intensité de chaque couleur pour un courant identique, de plus la sensation est logarithmique. Pour les très faibles valeurs, la progression de luminosité est très perceptible mais au-delà de quelques unités, on ne fait plus la différence en incrémentant de manière linéaire. Il y a déjà un gros écart entre 2 et 3.
Voici les résultats pour une seule WS2812 sous 3.3 V (en alimentant sous 5V, la consommation double). Interprétation de ces résultats :
|
|
L’alimentation étant vue, reste le hardware. J’ai utilisé un ESP32, GPIO 17, comme pour le Nextion.
La documentation indique qu’il est préférable d’utiliser un « level switcher, » pour passer la commande de 3.3 V à 5 V de manière fiable en exploitation. En pratique, c’est inutile, le branchement direct convient.
Il existe deux types de leds :
W2812b avec masse, signal de commande et Vcc commun.
WS2812 pour laquelle un Vcc est dédié à la logique et un autre fil séparé fournit la puissance aux leds, ce qui est utile pour de très grands panneaux ou les appels de courants pourraient planter le microcontrôleur s’il fournit l’alimentation.
L’alimentation étant vue, reste le rendu des couleurs. Avec brightness un très bas, les couleurs s’altèrent, les trois diodes réagissant différemment à très faible courant.
La colorimétrie comparée avec une charte RGB de référence (Pantone) n’est pas du tout cellle attendue.
Dans cette page les couleurs sont définies pour une tension de leds de 3.3V. En baissant la tension toutes les couleurs glissent vers le rouge et sont incontrôlables.
La luminosité
La sensibilité de l’œil est très grande aux faibles luminosités mais décroît logarithmiquement quand la stimulation augmente (loi de Weber) c’est pour cela que l’on détecte pas les variations de niveau à forte luminosité alors qu’elles sont bien perceptibles avec un capteur électronique.
J’ai cherché au départ à établir des seuils pour que l’œil ressente un passage d’un palier à l’autre, comme pour les autres sensations physiologiques, un doublement représentant 3 dB.
En testant :
uint8_t tabPump[]= {0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
Cela ne fonctionne pas, le courant augmente bien, mais pas la sensation, les luminosités sont trop proches pour qu’un écart de luminosité soit clairement perceptible.
La table physiologique optimale retenue est la suivante : uint8_t tabPump[]= {0, 0x01, 0x10, 0xFF};
Elle définit les paliers que perçoit l’œil : éteint -> à peine visible -> moyen -> pleine luminosité.
Il n’y a donc pas plus de 3 paliers bien discernables (plus le noir) possibles.
La colorimétrie
Le mélange des couleurs pose un nouveau problème.
Les couleurs fondamentales RED / GREEN / BLUE (plus WHITE avec les trois), fonctionnent bien.
Les couleurs intermédiaires sont :
RED + GREEN -> YELLOW la couleur Pantone RGB devrait être (255,255,0) ou (#FFFF00) mais le rendu tire trop sur le vert.
GREEN + BLUE -> CYAN la couleur Pantone RGB devrait être (0, 174, 239) ou ( #00AEEF) mais le pas réduit ne le permet pas.
BLUE + RED -> MAGENTA la couleur Pantone RGB devrait être (255,0,255) ou (#FF00FF), mais le bleu est trop faible
Mais si le mélange entre les couleurs fondamentales se fait à des niveaux différents, la couleur secondaire générée a des teintes bizarres qu’il vaut mieux éviter !
Une lecture superficielle du document officiel laisserait croire qu'avec 256 niveaux pour chaque couleur : 256*256*256 couleurs* 256 luminosités soit 2 puissance (16*4)…
2 puissance 64 = 1.8 suivi de 19 zéros soit 18 milliards de milliards de variantes !
Cela n’a aucun sens à cause des paliers évoqués au-dessus, en réalité c’est 3 états par couleurs soit un total combiné de 3 puissance 3 (est à dire 27 combinaisons que l’oeil sait séparer, et sur les 27 des intermédiaires douteux que l’on évitera. Cela reste un choix formidable avec lequel on pourra composer toutes sortes d’animations.
En mélangeant deux couleurs fondamentales la couleur complémentaire utilisant deux leds simultanément est beaucoup trop brillante, la table des couleurs dans la classe compense cela au mieux.
La led blueue est la moins lumineuse pour la réponse de notre oeuil. J’ai laissé pour le blanc (3 leds) la brillance maximum. N’espérez pas créer un nuancier Pantone avec le panneau de leds.
Détermination des paliers perceptibles
L’utilisation d’une cellule (comme le capteur solaire "SFE_TSL2561" utilisé dans le programme de domotique Domus), pour visualiser les écarts de luminosité par paliers de courant ne donne rien.
Il y a bien une progression très sensible du résultat de la mesure, mais l’œil ne perçoit pas ces petits écarts. Les tests sont effectués à 3.3 V, à 5 V les niveaux maximums sont trop éblouissants.
On garde toujours : <#define MAXBRIGHTNESS 255> car sinon les couleurs sont très altérées en réduisant les niveaux.
Le programme <WS2812_256_steps> illustre ces paliers avec différents pas :
uint8_t steps[] ={0,1,30,255};
//uint8_t steps[] ={0,1,8,50,255};
//uint8_t steps[] ={0,1,4,8,16,32,64,128,255};
//uint8_t steps[] ={0,1,2,3,4,6,8,16,32,64,128,255};
//uint8_t steps[] ={0,1,2,3,4,6,8,11,16,23,32,45,64,90,127,180,255};
Seule la première liste à 4 paliers montre des sensations optiques bien différentiables, pour les autres les écarts sont trop faibles.
Ce sont ces valeurs qui sont utilisées pour définit les couleurs à niveaux <limite visibilité> <moyen> <maximum>
Dans les définitions de la classe incluse, ces niveaux sont légèrement manipulés pour les couleurs secondaires afin de donner les meilleurs résultats.
Le programme <WS2812_256_all_colors> montre les résultats des 7 couleurs et leurs trois nuances optimisées..
J’ai choisi sur Github la très bonne bibliothèque Adafruit_NeoPixel. On peut tout faire avec un minimum de commandes simplistes : begin, clear, setBrightness, show et surtout : setPixelColor(position, r,g,b)
Pour m’amuser, j’ai voulu tout refaire à la main en C++, sans regarder le travail des autres.
J’ai simplement récupéré un font tout fait pour afficher des textes et programmé quelques animations partant de dessins BMP. Comme je ne suis pas l'auteur de cette table des caractères, je ne l'ai pas incorporée dans ma classe, elle est simplement dans <rolling_fonts.ino>. Petit problème, les fonts sont en 5*7 (largeur variable suivant le caractère), et donc la dernière ligne reste vide.
N’hésitez pas à m’envoyer vos remarques sur le fond (parties à compléter ou modifier), et sur la forme (fautes de frappe…).
Que peut-on faire de ce panneau ?
S’amuser à le programmer pour découvrir ces leds extraordinaires, mais il est difficile de trouver une utilisation pratique…
La résolution est trop faible et limite les applications. Sur un panneau 8*32, on ne peut afficher que 4 ou 5 caractères, c’est insuffisant pour être exploitable. Il faudrait coupler plusieurs panneaux en horizontal et vertical pour arriver à un résultat, genre enseigne animée de pharmacie (bien qu’elles n’utilisent que le vert).
Installer un bandeau de texte derrière la lunette arrière de sa voiture (les panneaux ne sont pas étanches) pour injurier ceux qui collent de trop près, n’est pas la meilleure idée…
Annexe : Contenu du Pack_WS2812
Il existe un pack d’utilitaires ADAFRUIT WS2812FX considérablement plus évolué et complexe que le mien, mais je cherchais à faire quelque chose de très simple que puisse comprendre un débutant qui se lance.
Classe de base Fichiers ino |
Mise à jour 2023 04 28 |