Anthias
mail

nextion

Leds programmables WS2812

Nextion


Présentation des leds
Particularités techniques
Adressage
Consommations
Hardware
Firmware
Nouvelle idée
Conclusion

Maj : 25/02/23

Abstract :
WS2812 are fantastics programable diodes assembled in ribbons or panels. You can diplay very bright texte and pictures on panels visible at long distance (enseigns, plates at the back of the car,…)

Résumé :
Les WS2812 sont de fantastiques diodes programmables assemblées en rubans ou panneaux. Vous pouvez afficher du texte et des images très lumineux sur des panneaux visibles à longue distance (enseignes, plaques à l'arrière de la voiture,…)

nextion  Présentation des leds

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.

 Haut de page

nextion Particularités techniques

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 !).
Si vous devez assembler un grand nombre de panneaux pour des affichages muraux, il peut plus intéressant de ne pas les chaîner  mais d’utiliser un port GPIO par panneau pour ne pas réduire la vitesse d'affichage.

Nextion

Haut de page

nextion  Adressage

Attention au sens !
Pour notre panneau 8*32, considérons que la position 0 est en haut à gauche.

Le balayage est en zigzags, les colonnes paires descendent, les colonnes impaires montent.

0 Haut Gauche 15 16 31 255 Haut droite
1 14 17 30 254
.. .. .. ..  
6 9 24 27 ..
7 8 25 26 ..
A

Ce zigzag est gênant quand on veut afficher des fonts ou transposer des images bmp car on s’attend à ce que toutes les colonnes descendent ainsi :

0 Haut Gauche 8 16 26 ..
1 9 17 27 ..
.. .. .. ..  
6 14 24 30 254
7 15 25 31 .255 Bas droite
v
Ma petite routine résout ce problème qui est montré dans "WS2812_fonts_....ino" (fichiers joints).

 

 

 

int reverse (int pos)  {
if ((pos/8)%2==0)
     return pos ;
else
     return ((pos+7)-2*(pos%8)) ;   }

Haut de page

nextion  Consommations

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 !
Je n’avais rien d’aussi puissant et j’ai commandé une alim de 30A (à 17 € !). 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.

Haut de page

nextion  Hardware

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.
Pour le développement, surtout en travaillant en tension réduite, 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.
Mes cartes de développement acceptent les deux options, car elle peuvent commander les leds de contrôle de la carte et éventuellement de grands panneaux externes.

Haut de page

nextion  Luminosité et colorimètrie

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

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

Le petit programme <all_colors.ino> est important car il montre sur un panneau 8*32 les 7 couleurs et leurs trois nuances optimisées. La led blueue est la moins lumineuse pour la réponse de notre oeuil.
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.
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.

Haut de page

nextion  Firmware

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.

Haut de page

nextion  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.
J’ai eu une révélation tardive en regardant la dernière version de l’ESP32 qui remplaçait la basique led pin 13 par une WS2812.
C’est une excellente idée, car il devient possible d’afficher n’importe quelle couleur et intensité sur quelques leds 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.

Haut de page

nextion  Conclusion

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…

Haut de page

nextion  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
 Classe <C_WS2812> table des couleurs et des nuances

Fichiers ino
 all_colors : montre sur un panneau 8*32 les couleurs identifiables et leurs trois nuances optimisées.
 rolling_fonts : fait défiler des textes.
 sweep_256 : montre les deux adressages des pixels
 increment_colors : fait varier chaque couleur de 0 à 255,
 bouncing_arrow : Fait rebondir une flèche
 french_flag : tout est dit
 french_flag_moving : Plus subtil, avec du vent !

L’ensemble des outils,
est disponible ici dans le <Pack_WS2812> :
zip

Mise à jour 28 02 2023

Haut de page

© Christian Couderc 1999-2023     Toute reproduction interdite sans mon autorisation


* Page vue   5999   fois       IP : 18.206.92.240

 Haut de page         Dernière retouche le 28 Février 2023 à 08 h         Retour page précédente

   Collector