Afficheur VFD MEDION M18ST05A
Que pouvons faire avec un vieux PC MEDION MD 8800 ? Pas grand chose… sauf que ce dernier est équipé d’un afficheur VFD disposant de deux lignes de 16 caractères formés d’une matrice de 5x7 points.
Ce n’est pas tout, il y a aussi tout un tas de logos, et là, j’me dis «ce serait sympa pour équiper mon serveur de musique» :-)

Etude de la “bête” : une prise quatre conducteurs (courante sur les cartes mères), avec un fil rouge et un noir, «l’alimentation probablement», «mais quelle tension ?», «communication USB ?».
Le manuel de la carte mère MS-7204 VER:1.A nous renseigne sur la tension d’alimentation et le brochage de la prise.

Une recheche internet m’amène sur cette page ou figure la plupart des commandes du M18ST05A.
Nous y apprenons aussi que l’on communique avec le M18ST05A à l’aide d’une liaison série (RS232).
Mon serveur de musique fonctionne sur un Raspberry Pi. Première difficulté (pour un non électronicien), le port GPIO de ce dernier fonctionne en 3V le M18ST05A en 5V… Seconde difficulté, le Raspberry utilise le port série du port GPIO par défaut, cela nécessite une reconfiguration (certe bien documentée sur internet, mais assez longue…).
J’achète donc naïvement un convertisseur USB <—> RS232 histoire de ne pas avoir à mettre les mains dans le cambouis :-) A première vue, le convertisseur nécessite un pilote (qui ne semble pas exister pas sous Linux…), résultat, ce que j’envoie sur le port USB n’est pas du tout bien restitué sur le port RS232…
Finalement j’utilise une carte Arduino qui communique en USB avec le Raspberry. L’inconvénient est que sur l’Arduino, USB et port série sont “liés” ce qui a pour conséquence que tout ce qui est envoyé sur le port série l’est aussi sur l’USB… (une sorte d’écho…)
Le brochage du M18ST05A sur l’Arduino est on ne peut plus simple.
| Arduino | M18ST05A | |
|---|---|---|
| 5V | 5V | |
| GND | GND | |
| TX broche 1 | TX | |
| GND | RX | |
Le code coté Arduino
/*
2016-12-23
Alain Gauthier
Retransmet au module M18ST05A tout ce qui a été reçu sur le port USB
*/
int inByte = 0; // lecture des octets entrants
void setup()
{
// initialise le port série
Serial.begin(9600);
init_VFD();
}
// efface les lignes (pleines suite au téléversement du code dans l'arduino)
void init_VFD(void)
{
delay(2000); // temps nécessaire pour que le module M18ST05A s'initialise (utile à la mise sous tension)
// sélectionne les deux lignes
Serial.write(0x1B);
Serial.write(0x20);
// effacement des lignes
Serial.write(0x1B);
Serial.write('P');
}
void loop()
{
// lit les données si elles sont présentes
if (Serial.available() > 0) {
inByte = Serial.read(); // lit la donnée
Serial.write(inByte); // renvoie la donnée lue
}
}Le code coté Raspberry (ou PC connecté à l’Arduino)
#!/usr/local/bin/python
# -*- coding:Utf-8 -*-
import time
import serial
# configure la liaison série
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
xonxoff=0
)
ser.isOpen()
commande = (chr(0x1B),chr(0x20)) # sélectionne les deux lignes
ser.write(commande) # envoie la commande
commande = (chr(0x1B),chr(0x50)) # efface les lignes sélectionnées
ser.write(commande) # envoie la commande
commande = (chr(0x1B),chr(0x22)) # sélectionne la deuxième ligne
ser.write(commande) # envoie la commande
ser.write("BlaBlaBla") # écrit sur la ligne sélectionnée
commande = (chr(0x1B),chr(0x31),chr(0),chr(62),chr(81),chr(101),chr(105),chr(101),chr(81),chr(62),chr(0)) # sélectionne la deuxième ligne
ser.write(commande) # envoie la commande
ser.close()Commandes du M18ST05A
| code | fonction | |
|---|---|---|
| 0x1B 0x00 M H J M A A | Réglage de l’horloge, valeurs au format BCD (2 chiffres par octet) | |
| 0x1B 0x01 | 24h-EU-Heure/Date (format européen) | |
| 0x1B 0x02 | AM/PM-US-Heure/Date (format anglo saxon) | |
| 0x1B 0x03 | Horloge fixe | |
| 0x1B 0x04 | Horloge mobile | |
| 0x1B 0x05 | Afficher l’horloge | |
| 0x1B 0x30 0 0..3 | Source: HDD (luminosité graduelle de 0 à 3) | |
| 0x1B 0x30 1 0..3 | Source: Fire Wire (graduelle) | |
| 0x1B 0x30 2 0..3 | Source: CD (graduelle) | |
| 0x1B 0x30 3 0..3 | Source: USB (graduelle) | |
| 0x1B 0x30 4 0..3 | Media: Film (graduelle) | |
| 0x1B 0x30 5 0..3 | Media: TV (graduelle) | |
| 0x1B 0x30 6 0..3 | Media: Musique (graduelle) | |
| 0x1B 0x30 7 0..3 | Media: Photo (graduelle) | |
| 0x1B 0x30 8 0..3 | VCR: REC | |
| 0x1B 0x30 9 0..3 | Courrier sortant | |
| 0x1B 0x30 10 0..3 | Courrier entrant | |
| 0x1B 0x30 11 0..3 | Niveau sonore 1 | |
| 0x1B 0x30 12 0..3 | Niveau sonore 2 | |
| 0x1B 0x30 13 0..3 | Niveau sonore 3 | |
| 0x1B 0x30 14 0..3 | Niveau sonore 4 | |
| 0x1B 0x30 15 0..3 | Niveau sonore 5 | |
| 0x1B 0x30 16 0..3 | Niveau sonore 6 | |
| 0x1B 0x30 17 0..3 | Niveau sonore 7 | |
| 0x1B 0x30 18 0..3 | Ligne rouge du niveau sonore | |
| 0x1B 0x30 19 0..3 | Sonore | |
| 0x1B 0x30 20 0..3 | Muet | |
| 0x1B 0x30 21 0..3 | Mini niveau sonore 1 | |
| 0x1B 0x30 22 0..3 | Mini niveau sonore 2 | |
| 0x1B 0x30 23 0..3 | Mini niveau sonore 3 | |
| 0x1B 0x30 24 0..3 | Cadre sources | |
| 0x1B 0x30 25 0..3 | Cadre médias | |
| 0x1B 0x30 26 0..3 | Cadre VCR | |
| 0x1B 0x30 27 0..3 | Cadre courrier | |
| 0x1B 0x31 | 9 octets de données pour définir le symbole VCR | |
| 0x1B 0x32 0..4 | Vitesse de rotation du CD | |
| 0x1B 0x33 0..4 | Vitesse de clignotement du VCR-Rec | |
| 0x1B 0x34 x | Mini niveau sonore éteint | |
| 0x1B 0x20 | Lignes 1 et 2 sélectionnées | |
| 0x1B 0x21 | Ligne 1 sélectionnée | |
| 0x1B 0x22 | Ligne 2 sélectionnée | |
| 0x1B “P” | Ligne(s) effacée(s) | |
| 0x1B “Q” | Curseur en début de ligne | |
| 0x1B “R” | Ligne(s) affichée(s) | |
| 0x1B “S” | Ligne(s) masquée(s) |