Bonjour. Nous continuons le cours: Comprendre les microcontrôleurs. Aujourd’hui, nous allons parler d’enseignes à LED. Certes, c’est le progrès extraordinaire de ces diodes lumineuses, ces 20 dernières années, qui ont permis de réaliser d’impressionnantes enseignes, d’impressionnants afficheurs, grâce à cette technologie, mais c’est aussi certainement l’existence des microcontrôleurs, qui facilite grandement la commande telles enseignes, de tels afficheurs. Nous allons parler dans ce module de 2 grandes catégories d’enseignes à diodes lumineuses : les enseignes à motifs fixes, et nous allons parler en particulier de la commande par transistor de grandes quantités de LEDs, et également de l’extension du nombre des entrées-sorties des microcontrôleurs, particulièrement utiles dans ce cas-là, et nous allons aussi parler d’afficheurs matriciels, en étudiant aussi le cas particulier des afficheurs matriciels à balayage. Et naturellement, nous allons, pour tous ces cas, évoquer les logiciels, les programmes que nous avons à écrire pour commander de telles enseignes et de tels afficheurs. Vous voyez ici, un petite enseigne qui signale la présence d’un hôtel. Elle n’a pas été réalisée, comme on le fait traditionnellement, avec une plaque de plexiglass, le mot hôtel est un rétro-éclairage avec des néons, elle a été réalisée avec des diodes lumineuses. Quel est l’intérêt du système des diodes lumineuses? Et bien, c’est qu’il est beaucoup plus facile de décomposer l’enseigne en petits motifs, par exemple, des morceaux du cadre, par exemple, évidemment les lettres, et ensuite de faire des effets visuels qui attirent l’attention, des animations lumineuses. On se souvient qu’il faut un courant de 10 à 20 milliampères pour commander une diode lumineuse. Certes, il existe des diodes plus puissantes, qui peuvent aussi être utilisées pour ce type d’enseigne, mais on utilise encore assez souvent des petites diodes en relativement grand nombre. Alors, par exemple, toutes les LED qui vont composer la lettre H vont être reliées à la même sortie d’un microcontrôleur. Dans cette enseigne, on pourrait avoir une première sortie pour le H, la même chose pour les autres lettres. Concernant le cadre, bon, on peut avoir toute sorte de solutions, par exemple, la création de petits segments qui permettraient de faire des effets de rotation, qui peuvent être assez jolis. Il faut donc utiliser un transistor pour commander un certain nombre de LED. Et voici le schéma qui peut être utilisé. Chaque LED a sa résistance de limitation, extrêmement important. On commande l’ensemble de ces LED par un transistor, le transistor lui-même est commandé par une patte du microcontrôleur, avec une limitation de, du courant sur la base du transistor. On mettra volontiers une résistance de 1 kilo ohm, ici. Je signale que le montage qui consisterait à procéder de cette manière-là, à supprimer ces résistances, pour ne mettre ici, qu’une résistance, doit être considéré comme un montage qui est faux, qu’il ne faut pas utiliser. La raison? C’est que les diodes n’ont pas exactement le même comportement et on obtiendrait une luminosité qui serait variable, et les fabricants déconseillent véritablement ce montage-là. Il n’est pas impossible de mettre plusieurs LED en série mais cette méthode a ses contraintes. La tension ici, ne pourrait pas être du 5 volts. Pourquoi? Chaque diode a une tension qui lui est propre, ce sera une tension de l’ordre de 2 volts, pour des diodes rouges, ou de 3 volts, pour des diodes vertes. Par conséquent, il faut au moins, ici, 2 plus 2 plus 2, donc ça fait une dizaine de volts. Donc dans ce cas-là, on pourra, par exemple, utiliser, avantageusement, une alimentation de 12 volts, et mettre 5 diodes en série pour les LED rouges et 3 LED en série pour les LED vertes. On est bien d’accord, il faut donc tenir compte de la tension de la LED selon son type, c’est-à-dire sa couleur mais aussi sa technologie. Il est donc clairement nécessaire d’augmenter la tension pour faire face au nombre de diodes qu’on a choisi. L’avantage de cette technologie, évidemment, c’est qu’on peut mettre davantage de LED par transistor. On a moins de résistances, puisqu’on n'aura plus une résistance par LED mais une résistance pour un certain nombre de LED. À noter que le courant qui passe dans ces 5 LED est rigoureusement identique et il est, bien sûr, déterminé par la résistance qu’il va falloir, donc, calculer correctement. Une petite question que je vais vous poser : avec une alimentation de PC portable fournissant 16 Volt et un maximum de 4,5 ampères, combien de LED vertes est-il possible de commander? Je ne parle pas du nombre de motifs, du nombre de transistors, mais le nombre total de LED dont on a besoin. Je précise que la tension aux bornes de chaque LED doit être d’environ 3 Volt, pour un courant de 10 milliampère. Voilà les 4 réponses proposées. Alors, on va d’abord choisir le nombre de LED qui vont être mises en série. Avec une tension de 16 Volt et 3 Volt pour chaque LED, on va pouvoir mettre 5 LED en série et par conséquent, on aura 10 milliampère qui passent par ces 5 LED en série. Il sera donc possible d’avoir 450 groupes de LED et par conséquent, comme il y a 5 LED par groupe, on aura donc bien, ici, 2250 LED possibles. Revenons sur la question de cette fameuse résistance de limitation qui donc, ici, est utilisée pour limiter le courant à travers toute cette branche, ici, on a choisi 5 LED. Il faut calculer la valeur de cette résistance de telle manière qu’un courant, qui soit le courant qu’on a choisi, par exemple, 10 milliampère, puisse circuler dans cette branche. Pour calculer une résistance lorsqu’on sait le courant, il faudrait aussi connaître la tension aux bornes de cette résistance. Alors, si on admet, ici, pour l'exemple, qu’on a 16 Volt, et qu’on a 3 Volt dans chacune des LED, il nous reste donc 16 moins 3 fois 5, c’est-à-dire 1 Volt aux bornes de la résistance. On souhaite donc calculer la résistance par la loi d’Ohm, ça nous donne une résistance de 100 Ohm. Est-ce que cette valeur est définitive? On n’est pas certain de ce 3 Volt. Bien sûr, le fabricant le précise, c’est peut-être une valeur légèrement différente, mais il est toujours bon d’expérimenter. C’est la raison pour laquelle il faut mesurer le courant. Une fois que l’on a notre résistance de 100 Ohm, on met le dispositif en marche et on mesure, ici, la tension et on calcule le courant. Une fois qu’on a le courant, on le compare avec celui qu’on voulait et éventuellement, on va corriger la valeur de la résistance, et reprendre, évidemment, le test. Disons quelques mots sur les logiciels de commande nécessaires pour de telles enseignes à motifs fixes. Évidemment, il s’agit de séquenceur. On a déjà vu ce sujet. Il est parfois délicat d’écrire des programmes qui soient lisibles parce que c’est des séquenceurs qui ont souvent des séquences extrêmement longues et on peut arriver à des listes fastidieuses d’instructions, qui d’ailleurs, parfois, prennent trop de place en mémoire. On n’est pas seulement intéressé à allumer ou éteindre des LED mais dans certains cas, on va essayer d’utiliser des variations d’intensité, on utilisera la technique du PWM, que nous connaissons. Pour des raisons de lisibilité, et parfois pour des raisons de taille mémoire, on peut imaginer, dans certains cas, un langage spécifique de programmation, qui ensuite va être interprété par notre programme en C. Alors, peut-être que tout cela vous effraie, mais vous verrez que quelques lignes de programmation en C vont suffire pour écrire ce petit interprète dans un langage qui, souvent, n’aura que 2 instructions. L'assignation de sortie et les attentes. D'un autre côté, il est souvent intéressant d'avoir des parties d'enseigne indépendantes, et la technique du multi-tâches, que nous avons l'habitude d'utiliser, peut être utilisée. Alors il serait trop fastidieux ici de donner un exemple de programme de ce type, vous en trouverez dans des documents additionnels disponibles sur le site. Il est évident que s'il est possible de mettre davantage de motifs sur une enseigne, on pourra faire des animations plus astucieuses, plus attractives. Alors, si on a besoin de davantage de sorties, une des solutions est de prendre un microcontrôleur avec davantage de pattes. Ce n'est pas toujours la bonne solution, et de toute façon, on est assez rapidement limité par le nombre de pattes disponibles sur des processeurs. Une autre solution est d'utiliser des circuits spécialisés, en particulier il en existe avec la technologie I2C et SPI, qui sont vues dans un autre module. Mais il est possible aussi d'utiliser tout simplement des registres standards pour faire cette extension du nombre de sorties et c'est une solution qui a l'avantage d'être très peu coûteuse. Très souvent le circuit du type 74 HC 595 est utilisé. Voilà comme il est décrit par un de ses fabricants. Il y a donc un registre série, avec une entrée série, avec une horloge, qui est ensuite transmis à un registre parallèle, qui a sa propre horloge, et finalement, des amplificateurs de sortie avec la possibilité d'utiliser les sorties à trois états, et les sorties que vous trouvez ici. Une manière plus élégante de donner un symbole à ce composant se trouve ici. On voit bien le registre série, avec son entrée, avec son horloge. Le registre parallèle avec son horloge, avec ses sorties, et le signal reset, qui permet de remettre à zéro le registre série, et l'output enable, la commande de la sortie tri-state, qui permet d'activer ou de désactiver les sorties. A noter que ce signal reset et ce signal output enable ont une polarité négative, ils sont actifs à zéro. Notez aussi la présence très intéressante de ce signal de sortie du registre série qui peut être utilisé, nous allons le voir, pour cascader les registres, et faire de longs registres. Alors, voilà comment le schéma se présente : on voit que l'horloge série va vers tous les registres, que l'horloge parallèle va vers tous les registres, et que la sortie série d'un premier registre va vers l'entrée série du deuxième. Pour une utilisation normale, reset est inactivé, il est mis à un, et puis l'output enable est activé pour que les sorties fonctionnent correctement, il est donc mis à zéro. Regardons un petit peu le diagramme des temps qui permet de faire fonctionner ce registre 16 bits, que nous avons formé en cascadant deux registres 8 bits. Nous avons les données à présenter à l'entrée S in. Nous avons les coups d'horloge pour valider chacune de ces valeurs. La sensibilité est au flanc montant de l'horloge. Lorsque les seize valeurs ont été transférées, il est encore nécessaire de transférer l'ensemble des seize valeurs, depuis le registre série vers le registre parallèle, pour que les valeurs arrivent sur la sortie. Et vous notez que pendant le temps de préparation des données, pendant le transfert ici de ces données, les sorties continuent à garder la valeur précédente. Il n'y a pas de parasites qui sont générés par le décalage grâce donc, à l'utilisation de ce deuxième registre. Voilà le programme qui va nous permettre d'envoyer ces 16 bits, donnés dans la variable valeur, sur les sorties S in selon le diagramme des temps qui est donné ici. On voit donc qu'on a une boucle for qui va s'exécuter 16 fois, avec la variable i. Cette variable va être utilisée pour choisir à l'intérieur de valeur le bit correspondant, et ensuite on va soit allumer la sortie, soit éteindre la sortie, et ensuite on va soit allumer l'entrée série, soit éteindre l'entrée série. Ensuite, il est nécessaire de générer une impulsion d'horloge. Il suffit de la mettre à un puis de la mettre à zéro. Et lorsque tout est terminé, il faut faire la même chose, mais cette fois, pour l'horloge parallèle. Il faut noter que cette manière d'écrire n'est pas très astucieuse. Cette ligne est un petit peu compliquée. Pour chacune des seize occurrences, il va falloir décaler un certain nombre de fois cette valeur un. En réalité, ce qu'on cherche à faire, c'est décaler chaque fois d'un petit peu plus. Pourquoi, alors, ne pas programmer de cette manière-là? On fait systématiquement le masquage avec la valeur un, le bit de puissance zéro, mais ensuite, valeur change et prend la valeur décalée à droite, cette fois de un, de telle manière qu'apparaissent successivement le bit un, le bit deux, et cetera. Nous abordons maintenant un autre sujet. C'est le sujet des afficheurs à matrices de diodes lumineuses. Ce qui est représenté ici avec l'hôtel semble ressembler à ce qu'on avait tout à l'heure, mais c'est pas du tout la même chose, puisqu'on a ici une matrice régulière avec une commande individuelle de chaque diode lumineuse, et il est possible, sur cette matrice, de, par exemple, créer des caractères comme ceux qu'on voit ici. Evidemment, il y a tellement de diodes lumineuses qu'on va systématiquement utiliser des registres, comme on l'a vu tout à l'heure. A titre d'exemple, j'ai réalisé un modèle de 16 fois 16 LED, c'est-à-dire 256 LED. J'ai dû utiliser 32 registres du même type que tout à l'heure, et naturellement, un microcontrôleur par carte. Avec ce type de module, il est possible de faire de longs afficheurs, comme des journaux lumineux. Il est aussi possible de faire des afficheurs spécifiques, avec des formes particulières, comme par exemple des croix de pharmacie. Vous allez peut-être me dire que cette électronique est un peu compliquée, et qu'il y a peut-être une manière plus simple de procéder. En effet, la technique du balayage permet d'obtenir des schémas plus simples. Dans ce cas-là, on va utiliser des lignes, on va utiliser des colonnes, et chaque diode lumineuse doit être liée entre une ligne et une colonne. Est-ce que ce dispositif peut fonctionner? Regardons par exemple s'il est possible d'allumer cette diode lumineuse et d'allumer celle-ci. Certainement. Il faut mettre du plus ici, il faut mettre du plus ici. De même il faut mettre du moins ici et du moins là, et ces deux diodes peuvent être allumées. Mais il y a un problème : ces diodes-là vont aussi s'allumer et on ne le souhaite pas. Il n'est donc pas possible d'allumer en même temps ces diodes lumineuses sans créer ce parasite. La solution consiste à allumer d'abord toutes les diodes de cette ligne, puis toutes les diodes de cette ligne, puis toutes les diodes de cette ligne, et cetera, et de faire répéter ce processus suffisamment rapidement pour que notre œil ne perçoive pas le clignotement. Il faut signaler qu'il faut une fréquence au moins supérieure à 100 hertz pour ne pas avoir une impression désagréable de clignotement, 150 hertz seraient encore mieux. Est-il possible de commander ce montage directement par les pattes d'un microcontrôleur? Certainement pas, parce que le courant qui va passer ici lorsqu'on souhaite, par exemple, allumer toutes ces diodes lumineuses, est probablement supérieur à ce que le microcontrôleur peut fournir. Il faut donc mettre, à ce niveau-là, un transistor. Il va falloir aussi mettre une résistance de limitation. Où faut-il la mettre? Et bien, c'est très important de remarquer qu'elle doit être mise sur les colonnes, plus exactement de l'autre côté par rapport au côté où on procède au balayage. On va accéder successivement, grâce à ces transistors, à ces lignes Et par conséquent, pour une ligne donnée, une colonne soit recevra aucun courant, parce que la LED est éteinte, soit le courant nominal de la diode lumineuse lorsqu'elle est allumée. Par conséquent, on aura une luminosité constante. Si on avait mis les diodes à cet endroit-là, la luminosité varierait selon le nombre de diodes allumées. Bien entendu, il faut relier, ici, le plus, par exemple, plus 5 volts pour alimenter ce montage et bien entendu, aussi, chacune de ces pattes, pour les colonnes et pour les lignes, sont reliées au microcontrôleur, ou à des registres d’extension. Voilà le schéma complet d’un afficheur de ce type-là. Dans ce cas-là, des registres du type 74 F 164 ont été utilisés. Le 164 a la particularité de ne pas avoir le registre parallèle mais il n’est pas nécessaire puisqu’il est possible pendant que les données sont envoyées, de couper les transistors de commande. Nous avons, ici, choisi non pas de la technologie HC mais la technologie F, qui est une technologie plus ancienne, mais qui permet de tirer un courant plus important lorsque la sortie est à 0. Et, il est possible de dépasser le courant nominal des diodes lumineuses pour aller jusqu’au courant maximal de ces diodes lumineuses, étant donné qu’elles ne sont pas utilisées à plein temps, elles sont utilisées une partie du temps, ici, un septième du temps. La perte de luminosité qu’on a par le fait que les diodes lumineuses ne sont allumées qu’un septième du temps, est partiellement gagnée par le fait qu’on peut augmenter le courant jusqu’au courant maximal, qui est généralement de 20 milliampères. Voilà, ici, une réalisation matérielle de cet afficheur, c’est celui que vous avez peut-être vu dans le « teaser » de ce cours. Et vous comprendrez, aussi, pourquoi nous avons choisi, ici, 31 diodes lumineuses, c’est la taille de ces plaques, du type Veroboard, qui a été utilisée. Et, le choix, par contre, de cette ligne est lié au fait que, il faut au moins cette ligne pour pouvoir dessiner proprement les caractères majuscules. À noter que les caractères minuscules n’apparaissent pas de maniére très esthétique, il faut plutôt utiliser les lettres majuscules avec cette technologie. Je ne veux pas, ici, écrire le programme complet d’un journal lumineux, qui est quand même relativement compliqué, en particulier, pour la génération des caractères, mais je vais quand même écrire l’ensemble des routines qui permettent de faire des animations. Alors, tout d’abord, dans une matrice, on mémorise les pixels, on initialise à 0 pour que l’afficheur soit vide. Et ensuite, on utilisera une procédure qui s’appelle « Affiche », qui va durer un certain temps, on aura par exemple 10 millisecondes pour cette partie de la procédure et elle sera répétée un certain nombre de fois. Alors, on trouve effectivement une boucle pour le nombre de répétitions du cycle. Et maintenant, chaque cycle nécessite, pour chaque anode, pour chaque ligne, de 0 jusqu’à 6, de mettre les valeurs correctes sur les colonnes, d’activer la ligne correspondante et de faire une petite attente. Entre les différents affichages successifs, on va pouvoir allumer ou éteindre des pixels, par exemple avec ces 2 procédures : « SetPoint », « ClearPoint », qui permettent d’allumer ou d’éteindre un pixel, extrêmement simple vu la structure, le y est donné par l’indice dans la matrice et le x est donné par le numéro du bit à l’intérieur du nombre. Ici, un petit jeu qui permet de faire rebondir une balle sur les bords. On a, ici, les bords qui sont dessinés de chaque côté. Et ensuite, on va allumer le point, attendre un certain temps, 20 répétitions du cycle d’affichage, puis on va éteindre ce point, et ensuite on va calculer le point suivant. Regardez la petite astuce, d x et d y peuvent être à 1 ou à moins 1, de telle manière que la balle rebondisse d’une manière tout à fait logique sur les 2 bords. Finalement, le programme principal. L’initialisation habituelle du « watchdog ». Ne pas oublier l’usage normal de P 1 point 6 et P 1 point 7 pour que ce soit des entrées-sorties normales, puisqu’elles sont utilisées dans ce cas-là, c’est pas la valeur par défaut, au moment du « reset ». On met les lignes et les colonnes en sortie. Et finalement, on exécute sans fin la petite procédure « Ping ». Ce sujet des enseignes et des afficheurs à diodes lumineuses est extrêmes vaste, nous avons fait que l’effleurer. Nous avons vu comment réaliser des enseignes à motifs fixes et quelques techniques qui lui sont associées. Nous avons aussi vu comment réaliser des enseignes matricielles