Afficheurs à LED
Une réalisation électronique requiert souvent quelques LED à piloter, et aussi l'affichage de quelques données.
J'aime les petits afficheurs LED à l'ancienne, rétro, des "7 segments" mais ce n'est pas facile à utiliser avec un microcontrôleur car cela nécessite pas mal de fils pour les piloter. Jusqu'à l'avènement des LEDs "neopixel".
Nota : vous ne trouverez pas ici un détail complet de ce qui existe en afficheurs LED, c'est à présent une tâche incommensurable. Uniquement les solutions que j'ai retenues, car je les trouve fort commodes. Surtout que j'ai dû en inventer certaines...
Et vous trouverez de nombreux sites qui expliquent comment se servir des neopixels. Mais je n'en ai pas trouvé qui propose la solution pour les 7 segments. Malgré que ce soit assez évident, et d'ailleurs, je ne comprends pas pourquoi il n'existe pas encore d'offre intégrée. Peut-être après que j'aurai publié la présente page...
Je vais commencer avec les LED simples et les afficheurs 7 segments, que l'on pourra piloter entièrement avec un seul fil. Sur la page suivante, on verra les matrices de LED, en particulier les circuits à l'ancienne dont certains sont encore disponibles mais c'est un peu compliqué pour s'y retrouver.
Neopixel
Dans le temps, il fallait un fil par LED pour pouvoir l'allumer et l'éteindre individuellement, et c'est encore vrai. Du coup, nos guirlandes électriques de Noël sont restées très simples, car il n'était pas question de faire un toron de 100 fils pour piloter 100 LED individuellement. Ça se réduit toujours à 3 ou 4 fils, avec des combinaisons forcément assez simples, on voit bien les LED qui s'allument en même temps, même si elles sont réparties le long du fil et que l'on a rusé en mettant deux LEDs tête-bêche pour utiliser le sens du courant.
Ici, on a 3 groupes, soit 4 fils.
Et dans un montage électronique, on n'y échappe pas :
Et en plus, il faut ajouter une résistance sur chaque LED. Pénible.
La solution était pourtant assez simple, mais il fallait ajouter une puce de pilotage, ce qui est coûteux.
Au départ, un neopixel est un groupe de 3 LEDs RVB que l'on peut piloter simplement avec un seul fil qui sert d'interface série, et ils sont chaînables.
On constate qu'une puce permet de piloter chaque LED. Il s'agit d'une puce fabriquée par WorldSemi, et qui a fait des petits, il suffit de parcourir leur site pour voir l'usage qui en a été fait.
Vous avez pu constater sur le site de WorldSemi qu'il s'agit pratiquement toujours de 3 ou 4 LEDs (RVB+blanc) montées avec la puce de pilotage.
Parmi les LEDs neopixels courantes, il est probable que vous utiliserez :
- WS2812E-V5 : sa taille fait 5x5 mm, ce qui la rend aisément manipulable par l'amateur. Et elle admet un courant assez fort pour présenter une luminosité intéressante.
Mais elle est également disponible sous une forme assez minuscule :
- WS2812E-1313 : sa taille fait 1.3x1.3 mm
Et elle devient alors assez difficile à manipuler. Mais utile dans certains cas.
Il est probable que lorsque vous lirez ces lignes, l'offre aura évolué, mais bon, la base est là, et c'est déjà la source de pas mal de produits Adafruit, ainsi que toutes ces bandes de LED lumineuses richement colorées :
WorldSemi a eu le bon goût de fournir la puce seule, sans LED, ce qui va nous permettre de piloter nos propres LEDs ! Mais avant cela, voyons les problèmes de courant et la tête du protocole.
WorldSemi a suscité de la concurrence, et on trouve à présent d'autres puces qui travaillent de la même manière, avec éventuellement des performances supérieures en débit, puissance et tension. Par exemple la SK6812 d'OPSCO Electronics. Ou les puces de Titan Micro Electronics.
Attention au courant
La consommation électrique réserve des surprises si l'on utilise des très longues bandes de neopixels. Ce fut le cas pour la corniche de mon bureau, où j'ai voulu faire un éclairage indirect de ouf : je peux programmer chacune des 319 LEDs individuellement.
Pour commencer, il faut savoir combien de courant va consommer un pixel, et cette valeur est variable suivant la tension d'alimentation (ce qui est normal, c'est la puissance électrique qui est plus constante). Sous 5 volts d'alimentation, une valeur habituelle, il faut prévoir entre 30 et 60 mA. On parle alors de 3 à 6 A pour 100 LEDs, et presque une vingtaine d'ampères pour ma corniche, mazette !
Personnellement, j'avais choisi une alimentation délivrant 30 A pour être sûr de ne pas mettre le feu en ayant de la marge. Les vendeurs de bandes de LED le savent bien et vendent des alimentations de belle taille.
Sauf qu'il faut distribuer cette puissance sous 5 volts. C'est là qu'il faut connaitre la résistivité du cuivre pour connaître la chute de tension qui va se produire, et c'est loin d'être négligeable, voici ce qui se passe en réalité :
C'est exactement le même problème que pour la distribution d'électricité, EDF connait bien ça.
Résistance du cuivre
J'ai déjà eu un problème violent simplement pour raccorder ma corniche avec mon alimentation électrique. J'avais environ 50 centimètres à raccorder, et à mon premier essai, j'ai observé une chute de tension de 4.98 V à 3.47 V, autant dire que ça marchait très mal.
La connexion paraissant courte, et j'avais dû utiliser un classique 0,5 mm² de diamètre, déjà assez gros quand on fait de l'électronique.
| Section mm² | Diamètre mm | Résistance mΩ/m |
|---|---|---|
| 0,10 | 0,0078 | 2170 |
| 0,25 | 0,049 | 348 |
| 0,36 | 0,10 | 193 |
| 0,19 | 0,50 | 87,0 |
| 0,50 | 0,79 | 35,1 |
| 0,75 | 0,97 | 23,4 |
| 1,0 | 1,12 | 17,6 |
| 1,5 | 1,38 | 11,7 |
| 2,5 | 1,78 | 7,02 |
| 4,0 | 2,56 | 4,39 |
| 6,0 | 2,76 | 2,92 |
| 10 | 3,56 | 1,75 |
| 16 | 4,51 | 1,10 |
| 25 | 5,64 | 0,70 |
Pour info, les câbles électriques de nos maisons sont souvent en 10 mm² pour du 45 A (et 22 mètres maximum). Et du 16 mm² au niveau du compteur.
Résultat pratique : je suis passé à un fil en cuivre de 1.5 mm, Et j'ai dû ajouter des fils supplémentaires le long de ma bande de pixels.
Solutions
Pas de miracle à attendre, les solutions sont bien connues :
- Réduire la résistance électrique : avec le cuivre, on est déjà au mieux en pratique, oubliez l'argent—le métal— et son prix, ainsi que les supraconducteurs et leur température critique. Il ne reste que la section du cuivre que l'on peut augmenter, cela revient à mettre des câbles en parallèle.
- Augmenter la tension, c'est pour ça qu'EDF distribue le courant en 220 V, mais utilise de la très haute tension pour distribuer l'électricité pour des puissances nettement plus considérable. Faut dire que l'on gagne comme le carré de la tension, ça n'est pas rien.
C'est pour ça que l'on trouve des neopixels qui acceptent une tension de 12 volts au lieu de 5 V. On diminue alors le courant d'un facteur (12/5)² soit 5,7. Et un facteur 23 si on passe en 24 V.
N'oubliez pas de placer une résistance de quelques centaines d'ohms avant la première entrée des données, afin de protéger la première puce des surtensions à l'allumage, cette fois c'est le contraire...
Protocole
Le protocole des puces WS18xx est simple, un seul fil, WorldSemi a soigneusement évité les deux fils classiques {horloge, données}. C'est donc forcément un protocole série, en l'occurrence du NRZ (Non Return to Zero), mâtiné d'un reset.
La vitesse est de 800 kHz, autrement dit un bit sur 1250 ns, mais en pratique les timings sont très lâches, c'est plutôt une vitesse minimale sur laquelle on peut compter pour envoyer un bit.
Pour un pixel RVB, nous avons 3 LEDs, chacune codée en intensité sur 8 bits, soit 256 niveaux de luminosité. Un neopixel requiert donc 24 bits pour les 3 LEDs, ou 32 bits lorsqu'il s'agit d'une version RVBW où une quatrième LED, blanche, est ajoutée. Donc faites gaffe si vous mélangez les deux.
Tant que vous envoyez des bits sur la ligne, ceux-ci sont transmis dans la chaine de neopixels. La première puce reçoit les 24 bits et ne transmet rien. Si d'autres bits arrivent, alors elle envoie les premiers bits reçus à la suivante et stocke les nouveaux bits. Et ainsi de suite. Pendant ce temps-là, les neopixels continuent d'afficher la couleur du coup précédent.
le second sera vert (RVB 0,240,0)
Il faut d'abord envoyer le code vert (pour le dernier pixel), puis le rouge (celui d'avant)
Plus de 50 μs : exécution de la couleur (reset)
Si vous arrêtez d'envoyer des bits, autrement dit si vous mettez la ligne à zéro pendant au moins 50 μs (mais ce temps n'est pas vraiment critique en réalité), alors les puces chargent les 24 bits dans leur système et les affichent. Elles attendent alors une nouvelle série de bits. C'est appelé "reset" dans la datasheet, mais ce n'est pas une remise à zéro à proprement parler.
Ne confondez pas les 800 kHz de vitesse de transmission et la vitesse de rafraichissement du PWM, 2 kHz ou autre. La puce de contrôle impose un courant, par exemple 12 mA, pendant 25% du temps si le code vaut 64 (ou 50% du temps si c'est 128, etc.) et ceci avec un cycle de 2 kHz, 2000 fois par seconde.
C'est donc tout con comme protocole, on peut difficilement faire plus simple. Il est d'ailleurs assez facile à programmer sur un microcontrôleur vu la faible vitesse, un bit sur une microseconde, ce n'est pas la mort. Souvent on propose de détourner le protocole SPI pour générer ces signaux.
Une ruse classique pour programmer ce codage NRZ est l'utilisation de la sortie SPI où on enverra toujours les mêmes deux octets, un pour programmer un "bit 0", et un autre pour le "bit 1". Ces octets n'ont rien à voir avec les valeurs d'intensité des LED, c'est juste une astuce pour créer un signal de la bonne taille en utilisant la machinerie déjà disponible pour l'interface SPI, qui aura l'avantage d'ignorer les interruptions du système une fois lancée.
Vérifiez pour votre microcontrôleur préféré, mais normalement, avec une horloge à 16 MHz, un bit sur la sortie SPI dure 125 ns.
Pour le "bit 1", dites 111111000, et ça reproduira (à peu près) le timing voulu.
Il suffit de deux cas pour programmer les temps, puis il suffit d'exécuter le bon suivant la valeur du bit de l'octet contenant l'intensité de la LED.
Taille maximale d'une chaine
Il n'existe pas de taille maximale de chaine, mais plutôt une limitation si on veut une animation fluide.
Pour donner une idée, l'œil risque de percevoir un scintillement si on ne rafraichit pas plus vite qu'une vingtaine de fois par seconde. Au cinéma et à la télé, on veut du 24 images par seconde, ou du 50 Hz voire du 110 Hz, valeur bien publicitaire.
En prenant un taux de rafraichissement à 20 fois par seconde, soit une durée de 50 ms, vous pourrez envoyer 40 000 bits à 800 kHz, soit 1600 neopixels RGB ou 1250 pixels RGBW. Ça devrait suffire pour beaucoup d'applications, mais pas pour faire un écran plat de télévision... Il faudra paralléliser les lignes.
Une autre manière de dire la même chose : il faut (environ) 40 μs pour charger un neopixel RGBW, soit 4 ms pour une centaine.
7 segments
Comme WorldSemi vend également la puce de pilotage seule, sans LED, on peut alors s'en servir pour piloter nos propres LEDs, et en particulier celles qui nous ennuient furieusement, les 7 segments et autres configurations similaires, car non seulement il faut une sortie de notre microcontrôleur pour chaque LED, mais en plus il faut gérer ces sorties pour régler l'intensité, souvent en PWM.
On remplace tout ça par la puce WS2814F, en boitier 8 pattes SOP. Vous trouverez la datasheet sur Internet, en chinois. Mais elle est assez évidente et assez souple (on peut l'utiliser à 24 volts).
On va donc pouvoir se servir de deux puces pour piloter les 8 LEDs d'un afficheur 7 segments. Et quatre puces pour un double 7 segments, à condition que les LEDs ne soient pas mises en matrice. Il faut impérativement qu'elles soient en cathode commune pour que ça marche.
Un afficheur 14 segments aura besoin de 4 puces, un afficheur 16 segments réclamera 5 puces à cause du point décimal.
😎 La cerise sur le gâteau, c'est que l'on peut choisir l'intensité lumineuse de chaque LED.
Sauf que WorldSemi a au moins un concurrent, Titan Micro Electronics, qui propose aussi des puces, par exemple la TM1812 avec 12 sorties ! On retrouvera les puces dans les single line series.
Qu'on se le dise, fournisseurs d'afficheurs LED 7 segments et affiliés, proposez vos produits avec une interface série aussi simple, ça ne peut rencontrer que du succès, voire devenir le standard du futur.
Uniquement 4 broches de connexion, simplicité d'utilisation, accès individuel à chaque LED en intensité... Et vous pouvez faire ça aussi pour les matrices de LEDs, en abandonnant le matriçage électrique et en plaçant les LEDs en série.
Ne me remerciez pas pour l'idée, vous auriez pu le faire il y a bien longtemps. Vous êtes trop nazes...
Mais pas toujours
Les afficheurs où les LEDs sont matricées, comme un afficheur d'horloge 4x7 segments où un chiffre doit être sélectionné, ne pourront pas bénéficier de cette structure.
C'est évidemment aussi le cas des matrices de LED 5x7 ou 8x8.
La page suivante examine les solutions d'affichage à matrice de LEDs, proposées par le passé, avec une interface souvent parallèle, mais aussi série.