Contrôler plusieurs afficheurs

2014-09-27

Introduction

Dans la section précédente, nous avons connecté un afficheur sept segments à la carte Arduino. Le montage était relativement simple : connecter chaque pin de l'afficheur à une pin de la carte. Mais comme il faut au moins sept connexions pour controler un afficheur correctement (en ignorant le point), et que la carte ne comporte que 13 pin de type « Digital », il n'est pas possible d'utiliser directement la meme technique pour controler plusieurs afficheurs.

Deux approches sont alors possibles : réduire le nombre de connexions nécessaires pour controler un afficheur, ou bien controler plusieurs afficheurs avec les memes connexions. Et on peut combiner lesdeux techniques ! Cette page présente une méthode pour utiliser les memes fils pour controler plusieurs composants. La prochaine section présentera plusieurs techniques pour réduire le nombres de fils nécessaires pour controler un afficheur sept segments. Je vous laisse essayer les différentes combinaisons de ces approches.

Comme précédemment, nous utiliserons une breadboard, et des jumper. Cette fois, deux afficheurs sept segments (SC39-11SRWA) seront utilisés, et une résistance (470Ω) pour chaque.

Rajout

La première étape est de rajouter un afficheur sept segments au montage précédent et de le relier correctement. Pour cela, on ajoute des fils reliant chaque pin d'un afficheur à la pin correspondante de l'autre afficheur.

Le second afficheur est relié au premier à l'aide des fils rouges (source)
Le second afficheur est relié au premier à l'aide des fils rouges (source)

Bien entendu, avec ce montage, le même chiffre sera affiché sur les deux composants. Il nous faut donc trouver une modification simple du montage qui permette de différencier les deux afficheurs.

Montage

L'idée est relativement simple : nous allons faire en sorte de choisir quel afficheur doit être activé. De cette manière, on peut activer l'un des deux afficheurs, y représenter un chiffre, puis le désactiver, activer l'autre afficheur et y représenter un autre chiffre. Le controle va donc passer d'un afficheur à l'autre. Pour qu'on puisse lire les deux chiffres à la fois, il suffit de faire basculer le dispositif suffisamment rapidement pour que ce ne soit pas visible à l'œil nu.

La première chose à remarquer est que, si les afficheurs ont bien 8 entrées, une par DEL, ils n'ont qu'une seule sortie (GND, accessible sur deux pin). Le plus simple pour activer ou désactiver un afficheur est donc de contrôler cette sortie (en bloquant ou en laissant paser le courant.

Les sorties des deux afficheurs sont reliées à des pin différentes de la carte (source)
Les sorties des deux afficheurs sont reliées à des pin différentes de la carte (source)

Pour faire cela, rien de plus simple que de relier chaque sortie à une pin différente de la carte. Étant donné que les DEL sont des diodes et ne laissent donc le courant passer que dans un sens, et que le courant est induit par une différence de potentiel, il suffit d'imposer le potentiel à la sortie de l'afficheur à HIGH (haut) pour le désactiver, et à LOW (bas) pour l'activer.

Programme

void loop()
{
    displayDigit(4);
    delay(1000);
    displayDigit(2);
    delay(1000);
}

Le temps est venu d'écrire un programme pour l'Arduino. Lorsqu'un seul afficheur était branché, nous avons utilisé le code ci-dessus. Il nous faut maintenant prendre en compte l'activation de l'afficheur adéquat avec les pin 4 et 5 :

void loop()
{
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    displayDigit(4);
    delay(17);

    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    displayDigit(2);
    delay(17);
}

L'affichage de chaque chiffre se fait en quatre lignes de code. La première ligne désactive un afficheur précédemment activité. La seconde prépare la représentation du chiffre, et la suivante active l'afficheur associé au chiffre. Enfin, la dernière s'assure que le chiffre allumé le temps qu'il faut (chaque tour de boucle prend 33ms, soit 30 affichages par seconde). Le code complet est :

byte digits []={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int  led2pin[]={9, 8, 7,10,11,12,13, 6};
void displayDigit(int d)
{
    byte code = digits[d%10];
    for (int c = 7; c >= 0; c--)
    {   
        digitalWrite(led2pin[c], code%2 ? HIGH : LOW);
        code >>= 1;
    }   
}
void setup()
{
    for (int i = 4; i <= 13; i++)
        pinMode(i, OUTPUT);
}
void loop()
{
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    displayDigit(4);
    delay(17);
    
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    displayDigit(2);
    delay(17);
}