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 ?

Je m'abonne
Abonnez-vous à la balise thématique Microcontrôleurs pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !

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.
 
Émile Baudot a inventé une méthode pour
multiplexer plusieurs opérateurs télégraphiques
sur un seul fil. (Domaine Public)
Baudot a commencé à travailler pour l'Administration des Postes et Télégraphes françaises en tant qu'opérateur à la fin des années 1860. Il a également été exposé au télégraphe imprimant Hughes. Contrairement aux systèmes télégraphiques traditionnels qui utilisaient les points et les tirets de Morse qui devaient être transcrits en texte lisible, le télégraphe imprimant possédait un clavier alphanumérique stylisé comme des touches de piano. À l'autre extrémité, les lettres transmises étaient transcrites sur une bande de papier.

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).
 
Le télégraphe imprimant Hughes a évité la nécessité d'apprendre le code Morse. (Domaine Public, Source : Olaf)
Baudot s'est demandé si cette méthode de synchronisation pourrait être utilisée pour partager un seul fil entre plusieurs utilisateurs. La numérisation des informations, les lettres à envoyer, semblait faire partie de la solution. Cependant, le code établi de Morse signifiait que le temps nécessaire pour envoyer chaque lettre différait, allant d'un simple point court à cinq longs traits.

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.
 
Le télégraphe imprimant Baudot exigeait que l'utilisateur saisisse des codes de 5 bits représentant la lettre ou le symbole à
transmettre. Six de ces unités partageaient un seul fil télégraphique. (Domaine Public)

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.
 
Quatre afficheurs à sept segments sur une alimentation électrique de banc.
Ce qui est commun à chaque afficheur segmenté, ce sont les huit connexions et la cathode commune. Nous savons également que les LED peuvent exploiter l'effet de persistance visuelle de l'œil humain. Cela signifie que si nous passons rapidement d'un afficheur à l'autre (multiplexage à division temporelle), l'œil ne remarquera pas que les LED n'ont été allumées que pendant une fraction de seconde. Quelque chose au-dessus de 24 fois par seconde serait approprié.

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.
 
Deux afficheurs à sept segments partagent huit signaux (segments et point décimal). Les broches D11 et D12 de l'UNO engagent l'un ou l'autre afficheur, connectant la cathode commune à la masse.
Si vous souhaitez contrôler la luminosité de l'affichage, vous pouvez créer une routine dans une interruption de minuterie qui contrôle le temps d'allumage des broches de la cathode commune.

Je m'abonne
Abonnez-vous à la balise thématique Arduino pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !

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.
 
Multiplexage de bouton-poussoir : six boutons utilisant cinq broches GPIO.
Plan du schéma pour le clavier multiplexé à six boutons.
En logiciel, nous activons la sortie GPIO d'une colonne de boutons-poussoirs, scannons les trois entrées, puis désactivons à nouveau la sortie. Le processus est répété avec la deuxième colonne. Donc, pour six boutons, nous avons utilisé deux sorties et trois entrées - soit cinq broches au lieu de six.
 
// PSEUDO CODE

// 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.
 
Principe du charlieplexing avec deux GPIO et deux LEDs.
Lorsqu'une LED est allumée, le courant passe à travers deux résistances de limitation de courant. Ainsi, si vous avez calculé une résistance de 200 Ω pour vos LEDs, vous aurez besoin de deux résistances de limitation de courant de 100 Ω chacune.
Plan du schéma pour le charlieplexing de deux LEDs.
// CODE PSEUDO - CHARLIEPLEXING

// 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.
 
Contrôle de six LEDs avec trois broches GPIO en utilisant le charlieplexing.
// CODE PSEUDO POUR LE CHARLIEPLEXING DE SIX LEDs

// 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
 Tableau de contrôle des six LEDs en multiplexage Charlie
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.
Schéma de Charlieplexing de six LED utilisant un Arduino.

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.
 

L'approche de multiplexage par Charlieplexing est utilisée par le MAX6950/1 pour contrôler jusqu'à 40 LEDs avec seulement huit broches. (Source : Analog Devices)

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 !