Bonjour.
On a déjà parlé de LED et d’affichage au moyen d’un registre à décalage.
On va voir aujourd’hui des circuits un peu plus
complexes, aussi pour afficher en 2 dimensions et en couleur.
Mais commençons par un petit peu de physiologie.
Notre œil n’est pas du tout linéaire, alors que tous les capteurs de lumière que
l’on va utiliser, et les émetteurs de lumière, sont linéaires.
Donc typiquement, une diode lumineuse, vous
pouvez la programmer avec des « analogWrite
», pour faire, ici, un petit
programme dans lequel vous augmentez l’intensité, progressivement.
Toutes les 300 millisecondes, vous augmentez l’intensité de 32,
ce qui veut dire qu’en 8 étapes, vous aurez passé de 0 à
l’intensité maximum. En exécutant ce programme, vous
aurez l’impression que très vite, vous avez l’intensité maximum
de la LED, puisque notre vision n’est pas du tout linéaire.
Donc, ce que je propose, c’est de passer par une table de conversion,
qui est logarithmique puisque notre œil est logarithmique.
Le PWM pour les valeurs de 1 jusqu’à
7, puisque nous allons simplifier en faisant seulement 7 pas.
Le PWM pour 1, il sera loin d’être le dixième, le
huitième, qui serait, 32, on va mettre la valeur 10, etc...
Alors, on peut naturellement, c’est une courbe
logarithmique, on peut sortir des virgules flottantes.
Appliquer les facilités de calcul de
la librairie arithmétique d'Arduino, ça serait absurde.
Vous définissez ces points dans une table, et maintenant,
au lieu de faire « analogWrite » avec la valeur multipliée par 32,
vous allez chercher, dans la table, la valeur à afficher.
On va comparer ces 2 solutions, en faisant une petite expérience
et en câblant 2 LED côte à côte, qui vont exécuter ces 2 programmes.
Vous voyez sur la vidéo les 8 pas qui avancent toutes les 300 millisecondes.
Ensuite, le rythme s’accélère et pour finir, vous avez le clignotement dans le
fond, avec augmentation d’intensité, diminution d’intensité,
et c’est ça qu’il faut juger maintenant.
Est-ce que cela vaut la peine de passer par une
table pour avoir une meilleure impression subjective de cette linéarité d’affichage?
Je reviens encore sur cette image,
puisque si vous êtes observateurs, vous avez vu que je l’ai, les valeurs j’ai mis,
ici, ne sont pas celles que j’avais prévu dans mon calcul initial.
Effectivement, j’ai diminué les valeurs, j’ai
déplacé la courbe, plus proche, ici, de
la barre verticale, pour avoir une
meilleure sensation quand les intensités sont faibles.
Bien.
Alors maintenant, revenons au registre à décalage, que vous avez déjà vu.
On veut afficher 8 LED, que
l’on va câbler, de préférence comme ceci. Vous avez besoin d’un
registre à décalage et d’un registre parallèle, qui va
stocker l’information pour éviter que ça change sur
les LED pendant le décalage, ce qui,
dans certaines solutions simplifiées, peut être acceptable,
mais la différence de prix entre les
2 circuits ne justifie certainement pas ces simplifications.
Alors Arduino vous dit, c’est très facile, vous devez activer le signal « load ».
Et ensuite, pour transférer 8 bits, vous avez une
primitive qui s’appelle « shiftOut », vous devez donner
le numéro de la « pin » « data », le numéro de la « pin » « clock », un 0 qui
veut dire que vous allez décaler à droite, et puis le motif que
vous allez prendre dans un registre, et puis décaler
progressivement dans le registre à décalage.
Alors, vous pouvez écrire cette routine directement en disant, « digitalWrite
», le « load ». Et ensuite, on va faire 8 fois le test du
motif que l’on avait là, puisqu’on prend dans un registre à décalage.
On va tester le bit de poids faible, motif R 1,
et puis on va le copier sur le « data ».
Si ce bit vaut 0, et bien, on va mettre un 0.
Et puis, maintenant, on va préparer le coup suivant en décalant
ce registre, écrire le « clock », nous donne une impulsion
sur l’horloge, C k égale 1, C k égale 0, répéter
8 fois et terminer le cycle avec un « digitalWrite ».
Voilà, alors quel est l’avantage?
Apparemment, pas très net. Si vous
voulez faire du C, alors, là, je vous
donne même le programme complet pour faire du C.
Donc, on oublie les « digitalWrite » et autres.
On travaille avec le port et les bits, les numéros de bits sur ces ports.
On déclare très clairement « Led On », « Led Off », « Clock On », « Clock Off ».
Et, on fait un « setup »
avec les bits qui vont intervenir en sortie.
On prépare un motif pour l’envoyer sur les LED.
Et puis maintenant, on désactive le « load »
pour que l’information ne traverse pas pendant le décalage.
Et puis pour, de 0 à 8, on sort le motif comme tout à l’heure, avec le même masque.
On décale,
et puis on donne les coups d’horloge donc on a,
par rapport à l’exemple précédent, on a simplement, changé les notations.
Mais, on est ici en C.
Est-ce qu'il y a un autre avantage à faire du C?
Et bien, regardons la place utilisée en mémoire : 1000, 1000,
708. J’utilise le compilateur Arduino qui,
au minimum, va placer 600 bytes pour mettre
en route le « setup » et d’autres facilités.
Donc, vous voyez que du point de vue taille
mémoire, c’est significativement plus court, on est proche de l’assembleur.
Quand vous écrivez « shiftOut, data, clock » etc...,
au moment de l’exécution, la procédure doit aller regarder:
là, ça c’est le numéro 5. Où est-ce qu’il est?
Sur quel port? Dans quel bit?
Etc… Le 0, vous allez avoir un choix pour dire
soit je décale à droite, soit je décale à gauche.
Et, il n’y a guère que le motif qui est transféré tel quel.
Alors, maintenant, si on regarde le temps d’exécution, et bien
là aussi, la durée est de 100 microsecondes, diminue à
18 microsecondes, et même moins, en choisissant d’autres instructions plus
proches de l’assembleur, ce qui peut être quand même significatif.
Dernier avantage, si maintenant on voulait décaler 16
bits et pas 8, ici vous devez faire
un micmac avec le motif 16 bits pour
prendre 8 bits, les envoyer, prendre la deuxième
moitié de 8 bits, les envoyer.
Ici, vous n’avez qu’à changer le nombre de décalages.
Là aussi naturellement, vous pouvez mettre
16, vous pouvez mettre 32, plus évidemment,
il n’y a plus de type de données qui vous facilite la vie.
Bien, voilà pour cette petite révision. Encore un élément, qui
peut vous induire en erreur, des fois. Quand vous avez un registre
parallèle, il peut être déchargé par une
transition et c’est comme un registre à décalage, en fait.
Et puis, il peut aussi être chargé statiquement, et on parle de
registre transparent tant que "load" est à 1, l’information traverse.
Donc si vous changez l’information,
elle va tout de suite passer de l’autre côté, alors qu’ici, c’est
seulement à un instant de l’horloge que la copie va se faire.
Alors, en plus de ça, évidemment, les
fabricants, des fois, ils décident de travailler avec
un petit rond, ici, c’est pas au flanc montant, mais ce sera au flanc descendant.
Ici, il peut aussi y avoir un petit rond et
puis ils peuvent décider d’appeler ça « Strobe » et
de pas très bien savoir la différence entre « load », transparent, etc...
Ok, donc il faut s’adapter quand on reçoit
un circuit comme, par exemple, ce circuit Toshiba, mais
il y a beaucoup de copies avec des petites différences, en 8 bits ou en 16 bits.
Celui-ci à 16 bits.
Ce que ces circuits ont d’intéressant, c’est que,
en sortie, vous avez des sources de courant.
Donc, ces transistors-là, avec une électronique adaptée, vous permettent
de mettre une seule résistance qui va définir le courant dans toutes les LED.
Donc, on gagnait dans le câblage, et si tout à
coup, vous décidez que ça serait bien d'avoir plus d'intensité,
et bien, vous n'avez qu'une résistance à changer,
ce qui pourrait encore se prévoir par logiciel.
Alors, dans le circuit, vous avez en plus
de ça une entrée enable qui autorise la sortie.
Ça, ça peut permettre de faire des, de
mettre des circuits en parallèle pour faire certaines astuces.
Vous avez, naturellement, le registre parallèle de sortie, avec un signal qui
s'appelle latch, qui s'appelle, ici, strobe et pour
savoir quel est l'effet de ce signal,
la seule solution c'est d'aller regarder le diagramme d'état.
Alors, pour le registre à décalage, vous avez clock et data.
Vous voyez que le data doit être stable au flanc montant de l'horloge,
et puis maintenant, vous voyez que le signal qu'ils appellent latch bar est
une impulsion positive à la fin du
chargement pour transférer l'information dans le registre.
Cette impulsion peut continuer jusqu'à ce que
vous renvoyez, recommenciez à envoyer des clock.
Alors avec ce circuit, et bien naturellement, vous faites très facilement
un affichage multiplexé, en commandant les lignes avec des
transistors, comme on l'a déjà vu, avec une résistance unique
pour tout ce panneau de LED, puisqu'on va sélectionner une ligne après l'autre.
Si vous voulez afficher quelque chose, et bien, vous
allez prendre le mode 16 bits, ici, l'envoyer dans
le registre en selectionnant la ligne du haut.
C'est bien d'avoir une correspondance entre le dessin et
puis la table, mais c'est tout à fait arbitraire.
On pourrait très bien dire, et bien, ça, c'est
la première ligne qui correspond à ces diodes-là, sur
mon dessin qui correspondra peut-être aux diodes qui sont
en haut, il suffit de retourner de 180 degrés.
Le haut devient bas, donc, tout est, ce qui
est important, c'est de savoir exactement ce que l'on fait.
Et puis là, et bien, avec la procédure qu'on a vu tout à l'heure, efficace,
et bien, vous avez fait une, une procédure shift, et puis vous balayez ce tableau.
Donc, c'est trivial.
Alors maintenant, ce qui sera intéressant, c'est de faire un petit peu de couleur.
Vous avez des diodes
RGB, qui sont trois diodes sur le même boîtier,
éventuellement, dans un petit boîtier SMD de cinq millimètres de côté.
Et la question, c'est de savoir comment
câbler ces diodes sur des registres à décalage.
Il y a, pour le moment, pas d'autre solution
que de connecter les huit bits, soit en disant,
et bien, RGB RGB, je peux mettre deux diodes sur huit bits.
Si j'ai 16 bits, c'est à peine plus efficace.
Je vais avoir qu'une position qui est perdue puisque je peux mettre cinq
LED, cinq fois trois, ça fait 15. Je peux
les alterner comme ça, ou comme ça, du point de vue câblage,
et ça, c'est l'organisation physique. Alors maintenant, au niveau de la mémoire,
vous avez tout avantage à utiliser une représentation différente, en général.
Prendre, par exemple, en restant avec des modes 16 bits, pour un cube de cinq sur
cinq, et bien, prendre tous les rouges dans un mode, tous les verts
et les bleus dans d'autres modes, dans d'autres tableaux, en
fait, et ça va vous faciliter, dans le fond, le
dessin d'objets qui sont entièrement rouges, entièrement verts et qui peuvent
être superposés en envoyant d'abord l'information rouge, l'information vert.
Alors là, on est en tout ou rien.
On peut faire
du PWM assez efficace sur tous ces bits, il y a de très jolies solutions.
Mais, la technologie a résolu ce problème, il
y a beaucoup d'applications qui ont besoin de
diodes lumineuses et il y a beaucoup de
circuits qui ont été developpés dans ce but-là.
Vous avez tous vu la publicité pour ces
bandes lumineuses qui sont faites, en fait, en associant
des circuits intégrés avec une diode.
Parfois, il y a plusieurs diodes et puis ça, il faut une alimentation en 12 Volt.
Ici, et bien, ça pourrait être alimenté en
cinq Volt, et le circuit qui est à l'intérieur,
ici, est très intéressant, parce que, il est
formé du registre à décalage traditionnel, du registre parallèle.
Mais ici, c'est beaucoup plus
compliqué puisque vous avez les compteurs qui, comme dans un
timer, permettent de faire du PWM. Donc, les valeurs huit
bits que vous envoyez dans chaque élément de couleur sont
des valeurs que, qu'Arduino dit AnalogWrite, quelle
horreur, qui sont des valeurs proportionnelles entre
zéro et 256, puisqu'on a huit bits. Alors,
ces circuits intégrés peuvent être cascadés.
Vous rentrez la data, le clock, vous ressortez avec un data, un clock
qui est même amplifié, donc, vous pouvez faire des bandes très longues.
Et vous me direz, mais où se trouve le load?
On a besoin
d'un load, ici, pour charger le registre parallèle.
Et bien, c'est fait par une petite logique qui compte les 24 bits, et
puis, qui remarque que vous avez
arrêté d'envoyer des impulsions d'horloge pendant quelques
centaines de microsecondes, je crois, le temps est tout à fait court.
Donc évidemment,
quand vous êtes intéressé à rafraîchir, vous allez
envoyer les, des horloges à toute vitesse, le plus
rapidement possible, et puis, faire une pause de
100 millisecondes pour dire que la transmission est terminée.
À ce moment-là, au bout de 100 millisecondes, et bien, il va
y avoir chargement et vous pourrez
recommencer à envoyer d'autres valeurs PWM.
Donc,
contrairement à la solution précédente où il fallait
chaque fois recharger les registres pour modifier l'intensité,
ici, une fois que vous avez défini vos
couleurs dans la bande, et bien, c'est programmé.
Alors, ces bandes se vendent, naturellement,
avec une librairie, avec une petite
boîte et des boutons et, et vous avez rien appris du tout.
Mais c'est très facile
à programmer, et pour faire exactement ce que vous
voulez, et c'est, vous trouvez la documentation à différents endroits.
La représentation en mémoire, là, elle dépend de votre
application. Vous avez trois valeurs huit bits de PWM,
vous pouvez dire, et bien voilà, chaque pixel, puisque ça, c'est qu'une seule LED,
je la mets dans un registre de 32 bits,
tant pis pour les huit bits qui sont perdus.
Et puis maintenant, et bien, je peux, remplir mes tables pour afficher.
Je peux, dans cette table, qui sera transmise par une routine adéquate
vers l'affichage, et bien, je peux venir calculer des changements de couleur,
faire des modifications progressives ou faire des motifs, des chenillards, etc...
Et évidemment, une autre présentation, c'est de dire, mais je préfère
travailler avec les couleurs séparément, et puis j'ai des tables avec les
différentes couleurs, et au moment d'envoyer les 24 bits vers l'affichage,
et bien, je vais prendre huit bits pointés dans la table rouge,
huit bits correspondants dans la table verte, huit bits dans la table bleue.
Bien, maintenant, si on veut aller plus loin,
et bien, il faut qu'on travaille en deux dimensions.
Et pour ça, vous avez, tout un choix de circuits qui se développe.
La technologie permet de les réaliser à des coûts tout à fait raisonnables,
quelques dizaines d'euros. Ce n'est pas nécessairement la technologie
OLED, ça peut être des technologies affichage cristaux liquides.
Mais vous voyez que ce module qui a 96 sur 64
pixels, évidemment c'est plus petit que la même quantité
de diodes lumineuses, mais, ça permet de, d'afficher des textes,
d'afficher des graphismes et de s'entraîner à travailler
avec ce que vous avez, en fait, sur vos tablettes.
Ce sont uniquement des circuits simplement un petit peu plus
grands qui sont, maintenant, sur toutes les tablettes, téléphones et autres.
Le circuit qu'il y a derrière cet affichage, de l'autre côté du circuit
imprimé, donc, en voilà son schéma-bloc. Contentons-nous de remarquer qu'il y a un
interface vers le microcontrôleur. Cet interface, et bien, il y a même
différents modes Ici, ça a été programmé pour avoir du SPI
hein, les trois signaux de décallage clock, data, load.
C'est, les informations qu'on passe là-dedans
sont traîtées par un microcontrôleur spécialisé,
avec des tas de mods, et vous avez la
sélection, dans le fond, des lignes et des colonnes.
Ce circuit a 300, 400 pattes de sorties
qui sont connectées par des circuits imprimés avec des
conducteurs vraiment, extrêmement fins et extrêmement serrés.
Le fabricant vous offre des primitives, parce que c'est clair que,
si votre programme doit dessiner une ligne droite, comme celle-là, ceux qui ont
fait les exercices du dauphin se sont rendu compte, le nombre d'opérations
qu'il faut arriver pour euh, calculer les positions suivantes et l'afficher euh.
Donc au niveau de tous ces circuits sur vos tablettes graphiques
aussi, il y a des euh, un accélérateur graphique et pour
dessiner un point, ben vous devez envoyer les coordonnées de ce point, pour dessiner
un segment, vous devez donner les
coordonnées des extrémités, pour dessiner un caractère,
ben vous devez donner la coordonnée d'un point de référence et le caractère.
Et, chaque fois, vous avez aussi
un encodage de la couleur qu'il faut avoir préparé.
Là, vous voyez que les 16 bits ont été utilisés avec un peu plus de bits
pour le, un bit de plus pour le
vert, pour amérioler le contraste de couleurs probablement.
Alors ce genre d'application est facile à programmer.
C'est casse-pieds parce qu'il faut passer beaucoup de temps à à modifier
les coordonnées, à ajuster l'élégance du dessin.
C'est facile à programmer parce que s'il y aurait une
erreur de programmation, vous vous en rendez compte tout de
suite, vous voyez quel est le segment qui a été
mal dessiné, quel caractère a été mal choisi, mal placé.
Donc euh, vous allez passer beaucoup de
temps mais vous arriverez à des jolis résultats.
Bien, on vient de voir beaucoup
de choses, en particulier que c'est facile de passer par des tables
de conversion pour transformer des phénomènes
linéaires dans quelque chose de non-linéaire
qui correspond mieux à notre sensibilité physiologique,
qui correspond mieux aux capacités de déplacement, de vitesse
d'un robot.
Il y a vraiment beaucoup d'applications qui se
résolvent avec des tables plutôt qu'avec des calculs.
On a vu également que le registre de décallage
est l'élément de base pour tous les affichages en fait.
Que si on peut programmer avec
des vitesses extrêmement différentes suivant qu'on utilise
des librairies ou suivant qu'on se rapproche au maximum du processeur.
On a vu qu'il y a des circuits intégrés qui facilitent la
commande des LED, réglage du courant euh, le câblage.
Et là où ça devient très intéressant, c'est qu'on
trouve dans ces circuits des canaux PWM qui permettent directement
d'avoir des intensités de couleur en ayant
naturellement balancé toute l'information nécessaire en série.
Et que, au niveau des affichages à deux dimensions, les OLED ou les
affichages LCD, là il y a une possibilité de, d'informer
l'utilisateur de paramètres, de courbes, de toutes sortes
d'applications qui sont, effectivement, assez spectaculaires à programmer.