Julien De Bona
Free Software, Cooking, and Everything


Charlieplexing

Publié le 2015-02-22.

Il est simple de piloter quelques LEDs en leur attriburant un pin chacune. On peut donc piloter N LEDs avec N pins. On est évidemment un peu limité avec les 13 broches disponibles, surtout s'il faut en laisser pour d'autres composants. Pour aller plus loin, on peut utiliser le fait qu'une broche peut avoir 3 états:

  • haut (tension de 5 volts)
  • bas (tension de 0 volts)
  • input (impédance très élevée: le courant ne passe pas)

Combiné au fait qu'une LED ne laisse passer le courant que dans un sens. En mettant une broche en position haute, un pin en position basse et les autres en mode input, on crée, moyennant les bons câblage, disposition et polarité des LEDs, N * (N -1) circuits avec N pins. On a en effet N possibilités de sélectionner le pin positif, multipliées par les N -1 emplacements libres où on peut positionner le pin négatif. Il reste à énumérer les possibilités et trouver le câblage qui va bien.

Avec 2 pins, on peut piloter 2 * 1 = 2 LEDs, c'est donc sans intérêt puisqu'on peut les piloter directement, mais cela donne (chaque colonne représente un pin et chaque ligne une LED:

LED \ Pin10
Charlieplexing à 2 pins
0-+
1+-

Dans ce système, un peu dégénéré, le pin 0 est connecté à la borne + de la LED 0 et à la borne - de la LED 1, tandis que le pin 1 est connecté à la borne - de la LED 0 et à la borne + de la LED 1.

Si on met le pin 0 à "haut" et le pin 1 à "bas", le courant passera par les 2 LEDs. Cependant, la polarité de la LED 1 est telle qu'elle ne laissera pas passer le courant et seule la LED 0 s'allumera. Si on inverse les 2 broches, c'est la LED 1 qui s'allume et la LED 0 qui s'éteint.

Avec 3 pins, on peut piloter 3 * 2 = 6 LEDs. La configuration commence à devenir intéressante. Les possibilités sont comme suit:

LED \ Pin210
Charlieplexing à 3 pins
0 -+
1- +
2 +-
3-+ 
4+ -
5+- 

Si on met le pin 0 à "haut" et le pin 1 à "bas", on aura:

  • La LED 0 est connectée de manière à fermer le circuit et s'allume
  • La LED 2 est connectée de manière à fermer le circuit mais sa polarité bloque le courant: elle reste éteinte
  • Les autres LEDs ont une de leurs bornes connectée à un pin en mode "input"; leur haute résistance ne laisse pas passer le courant et ces LEDs restent éteintes

Avec 4 pins, on peut piloter 4 * 3 = 12 LEDs, et les combinaisons deviennent:

LED \ Pin3210
Charlieplexing à 4 pins
0  -+
1 - +
2-  +
3  +-
4 -+ 
5- + 
6 + -
7 +- 
8-+  
9+  -
10+ - 
11+-  

J'arrête les comptes là. En pratique, il reste à câbler les LEDs selon le tableau, en ajoutant une résistance près de chaque pin (chaque circuit / LED a donc 2 résistances).

Charger le sketch suivant:

/* Mapping entre les pins logiques et les pins de l'Arduino */
const byte pins[] = {2,3,4,5};
/* Nombre d'éléments dans le tableau ci-dessus */
const byte cntPins = 4;
/* Nombre de LEDs à piloter, maximum cntPins * (cntPins -1) */
const byte cntLeds = 10;
/* La LED à allumer */
byte led;
/* Les pins (logiques) à mettre respectivement à high et low */
byte high,low;
/* Le moment du dernier changement de LED */
unsigned long lastTime;
/* Etant donné la LED à allumer, place dans *high et *low les
* numéros de broches devant etre mises dans ces positions.
*/
void setPins(byte led,byte *high,byte *low) {
  *high = led / (cntPins - 1);
  *low = led % (cntPins-1);
  if (*low >= *high) (*low)++;
}

void setup() {
  lastTime = millis() - 1000;
  led = cntLeds;
}
void loop() {
  unsigned long now = millis();
  if (now - 1000 > lastTime) {
    lastTime = now;
    led++;
    if (led >= cntLeds) led = 0;
    setPins(led,&high,&low);
    for (byte i = 0; i < cntPins; i++) {
      if (i == high) {
        pinMode(pins[i],OUTPUT);
        digitalWrite(pins[i],HIGH);
      } else if (i == low) {
        pinMode(pins[i],OUTPUT);
        digitalWrite(pins[i],LOW);
      } else {
        pinMode(pins[i],INPUT);
      }
    }
  }
}

Ce sketch va allumer successivement les LEDs de 0 à 9. La fonction setPins établit la correspondance entre un numéro de LED et les 2 pins à positionner selon les tableaux ci-dessus. Pour allumer plusieurs LEDs simultanément, il faut les allumer rapidement en alternance, et la persistance rétinienne fera le reste.

Pour terminer, voici le schéma de câblage:


tags: arduino

Quelques tags ...