samedi 5 janvier 2013

Afficheur 7 segments, AS1108 et Arduino

Voici la marche à suivre pour afficher des nombres au moyen d'un afficheur à LED "7 segments" (comportant 4 chiffres), le circuit intégré "AS1108" et un Arduino.

L'AS1108 est un circuit intégré spécialement conçu pour contrôler des matrices de LEDs.   Il est très similaire au MAX7219 et au MAX7221.

La raison pour laquelle j'ai choisi l'AS1108 plutôt qu'autre chose, c'est qu'il s'agit du seul circuit intégré de ce genre qu'ils offraient chez Tayda, mon fournisseur thaïlandais préféré.  C'est également chez Tayda que je me suis procuré l'afficheur, qui doit obligatoirement être à cathode commune.  Dans mon cas, il s'agit du LTC-4727JF fabfriqué par la compagnie Lite-On.

Lorsque j'ai voulu utiliser le matériel pour la première fois, j'ai été déçu (et même un peu découragé) du peu d'informations spécifiques à l'utilisation de l'AS1108 avec un Arduino...jusqu'à ce que je m'aperçoive que, d'un point de vu logiciel, il ne semble y avoir aucune différence entre le pilotage d'un MAX7221 et celui d'un AS1108:  si vous disposez d'un sketch conçu pour le MAX7221, il fonctionnera parfaitement avec un AS1108.


Les différentes entrées et sorties de l'AS1108, toutefois, ne sont pas disposées de la même façon que celles d'un MAX7721.

  • La pin 1 (Dout) ne sert que si vous désirez relier plusieurs AS1108 en série (par exemple, pour piloter un afficheur à 8 chiffres).
  • La pin 2 (Din) est l'entrée des messages numériques provenant de l'Arduino (on peut aussi l'appeler MOSI, pour Master Out Slave In):  vous la branchez à la sortie 11 de l'Arduino.
  • La pin 9 (Load/CSN) est le "chip select".   Je l'ai branchée dans la sortie 10 de l'Arduino.
  • La pin 10 (CLK) est branchée dans la sortie 13 de l'Arduino, de façon à recevoir le signal d'horloge.
  • Les pins 4 et 7 doivent toutes les deux être branchées au GND de l'Arduino.
  • La pin 16 (VDD) doit être branchée à la sortie 5 volts de l'Arduino (ça devrait fonctionner à 3,3 V aussi).
  • La pin 15 (Iset) permet de régler l'intensité du courant qui traversera les LEDs de l'afficheur grâce à une résistance placée entre les pins 15 et 16 (33 kΩ devraient faire l'affaire).  Moi j'ai mis un potentiomètre qui me permet de varier l'intensité lumineuse (même s'il est également possible de régler l'intensité lumineuse par logiciel).
  • Deux condensateurs (10 µF et 0,1 µF) sont conseillés entre VDD et GND afin d'assurer une alimentation sans perturbations.
  • Les pins 3, 8, 5 et 6 contrôlent les 4 chiffres de l'afficheur.
  • Les pins 11, 12, 13, 14, 17, 18, 19 et 20 contrôlent les 7 segments de chaque chiffre (le point décimal est le 8ième segment).
Il reste à déterminer la fonction de chaque pin de l'afficheur.  Je présente ci-contre la disposition des pins du LTC-4727JF, je ne sais pas s'il s'agit d'un standard ou non.  Chaque pin de l'afficheur doit être branchée à la pin équivalente du AS1108.

La pin 4 contrôle les deux points au milieu de l'afficheur, qui seraient utiles pour fabriquer une horloge (je ne l'ai pas utilisée).

Et finalement, le codage de l'Arduino.  Comme je le mentionnais plus haut, l'AS1108 se programme exactement de la même façon que le MAX7221.

Il faut donc initialiser l'unité en réglant les différents registres à des valeurs appropriées (voir la datasheet de l'AS1108 pour plus de détails):

SPI.transfer(0x0C);
SPI.transfer(0x01);    // réglage en mode normal

SPI.transfer(0x0F);
SPI.transfer(0x00);    // Display test off

SPI.transfer(0x0A);
SPI.transfer(0x08);     // Réglage de l'intensité lumineuse (valeur moyenne)

SPI.transfer(0x0B);
SPI.transfer(0x03);      // Utilisation des 4 chiffres de l'afficheur

SPI.transfer(0x09);
SPI.transfer(0xFF);     // type de décodage

Pour écrire le nombre "1428":

SPI.transfer(0x00);  // Chiffre 0...
SPI.transfer(0x08);  // ...réglé à la valeur 8

SPI.transfer(0x01);  // Chiffre 1...
SPI.transfer(0x02);  // ...réglé à la valeur 2

SPI.transfer(0x02);  // Chiffre 2...
SPI.transfer(0x04);  // ...réglé à la valeur 4

SPI.transfer(0x03);  // Chiffre 3...
SPI.transfer(0x01);  // ...réglé à la valeur 1

Voici un sketch affichant séquentiellement les nombres 0 à 9999 sur l'afficheur.  Je me suis inspiré d'un sketch trouvé dans le livre "Arduino Cookbook" par Michael Margolis (conçu pour le MAX7221),



Yves Pelletier (Twitter: @ElectroAmateur)

2 commentaires:

  1. Bonjour,
    Une petite erreur s'est glissée dans le texte

    Il est écrit :
    SPI.transfer(0x01); // Chiffre 2...
    SPI.transfer(0x02); // ...réglé à la valeur 4

    au lieu de :
    SPI.transfer(0x02); // Chiffre 2...
    SPI.transfer(0x04); // ...réglé à la valeur 4

    RépondreSupprimer