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.