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» :-)

afficheur VFD M18ST05A recto afficheur VFD M18ST05A verso

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.
connecteur M18ST05A
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)