Dans ce dernier chapitre nous verrons comment communiquer avec un contrôleur/driver d'écran fluorescent à l'aide d'un ATtiny85 (n'importe quel microcontrôleur pourrait aussi bien faire l'affaire).
Il s'agit d'ordonner l'affichage de motifs complexes (textes, icônes), voire d'animations.
Drivers
Le driver étudié ici est un exemplaire appartenant à la famille du PT6312 de Princeton (Voir datasheet). Plusieurs déclinaisons existent (AD16312, HT16512, ET16312), chacune produite par un constructeur différent, mais le fonctionnement et la disposition des broches est strictement identique.
Voici ci-dessous la liste des configurations d'écrans supportées. Le Contrôleur possède un nombre limité de broches (voir brochage plus bas). Certaines d'entre elles ont un double rôle et sont configurées par l'utilisateur selon l'écran à contrôler. Au-delà de 6 grilles l'ajout de grilles se fait ainsi au détriment du nombre de segments pilotables.
4 grilles, 16 segments
5 grilles, 16 segments
6 grilles, 16 segments
7 grilles, 15 segments
8 grilles, 14 segments
9 grilles, 13 segments
10 grilles, 12 segments
11 grilles, 11 segments
Fonctionnalités additionnelles :
- Contrôle de 4 LEDs
- Contrôle de 4 boutons
- Contrôle de 4 interrupteurs génériques
Certains drivers peuvent gérer plus de grilles et plus de segments (Ex : PT6311). Cela permet d'avoir des caractères plus détaillés.
Des drivers alternatifs plus simples (sans gestion des boutons ou des LEDs) peuvent être trouvés chez Maxim Integrated (Voir MAX6921, MAX6931). Chacune de leurs sorties peut piloter une grille ou une anode. Leur commande se fait via le protocole SPI.
Montage du circuit
Seules 3 broches sont requises pour communiquer entre le microcontrôleur et le driver : CS/STB
(Cable Select/Strobe), SCLK
(clock) et DATA
(IN/OUT).
Pour l'ATtiny85 j'utiliserai de manière purement arbitraire le montage suivant :
ATtiny85 | PT6312 |
---|---|
Pin 5 (PB0) | CS/STB |
Pin 6 (PB1) | SCLK |
Pin 7 (PB2) | DATA |
Brochage du microcontrôleur AVR ATtiny85 de chez Atmel.
La communication est basée sur le protocole SPI (Serial Peripheral Interface). Normalement celle-ci requiert 2 connexions, toutefois le transfert de données n'est jamais fait simultanément dans les 2 directions ; une seule broche DATA est donc requise. Les pins MISO et MOSI sont d'ailleurs souvent reliés l'un à l'autre sur les platines.
Circuit définitif de commande via un ATtiny85.
Quelques bases à propos du driver PT6312
Mémoire
Les commandes consistent essentiellement à mettre à jour la mémoire du contrôleur (Voir illustration ci-dessous). Lequel effectuera en continu des boucles de lecture sur celle-ci. Dès qu'un bit en mémoire a pour valeur 1, le segment correspondant est allumé.
Commandes
Chaque octet en mémoire dispose d'une adresse (de 0x00 à 0x15 sur le schéma). Une commande nous permet de modifier la valeur d'un curseur, autorisant de sauter de case mémoire en case mémoire pour y écrire.
Les octets envoyés au driver sont directement écrits dans la mémoire au fur et à mesure qu'ils sont reçus. C'est à dire que si le curseur est en position 0 (adresse 0x00 de la grille G0), l'envoi de 2 octets aboutira à leur placement en 0x00 et 0x01. Le curseur est automatiquement incrémenté après chaque octet écrit (cela est modifiable). Il pointera donc l'adresse 0x02 à la fin de la procédure.
Programmation
Pour des raisons évidentes poussant à éviter de réinventer la roue numérique, j'ai encapsulé un certain nombre de fonctionnalités dans une librairie permettant de dialoguer facilement avec le driver PT6312.
La librairie est disponible sur Github - PT6312_VFD_Arduino_Library.
Vous y trouverez un README détaillé de l'API (ensemble des fonctions proposées) et un exemple complet d'implémentation d'une horloge avec animation à chaque seconde écoulée : Exemple d'horloge.
Voici tout de même un aperçu des quelques fonctionnalités proposées :
// Test all segments
VFD_displayAllSegments();
_delay_ms(1000);
// Test/debug display segments from number 1 to number 16
VFD_segmentsGenericTest()
VFDClear();
// Enable LED output
VFD_setLEDs(PT6312_LED3);
// Set specific icons (Do not forget to enable ENABLE_ICON_BUFFER in the library config)
VFD_setIcon(ICON_DVD);
VFD_setIcon(ICON_PLAY);
VFD_setIcon(ICON_DOLBY);
// Write a big signed int
// This one uses 7 characters it will be cropped to 6: -12345
// The colon symbol will be displayed if available
VFD_home();
VFD_writeInt(-123456, 6, true);
// Scrolling text
VFD_home();
VFD_scrollText("HELLO WORLD", &scrollCallback);
// Write text
VFD_home();
VFD_writeString("COUCOU", false); // Boolean set to false to not display the special colon symbol
// Clear the screen (keep icons, see VFD_clearIcons() to clear them)
VFD_clear()
// Enable spinning circle animation
VFD_busyWrapper(1);
Conclusion
Cet article clôt la suite consacrée aux afficheurs fluorescents au cours de laquelle nous sommes partis du matériel et de la théorie associée jusqu'à son utilisation automatisée.
Les afficheurs fluorescents sont des composants d'un autre temps ayant supplanté les tubes Nixie dans les années 70 avant d'être remplacés progressivement par des écrans LED ou LCD voire OLED aujourd'hui. Ce sont toutefois des pièces que l'on croise encore couramment et qu'il peut être intéressant de récupérer et d'intégrer dans des projets d'électronique.