Optimisation de broches par multiplexage et charlieplexage
Ah, le problème ancestral. Vous disposez d'un oscilloscope, mais cinq ingénieurs veulent l'utiliser ; d'une ligne téléphonique, mais trois personnes veulent passer des appels ; de 20 LED, mais seulement huit GPIO restent sur votre microcontrôleur. Alors, que faites-vous ? Vous partagez ! Ou, en langage technique, vous effectuez un multiplexage. Examinons de plus près le multiplexage.
L'un des défis majeurs lors de la sélection d'un microcontrôleur (MCU) est de trouver un dispositif avec suffisamment de broches pour la tâche et ce, dans le budget alloué. Généralement, un dispositif à 64 broches est plus cher qu'un dispositif à 32 broches. Environ 10 % à 15 % de ces broches seront des broches d'alimentation. Ce qui reste est un mélange de broches numériques, analogiques et de cas d'utilisation spéciaux.
Par exemple, il y a une broche de réinitialisation, des broches pour l'oscillateur à cristal et peut-être une broche dédiée pour prendre en charge un chargeur d'amorçage. Et parfois, des broches sont dédiées à l'utilisation avec des périphériques spécifiques, tels que l'USB ou I2C, car la circuiterie les entourant est légèrement différente.
Donc, supposons que nous ayons déterminé que notre application nécessite 20 broches purement numériques, peut-être pour des interrupteurs d'entrée et pour contrôler les LED d'une interface homme-machine. Sur un MCU à 32 broches, nous soustrayons les broches d'alimentation (par exemple, 6), les broches analogiques uniquement (par exemple, 8), l'USB et I2C (par exemple, 4), et il ne reste que 14 broches. Ainsi, en mettant votre chapeau commercial, pouvez-vous justifier la sélection d'un MCU avec un comptage de broches supérieur, plus coûteux, où toutes les broches ne sont pas utilisées ? Ou une certaine ingéniosité d'ingénierie peut-elle transformer 14 broches en 20 signaux ?
Le Multiplexage a Commencé avec le Télégraphe
L'idée d'obtenir davantage à partir d'une seule connexion électrique a commencé avec le télégraphe. Une fois que Morse et ses amis ont trouvé comment envoyer des bits de données sur de longues distances par fil, il était clair qu'ajouter constamment des fils pour augmenter la capacité serait coûteux. Non seulement cela, mais cela ajoutait également plus de travail pour l'équipe chargée de l'entretien du réseau.Naturellement, quelques esprits brillants de l'époque ont commencé à se demander si ces fils individuels pouvaient être partagés entre plusieurs télégraphistes, de sorte que deux messages ou plus pourraient être envoyés sur chacun des fils existants. L'un de ces esprits était Émile Baudot.
Le système devait être synchronisé des deux côtés. À l'extrémité réceptrice, une roue dactylographique, semblable à une tête d'imprimante à marguerite, tournait en continu. À l'extrémité émettrice, toutes les touches des lettres étaient échantillonnées dans le même ordre. Si une touche était enfoncée, la lettre correspondante de la roue dactylographique était actionnée lorsqu'elle passait sur une bande de papier. Cela limitait la transmission des messages à environ 40 mots par minute (un mot était en moyenne composé de cinq lettres et d'un espace).
Ce défi a été résolu par un nouveau schéma de codage qui consistait en un même nombre de symboles de longueur égale pour chaque lettre. Composé de cinq bits, son système utilisait des impulsions positives et négatives pour transmettre chaque lettre. En synchronisant les deux extrémités, jusqu'à six utilisateurs pouvaient envoyer simultanément des messages sur un seul fil. Enfin, c'est ce que cela semblait être. En réalité, il s'agissait d'un système de multiplexage à division temporelle qui fournissait à chaque télégraphiste un sixième d'une fente pour transmettre sa prochaine lettre.
Multiplexage pour les LED
Les afficheurs à LED à sept segments et les claviers matriciels sont des composants essentiels des systèmes électroniques depuis des décennies. Même avant que les microcontrôleurs (MCU) ne soient courants, les ingénieurs électroniciens cherchaient des moyens de réduire le nombre de signaux nécessaires pour mettre en œuvre ces composants.Prenons les afficheurs à LED à sept segments comme premier exemple. Si l'on inclut également le point décimal, ces dispositifs contiennent huit LED. Si vous construisez une alimentation électrique, vous regardez probablement un total de quatre chiffres (XX.YY) pour afficher la tension ou le courant. Cela nous laisse besoin de 8 x 4 = 32 broches - c'est beaucoup.
Ainsi, si nous connectons les mêmes segments LED de chaque nombre à la même broche du MCU, nous pouvons économiser 24 broches. Pour déterminer lequel de nos quatre afficheurs à sept segments est commandé, nous avons besoin de quatre broches pour connecter l'une des cathodes communes à la masse. Maintenant, pour contrôler 32 LED, nous avons besoin de 8 + 4 = 12 broches - soit 20 de moins que si nous dédiions une broche par LED.
Multiplexage pour les claviers matriciels
La même approche peut être utilisée pour une matrice de boutons-poussoirs en tant qu'entrée dans un système embarqué. Si vous avez seulement deux ou trois boutons, vous pouvez probablement les combiner avec une résistance de pull-up/pull-down et détecter leur état avec le même nombre de broches GPIO configurées en entrée.Cependant, une fois que vous avez plus d'environ six boutons, il peut être judicieux de mettre en place une matrice pour les lire. Au lieu de connecter les boutons à l'alimentation via des résistances de pull-up, les boutons sont connectés à une sortie GPIO. Lorsque la sortie est haute et que le bouton est enfoncé, l'entrée le détectera comme un 1. Vous devrez conserver les résistances pour éviter de court-circuiter le Vcc à la masse via les broches GPIO.
Pour créer une matrice, des chaînes de boutons doivent être activées en rotation par certaines broches GPIO configurées en sorties.
En commençant par six boutons, nous les regroupons en deux groupes de trois. Chaque groupe de trois a un côté connecté à une sortie GPIO. Nous les regroupons ensuite par deux, avec l'autre côté de chaque bouton connecté à une entrée GPIO.
// INITIALIZE PINS
SET D0 as OUTPUT
SET D1 as OUTPUT
SET D0 LOW
SET D1 LOW
// SCAN BUTTONS
SET D0 HIGH
READ D2, D3, D4 and STORE STATE as BUTTON 1, BUTTON 2, BUTTON 3
SET D0 LOW
SET D1 HIGH
READ D2, D3, D4 and STORE STATE as BUTTON 4, BUTTON 5, BUTTON 6
SET D1 LOW
Il est important de balayer les colonnes suffisamment rapidement pour garantir que la méthode d'entrée reste réactive. Les humains considèrent un temps de réponse de moins de 200 ms comme « instantané », vous devriez donc balayer l'ensemble de la matrice de boutons-poussoirs au moins cinq fois par seconde. Cette méthode convient également pour détecter les combinaisons d'appuis sur les boutons, ce qui peut fournir plus de fonctions d'interface utilisateur que de simples boutons.
Charlieplexing avec des LEDs
Alors que le multiplexage réduit le nombre de broches GPIO nécessaires pour contrôler les LEDs, le charlieplexing vous permet d'utiliser encore moins de broches ! Cela repose sur le fait que les broches GPIO du microcontrôleur ont trois états : haut et bas en sortie, et haute impédance en entrée.Pour commencer simplement, nous pouvons connecter deux LEDs en polarité opposée entre deux broches du microcontrôleur. Lorsqu'elles sont configurées en sortie, si une broche est haute et l'autre est basse, l'une des LEDs s'allume. Inversez cela, et l'autre s'allume. Pour les éteindre, il suffit de définir les deux GPIO en tant qu'entrées.
// INITIALIZE PINS
SET D0 LOW
SET D1 LOW
SET D0 as INPUT
SET D1 as INPUT
// TURN ON LED 2
SET D0 as OUTPUT
SET D1 as OUTPUT
SET D1 HIGH
SET D0 LOW
// TURN ON LED 1
SET D1 LOW
SET D0 HIGH
// TURN LEDS OFF
SET D0 as INPUT
SET D1 as INPUT
SET D0 LOW
SET D1 LOW
Jusqu'à présent, cela peut sembler peu impressionnant. Nous avons utilisé deux GPIO pour contrôler deux LEDs. Le plaisir commence lorsque nous ajoutons un GPIO supplémentaire… et quatre autres LEDs. Nous ajoutons deux autres LEDs en polarité opposée entre le GPIO un et trois, et deux entre le GPIO deux et trois. Pour contrôler une seule LED, un GPIO doit être en sortie haute, un en sortie basse, et le troisième doit être configuré en tant qu'entrée.
// INITIALIZE GPIOs
SET D0 LOW
SET D1 LOW
SET D2 LOW
SET D0 as INPUT
SET D1 as INPUT
SET D2 as INPUT
// TURN ON LED1
SET D0 HIGH
SET D1 LOW
SET D0 as OUTPUT
SET D1 as OUTPUT
// TURN ON LED4
SET D0 LOW
SET D1 LOW
SET D0 as INPUT
SET D2 HIGH
SET D1 LOW
SET D2 as OUTPUT
Broches de Sortie | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 |
D0 | OUT HIGH | OUT LOW | INPUT | INPUT | OUT HIGH | OUT LOW |
D1 | OUT LOW | OUT HIGH | OUT HIGH | OUT LOW | INPUT | INPUT |
D2 | INPUT | INPUT | OUT LOW | OUT HIGH | OUT LOW | OUT HIGH |
Avec deux LED en série entre les broches 1 et 3 (Arduino D0 et D2 dans le schéma ci-dessous), vous auriez raison de vous demander pourquoi ces LED ne s'allument pas lors de la tentative d'allumer la LED unique entre ces broches. Cela présente un risque, mais dépend de la tension d'alimentation basse du microcontrôleur et de la tension directe des LED. Avec une alimentation de 3,3 V, la tension à travers les deux LED est de 3,3 ÷ 2 = 1,65 V, ce qui n'est pas suffisant pour allumer une LED. Une utilisation à 5,0 V pourrait donc entraîner des problèmes.
Ceci mène à une autre considération. Les LED doivent toutes avoir la même caractéristique. Les LED de différentes couleurs ont souvent des chutes de tension différentes, ce qui crée un risque que, avec des LED de types différents, une LED supplémentaire s'allume indésirablement dans certaines conditions de sortie spécifiques.
Tout comme avec la multiplexation, la technique de Charlieplexing peut également contrôler le temps d'activation de la broche de sortie haute pour modifier la luminosité de la LED. Cela nécessite un timer et son interruption, ainsi que des instructions de commutation (switch statements).
Étant donné que le Charlieplexing ouvre de vastes possibilités, une simple équation permettra de clarifier le nombre de LEDs qui peuvent être contrôlées par le nombre de broches disponibles.
LEDs = GPIOs × (GPIOs - 1)
Ainsi, pour nos quatre afficheurs sept segments (32 LEDs) mentionnés précédemment, nous aurions besoin de sept broches GPIO et pourrions toujours connecter jusqu'à 10 LEDs supplémentaires pour d'autres utilisations.
Alors, Pourquoi le Charlieplexing ?
Le terme Charlieplexing provient d'un ingénieur chez Analog Devices, Charlie Allen, qui a soutenu l'utilisation de cette technique au sein de l'organisation. En conséquence, son nom est devenu une sorte d'abréviation lors de la désignation de l'approche de contrôle. Analog Devices fabrique en réalité des pilotes de LED à sept segments dédiés, tels que le MAX6950.
Ce composant à 16 broches peut piloter jusqu'à cinq affichages à sept segments ou 40 LEDs discrètes. Seulement huit des broches sont utilisées pour contrôler les LEDs. La méthode de contrôle utilisée est légèrement différente de celle décrite ci-dessus, avec une source de courant alimentant les LEDs et des MOSFET fournissant le chemin vers la masse pour la cathode commune. La source de courant est réglable de 2,5 mA à 37,5 mA, permettant le contrôle de la luminosité des LEDs. Un MCU contrôle le dispositif via SPI. Si nécessaire, plusieurs dispositifs peuvent être chaînés en série pour contrôler d'autres affichages segmentés.
Moins, c'est Plus
La partie amusante de l'ingénierie consiste à résoudre des problèmes. Les défis, tels que le nombre insuffisant de broches, surviennent régulièrement dans la conception de systèmes embarqués. L'utilisation créative des ressources disponibles, comme l'utilisation d'une seule broche pour plus d'une fonction, n'est pas nouvelle. C'est pourquoi il est utile de garder un esprit ouvert, de rester curieux et d'apprendre l'histoire de votre discipline. Juste parce qu'une technique a été inventée il y a plus d'un siècle ne signifie pas qu'elle n'est pas pertinente aujourd'hui !