Sélection par transistor

2014-09-27

Introduction

Précédemment, nous avons contrôlé plusieurs afficheurs sept segments en permettant d'en sélectionner un à la fois. Pour cela, nous avons utilisé la masse de l'afficheur sept segment et relié à un potentiel LOW pour l'activer ou HIGH pour le désactiver. Cependant, cette technique implique de réserver une pin par afficheur sept segment. Or, il est possible de faire bien mieux !

En effet, lors de la sélection, une seule des pin de sélection est active. Si l'on considère par exemple 8 afficheurs, on va devoir utiliser 8 pin. Mais on pourrait numéroter les afficheurs de 0 à 7. Lors de la sélection, il n'y a qu'à choisir quel afficheur activer, et le numéro d'un afficheur se code alors sur 3 bits. Il est en fait possible de n'utiliser que 3 pin pour ce faire.

Quelques formes de transistors (source)
Quelques formes de transistors (source)

Afin d'obtenir se résultat, nous allons utiliser un transistor. L'idée est simple : un seul fil permet de contrôler le transistor ; lorsque le transistor bloque le courant, l'électricité n'a qu'un seul passage possible ; lorsqu'il laisse passer le courant, l'électricité a deux passages possibles et, en choisissant des résistances adéquates, elle favorisera le circuit passant par le transistor.

Montage

Nous reprenons donc le montage avec deux afficheurs et connectons la masse de chaque afficheur à GND sur la carte, l'une en passant par un transistor et une résistance faible, l'autre en passant par une résistance importante.

Le fil jaune permet de contrôler le transistor avec la pin 5 (source)
Le fil jaune permet de contrôler le transistor avec la pin 5 (source)

La pin 5 de la carte permettra de décider si le transistor laisse passer le courant (HIGH) ou non (LOW). Le problème de cette méthode est que les afficheurs ne sont pas associés à la même résistance, et les chiffres n'auront pas la même luminosité. Vous pouvez toujours y recourrir si vous n'avez qu'un transistor de disponible. Autrement, le montage suivant est plus adapté :

Les transistors sont de types différents, permettant de basculer celui à activer (source)
Les transistors sont de types différents, permettant de basculer celui à activer (source)

Les deux montages sont utilisés de la même façon par la carte. Si vous avez suffisamment de transistors, il vaut mieux recourir au second.

Programme

La fonction displayDigit reste la même que pour un seul afficheur. Il faut simplement choisir le bon état pour le transistor.

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 = 5; i <= 13; i++)
        pinMode(i, OUTPUT);
}
void loop()
{
    digitalWrite(5, HIGH);
    displayDigit(4);
    delay(17);
    digitalWrite(5, LOW);
    displayDigit(2);
    delay(17);
}

Ce code devrait faire s'afficher les chiffres 4 et 2. Cependant, à cause des résistances de différentes valeurs, le 2 devrait etre moins lumineux que le 4.

Encore plus

Comment faire si l'on veut contrôler davantage de connecteurs ? On utilise le dispositif sur plusieurs niveaux : un premier couple de transistors permet de choisir parmi deux groupes de composants. Dans chacun de ces groupes, on utilise la même technique pour choisir le composant adéquat, et ainsi de suite.

Par exemple, si l'on a 16 afficheurs, on commence par utiliser deux transistors pour indiquer s'il s'agit du premier ou du second groupe de 8 afficheurs, puis de deux autres pour indiquer si, parmi eux, il est parmi les 4 premiers ou parmi les 4 derniers, deux autres pour savoir s'il est l'un des deux premiers ou l'un des deux derniers dans ce sous-groupe et enfin deux transistors pour indiquer lequel des deux activer.

Il ne suffit pas de deux transistors par niveau. Il faut deux transistors pour chaque groupe, sous-groupe, etc. Dans le cas précédent, il en faut 2 pour l'ensemble des afficheurs, 2×2 pour les 2 groupes de 8 afficheurs, 2×4 pour les 4 sous-groupes de 4 afficheurs et 2×8 pour les 8 paires d'afficheurs. Le total étant alors de 2×15 transistors. En revanche, il suffit d'une connexion par niveau, qui contrôle tous ses transistors à la fois.

De manière générale, le nombre de transistors est égal au nombre d'afficheurs moins un. En revanche, le nombre de niveaux est égal au nombre de bits nécessaire pour coder le nombre d'afficheurs (autrement dit, le logarithme binaire). Autrement dit, avec n connexions, on peut contrôler 2^n afficheurs. Par exemple, avec un contrôle direct (au moins 7 connexions), on peut contrôler jusqu'à 2^(13-7) = 64 afficheurs ; avec un décodeur BCD, jusqu'à 2^(13-4) = 512 afficheurs ; avec un registre à décalage, jusqu'à 2^(13-2) = 2048.