jeudi 13 juin 2019

Contrôler plusieurs LEDs avec Arduino: multiplexing et charlieplexing

Multi quoi??? Charlie qui???

Le multiplexing et le charliplexing sont des façon de brancher des LEDs à l'Arduino (ou tout autre microcontrôleur) de façon à utiliser le moins de broches possible. Par exemple, si vous désirez contrôler 30 LEDs, vous auriez besoin, en principe, de 30 sorties de l'Arduino, ce qui exigerait donc l'ajout de sorties supplémentaires par l'entremise, par exemple, de registres à décalage. Mais grâce au multiplexing, vous pourrez contrôler individuellement chacune de ces 30 LEDs avec seulement 11 sorties de l'Arduino. Si vous optez pour le charlieplexing, 6 sorties de l'Arduino suffiront pour contrôler les 30 LEDs.

Pour explorer tout ça, je vous propose une petite expérience consistant à contrôler 6 LEDs au moyen d'un Arduino Uno. Pour contrôler ces 6 LEDs, nous allons successivement procéder de 3 façons différentes: branchement direct, multiplexing et charlieplexing.

Les 6 LEDs sont disposées sur une breadboard de façon à former un rectangle (2 LEDs de largeur, 3 LEDs de hauteur). Pour chacune des trois versions du programme, la routine consistera à allumer chaque LED individuellement pendant une demi seconde, puis allumer les LEDs par groupes de deux, ensuite allumer les LEDs par groupe de 3, et finalement allumer toutes les LEDs.  Vous pouvez voir le résultat dans la vidéo ci-dessous.




Connexion directe

La façon classique de faire les choses consiste à brancher chaque LED en série avec une résistance de protection, et de l'insérer entre une sortie de l'Arduino et la masse (GND) (sur le schéma, A, B, C, D, E et F représentent les 6 broches de l'Arduino qui sont utilisées pour contrôler nos 6 LEDs).

Cette méthode accapare beaucoup de sorties, mais le fonctionnement est simple: pour allumer la LED L1, vous placez la broche A au niveau logique HAUT. Pour éteindre la LED L1, vous placez la broche A au niveau logique BAS. Et ainsi de suite pour les 5 autres LEDs.
Voici donc le sketch correspondant à ce circuit (les broches 3 à 8 de l'Arduino sont utilisées). Comme ce sera le cas dans les autres programmes de ce billet, les 12 motifs qui seront successivement affichés par les 6 LEDs sont définis dès le départ dans un tableau bidimensionnel ("1" quand la LED est allumée, "0" quand elle est éteinte).


Multiplexing

Essayons maintenant le multiplexing, qui consiste à associer une broche de l'Arduino pour chaque ligne, ainsi qu'une broche de l'Arduino pour chaque colonne de notre matrice de LEDs. Puisque nos 6 LEDs forment un rectangle de 2 LEDs de largeur et de 3 LEDs de hauteur, nous avons 2 colonnes et 3 lignes, donc un total de 5 broches sont nécessaires (d'accord, ce n'est qu'une broche de moins que pour le montage précédent, mais plus contrôlez un grand nombre de LEDs, plus l'économie de broches sera substantiel).

Cette fois, nous ne branchons rien à la masse (GND). Si vous désirez allumer la LED L1 dans le schéma ci-dessous, vous devez mettre la broche A au niveau logique HAUT, et la broche C au niveau logique BAS, ce qui fera circuler un courant de A vers C. Si la broche B est au niveau logique BAS, et les broches D et E sont au niveau logique HAUT, toutes les autres LEDs demeureront éteintes (soit parce qu'il n'y a pas de différence de potentiel, soit parce que le courant essaie sans succès de circuler dans le sens bloquant de la diode).
Le tableau ci-dessous montre l'état logique que doit avoir chacune des 5 broches pour allumer chaque LED individuellement.

LED
A
B
C
D
E
L1
HAUT
BAS
BAS
HAUT
HAUT
L2
BAS
HAUT
BAS
HAUT
HAUT
L3
HAUT
BAS
HAUT
BAS
HAUT
L4
BAS
HAUT
HAUT
BAS
HAUT
L5
HAUT
BAS
HAUT
HAUT
BAS
L6
BAS
HAUT
HAUT
HAUT
BAS

Là où les choses se corsent un peu, c'est si vous désirez allumer plusieurs LEDs à la fois. Par exemple, supposons que vous désirez allumer L1 et L4 en même temps, pendant que toutes les autres LEDs demeurent éteintes. Vous pourriez penser que la solution consiste à placer la broche A au niveau logique HAUT et la broche C au niveau logique BAS pour allumer L1, tout en plaçant la broche B au niveau logique HAUT et la broche D au niveau logique BAS pour allumer L4.  Mais si vous procédez de cette façon, 2 autres LEDs vont s'allumer: L2 (puisque B est HAUT et C est bas) et L3 (puisque A est HAUT et D est BAS).

Pour ne pas perdre le contrôle, en multiplexing, on n'allume qu'une seule LED à la fois. On peut par contre donner l'illusion que plusieurs LEDs sont allumées en même temps grâce à la persistance rétinienne: si vous allumer L1, puis ensuite L4, puis ensuite L1, etc., très rapidement, le clignotement rapide des LEDs sera imperceptible à l'oeil nu, et les deux LEDs sembleront allumées en même temps (alors qu'elles ne le sont pas vraiment).

Voici ce que ça donne comme sketch: c'est un tout petit peu plus complexe que le précédent. Par exemple, on ne peut pas se contenter d'allumer deux LEDs et de paralyser le processus au moyen d'un delay(): en attendant le prochain changement de motif, on doit continuer d'allumer par alternance les LEDs qui doivent l'être.

Il faut également s'assurer que l'intensité lumineuse de chaque LED demeurera la même peu importe le nombre de LEDs allumées: si la LED 1 doit paraître allumée pendant que toutes les autres sont éteintes, elle sera en réalité allumée une fois sur six, soit la même fréquence que lorsque toutes les LEDs semblent allumées en même temps.


Charlieplexing

Le schéma ci-dessous montre 6 LEDs connectées à la façon charlieplexing: cette fois, 3 broches de l'Arduino seront suffisantes pour contrôler chacune de nos 6 LEDs.

Par exemple, pour allumer la LED L1, il faut que la broche B soit au niveau logique haut, et que la broche A soit au niveau logique bas. Mais attention: la broche C ne doit pas être au niveau logique haut (sinon L5 va s'allumer aussi), ni au niveau logique bas (sinon L4 va s'allumer aussi)! Il faut plutôt la régler en mode INPUT (entrée), ce qui aura pour effet de lui procurer une très grande impédance (équivalent d'un circuit ouvert) et pour cette raison aucun courant ne la traversera.
Le tableau ci-dessous montre l'état que doit avoir chacune des trois broches A, B et C pour allumer chaque LED individuellement.

LED
A
B
C
L1
BAS
HAUT
ENTREE
L2
HAUT
BAS
ENTREE
L3
ENTREE
BAS
HAUT
L4
ENTREE
HAUT
BAS
L5
BAS
ENTREE
HAUT
L6
HAUT
ENTREE
BAS

Tout comme c'est le cas en multiplexing, nous allumons les LEDs une à la fois, et c'est le phénomène de persistance rétinienne qui nous donne l'illusion que plusieurs LEDs sont allumées en même temps.


Yves Pelletier   (TwitterFacebook)

7 commentaires:

  1. Très instructif. Merci beaucoup pour ces explications.
    Florian

    RépondreSupprimer
  2. Bonjour, intéressé par vos explications, je me demandais comment transposer cr croquis dur une carte nano (est ce réalisable ?) peut-on etendre ce schéma a 12 diodes ? Je suis in debutant moins que confirmé, merci pour votre mansuétude et botte réponse... MARC

    RépondreSupprimer
    Réponses
    1. OUI
      4 GPIO = 6 LEDS
      5 GPIO = 12 LEDS
      6 GPIO = 20 LEDS
      MAIS on est limité par les courants ...
      On peu imaginer mettre des opto, filtrer et amplifier ... électronique un peu lourde ...
      Voir les rubans de leds à base de WS2812 ... c'est mieux !

      Supprimer
    2. Je ne suis pas électronicien, cependant ayant travaillé avec certains d'entre eux, j'ai appris qu'il faut piloter des LEDs par le courant et non par la tension, ainsi mettre en œuvre des transistors nous permet d'alimenter les LEDs par une source externe et de n'utiliser les sorties Arduino que pour la commande (sur la base du transistor) ce qui ne limite donc plus le nombre de LEDs dans la limite des caractéristiques des transistors et de l'alimentation électrique supplémentaire bien sûr.

      Cependant, comme le fait remarquer l'intervenant précédent, utiliser des LEDs à base de WS2812 (adressables) est fort pratique... Mais plus onéreux. Et comme je dis toujours : ce sont des choix ;)

      Supprimer
  3. Bonjour
    Peut-on commander des relais de la même manière que les leds???

    RépondreSupprimer
  4. BBonjouur j'aimerai bien avoir les explications pour controler 30 leds

    RépondreSupprimer