MicroPython : réutiliser un afficheur VFD (Vacuum Fluorescent Display) avec un Pico sous MicroPython
Bonjour à tous,
Ce qu'il y a de bien dans ces périodes festives, c'est qu'il est possible de se pencher (ou repencher) sur des projets personnels qui sortent des sentiers battus.
En attendant le réveillon du Nouvel An, je vous propose une petite lecture distrayante.
Introduction
Il y a quelques années, j'ai reçu un MiniDisc player Sony HCD-MJ1 présentant une panne mécanique irréparable sur le lecteur MiniDisc.
J'ai donc décidé de faire de la récupération en commençant par l'afficheur VFD (tube a vide avec affichage fluorescent).
Tube VFD du Sony HCD-MJ1 |
Même s'il s'agit d'une technologie d'un autre temps, ces afficheurs sont incroyablement attrayant. Produisant leur propres lumières, ils offrent aussi un excellent contraste et permettent la lecture sous de nombreuses conditions de luminosité.
L'afficheur VFD ici présent utilise un contrôleur M66004 et j'ai eu la chance de dégotter la fiche technique du M66004 (voir une copie disponible ici).
Ce dit donc une nouvelle occasion de mettre MicroPython à l'honneur (sur Raspberry-Pi Pico).
Fonctionnement des Vaccum Fluorescent Display
Avant de faire de se lancer dans la fiche technique et un peu de rétro-ingénierie de la carte, il convient de savoir comment un tel dispositif fonctionne.
Une VFD est constitué en trois niveau (si l'on fait abstraction du tube en verre et du vide).
Source: cette page de Futaba corporation |
- Un filament est chauffé de sorte à accroître l'activité des atomes du métal le constituant. Des électrons s'échappent du filament et forment un nuage autour du filament. A noter que le filament n'est pas chauffé au point de rougir sous nos yeux!
- Le filament en maintenu à une tension négative (bien inférieure à -10V).
- La grille, qui se trouve entre le filament et les segments de de l'afficheur est raccordée sur la masse (donc un potentiel positif par rapport au filament).
Les électrons sont attirés vers la grille, un petit nombre est capturé par la grille le reste poursuit sont chemin vers les segments. - Quand il y a plusieurs chiffres/digits: chaque chiffre/digit dispose de sa propre grille. Cette grille est bien entendu branchée à la masse uniquement lorsqu'un chiffre doit être affiché (afin créer un flux d'électron vers les segments).
- Les segments qui ont un potentiel plus positif que le filament vont attirer les électrons. Comme la grille, brancher le segment à la masse sera suffisant pour attirer l'électron. Lorsqu'un segment est frappé par un électron, celui-ci émet une lumière fluorescente en réaction.
- Les segments avec un potentiel plus négatif que le filament repousseront les électrons (ce qui évitera au segment de s'illuminer).
La ressource suivante provenant de TubeClockDB.com met en évidence les éléments avec les tensions (les potentiels) qui y sont appliqués.
On y voit bien:
- que le filament est alimenté avec un tension relativement faible
- le filament est maintenu a une tension bien inférieure à la grille (et ai segments).
Source: Cette page sur TubeClickDB.com |
Une vidéo instructive
Je vous conseille aussi de consulter la vidéo Youtube "How a VFD works, wiring and testing" qui s'avère être très instructive.
L'afficheur du HCD-MJ1
C'est le moment de revenir à notre carte.
Cliquer pour agrandir |
A l'aide de la fiche technique M66004 datasheet, j'ai réussi a décoder le circuit d'alimentation du contrôleur M66004. Il fonctionne en logique 5V, de la tension entre la grille et le filament est de -35V (dit VP dans la fiche technique).
Reconstitution du schéma. |
Enfin, la tension de filament est fixée arbitrairement à 3V et la tension "cutoff bias" mesurée directement sur la carte.
Tous les potentiels sont connu et peuvent être reporté sur le graphique de Futaba Corporation.
Tensions applicative du VFD Sony |
Et pour finir, l'exemple de la fiche technique M66004 est complété avec les informations collectées... et nous avons un excellent candidat pour un schéma définitif.
Circuit de commande
C'est le moment d'envisager le raccordement sur un microcontrôleur. J'ai volontairement choisi un Pico sous MicroPython.
La commande se fait avec trois signaux:
- /CS: a mettre au niveau bas pour communiquer avec le composant.
- SCK: signal d'horloge. la donnée est acquise lors du flan montant du signal d'horloge.
- SDATA: Serial data. Les bits sont envoyés un par un en commençant par le bit de poids le plus fort (MSBF).
Tous les signaux étant identifiés, le connecteur principal peu maintenant être documenté avec les tension d'alimentation et les signaux de données.
Brancher sur un Raspberry-Pi Pico
Il n'y a rien de vraiment particulier dans les indications de raccordement ci-dessous.
Et comme le la logique de commande est en 5V, j'ai utilisé un 74AHCT125 en guise de Level Shifter.
Cliquer pour agrandir |
Le lecteur attentif remarquera que la tension d'alimentation du filament (heater) est passé à 4.5V.
L'expérience à démontré que les 3V n'étaient pas suffisant pour illuminer tous les segments (l'écran étant relativement large).
Par essai/erreur, la tension 4.5V semble suffisante mais rien n'empêche d'augmenter celle-ci jusqu'à la tension logique (5V).
Un tout premier script
Comme vous pouvez vous en douter, je ne suis pas arrivé si loin sans avoir réussi :-)
La fiche technique contient une commande appelée ALL DIGIT DISPLAY ON qui permet tester le système d'éclairage (expliqué tel quel dans la doc).
Cela fût donc le premier script écrit pour développer et tester la bibliothèque.
from machine import Pin from vfd_m66 import VFD_M6604 _reset = Pin(Pin.board.GP18, Pin.OUT, value=True ) # Unactive _cs = Pin( Pin.board.GP14, Pin.OUT, value=True ) # unactiva _sdata = Pin( Pin.board.GP13, Pin.OUT ) _sck = Pin( Pin.board.GP16, Pin.OUT, value=True ) vfd =VFD_M6604( sck=_sck, sdata=_sdata, cs=_cs, reset=_reset ) vfd.digit_length( 16 ) vfd.all_digit_on( )
Ce qui produisit un "Hourra" dès que l'écran s'illumina :-)
Commande ALL DIGIT DISPLAY ON Pas facile de prendre une photo sans flash => Photo un peu floue |
Le dépôt GitHub
Fonctionnalités avancées
- Envoi de commande
- Envoi de caractères (chaîne de caractères)
- Définition de caractères personnalités (RAM1 à RAM16)
- Contrôle individuel des segments.
Chaque Digit (position sur l'afficheur) peut contenir jusqu'à 35 segments! - Activation des symboles (et leur identification)
Disposition des Digits sur l'afficheur |
Un digit pouvant être associé a un ensemble de symboles, il faut identifier chaque segments du Digit pour savoir quel symbole sera allumé sur l'afficheur.
Détails du 15ieme digit de l'afficheur |
vfd =VFD_M6604( sck=_sck, sdata=_sdata, cs=_cs, reset=_reset ) vfd.digit_length( VFD_LEN ) d15 = vfd.attach_digit( digit_idx=15, ram_idx=RAM15 ) d15.set( 28, True ) d15.set( 19, True ) d15.set( 26, True ) d15.set( 27, True ) d15.update()
Dépôt GitHub
La bibliothèque, code d'exemple et documentation (en anglais) sont maintenant disponible dans le dépôt
- micropython-M66004-VFD (GitHub, MCHobby)
La suite du projet
Ce projet n'est pas encore achevé.
Il serait intéressant de pouvoir contrôler l'afficheur via:
- WiFi,
- liaison série
- liaison USB-Serie
Cela permettrait même de contrôler l'afficheur depuis un ordinateur :-)
Ce qui manque surtout à ce projet c'est un étage d'alimentation adéquat.
J'utilise des alimentations de laboratoire pour générer les alimentations nécessaires.
J'espère que vous avez trouvé cet article intéressant.
Dominique