Présentation

Ce petit afficheur à cristaux liquides, déniché par mon ami Richard, faisait parti d’un plus grand ensemble composé de trois lignes de quatre afficheurs.

afficheur GV07 AEG-MIS

Notre premier réflexe fut de rechercher des informations sur internet, en vain…
Mes demandes d’informations auprès de la société AEG sont restées vaines elles aussi.

Descriptif et recherche

Il est composé de 8 caractères composés de 38 parties affichables indépendamment.
(3x5 carrés, certains étant divisés en plusieurs parties, donnant au total 38 zones affichables) caractère afficheur GV07 AEG-MI

Il est piloté via un module sur lequel figure un HC245A, un «Octal 3−State Noninverting Bus Transceiver» et trois connecteurs :

  • X1 : connecté au circuit de pilotage ou au module précédent.
  • X2 : connecté au module suivant ou à un «bouchon» électrique de renvoi de signaux au circuit de pilotage.
  • X3 : connecté à l’afficheur

module pour afficheur GV07 AEG-MI (recto verso)

Numérotation des broches des connecteurs.
Numérotation des broches des connecteurs

Voici le schéma électrique partiel d’un module. schéma électronique du module pour afficheur GV07 AEG-MI

Par chance nous avons pu étudier les signaux émis par le circuit de pilotage.
Voltmètre, analyseur logique (USB), oscilloscope et de multiples essais nous ont permis de découvrir la fonction des différentes broches.
L’étude du schéma, plus particulièrement la broche 9 de X3 (renvoyée à sur la broche 15 de X2), nous a appris que les signaux sont émis de manière sériel, donc que la broche 15 est la ligne des données.

Au final, l’afficheur fonctionne via une liaison SPI
Description des broches du connecteur X3 :

  • 1 : data
  • 2 : GND (la masse)
  • 3 : +8,5 volts
  • 4 : Vcc 5 volts
  • 5 : on/off (permet la désactivation de l’affichage, pendant la transmission des données par exemple)
  • 6 : PWM (maintient l’affichage correcte, sinon ça s’efface doucement par la droite)
  • 7 : latch (permet l’affichage des données transmises)
  • 8 : clock (signal d’horloge)
  • 9 : data’ (les données ressortent comme pour un registre à décalage)

programme

Nous avons utilisé une carte Arduino Dueminalove pour piloter notre afficheur.
Voici le programme pour quatre afficheurs en série.

/*
  Pilotage de 4 afficheurs LCD (GV07 AEG-MIS) de 8 caractères de 38 segments en série.

  Alain Gauthier
  juin 2019
*/

#include "SPI.h"

// pin 11     MOSI       A1 broche 1
//                          broche 2 VCC 5V
//                          broche 3 VCC 8,5 V
//                          broche 4 GND
int displayOnOff = 5; // A5 broche 5 low on - high off
int pwmPin = 6;       // A4 broche 6 - ce qui empêche l'écran de s'effacer sur la droite
int displayLatch = 4; // A3 broche 7 - latch ou SS et SPI (Slave Select)
// pin 13     clock      A2 broche 8
//                          broche 9 - non connectée - renvoi des données sérielles à l'afficheur suivant

// pin 12     MISO

const int nbAfficheurs = 4;
const int nbCaracteres = 8;
const byte octetsParCaractere = 5;

const int nbLettresAlphabet = 66;
const byte offsetCodeASCII = 32;
const uint8_t sensLectureOctet = MSBFIRST;

int displayLatchs = B00010000; // un latch par bit...


typedef struct
{
  byte codeDuGlyphe[octetsParCaractere];
} glyphe;

glyphe alphabet[nbLettresAlphabet] {
  { 0, 0, 0, 0,  0},          // espace 32
  { 64, 4, 62, 48,  128},     //    !   33
  { 0, 3, 193, 192,  0},      //    "   34
  { 0, 0, 0, 0,  0},          //    #   35
  { 0, 0, 0, 0,  0},          //    $   36
  { 3, 1, 241, 179,  96},     //    %
  { 0, 0, 0, 0,  0},          //    &
  { 0, 1, 240, 32,  0},       //    '
  { 64, 0, 9, 78,  108},      //    (
  { 91, 115, 72, 0,  0},      //    )
  { 3, 95, 0, 91,  96},       //    *
  { 4, 252, 54, 63,  144},    //    +
  { 68, 0, 0, 0,  0},         //    ,
  { 0, 124, 32, 31,  128},    //    -
  { 64, 0, 0, 0,  0},         //    .
  { 0, 1, 240, 51, 110 },     //    /
  { 91, 127, 73, 95,  108},   //    0   48
  { 124, 132, 62, 112,  158}, //    1
  { 120, 31, 105, 19,  236},  //    2
  { 91, 127, 105, 16,  140},  //    3
  { 59, 127, 225, 217,  128}, //    4
  { 91, 76, 233, 217,  140},  //    5
  { 91, 76, 105, 95,  236},   //    6
  { 59, 127, 105, 16,  128},  //    7
  { 91, 95, 105, 91,  236},   //    8
  { 91, 127, 105, 89,  140},  //    9
  { 64, 4, 32, 16,  128},     //    :
  { 0, 0, 0, 0,  0},          //    ;
  { 0, 0, 0, 0,  0},          //    <
  { 7, 131, 22, 96,  112},    //    =
  { 0, 0, 0, 0,  0},          //    >
  { 0, 0, 0, 0,  0},          //    ?
  { 0, 0, 0, 0,  0},          //    @
  { 59, 127, 105, 95,  238},  //    A   65
  { 91, 95, 105, 223,  238},  //    B
  { 88, 0, 73, 79,  108},     //    C
  { 91, 123, 73, 207,  110},  //    D
  { 120, 4, 233, 223,  238},  //    E
  { 0, 4, 233, 223,  238},    //    F
  { 91, 124, 73, 79,  108},   //    G
  { 59, 127, 225, 223,  238}, //    H
  { 68, 132, 62, 48,  144},   //    I
  { 91, 123, 192, 0,  108},   //    J
  { 59, 77, 241, 255,  238},  //    K
  { 120, 0, 1, 207,  110},    //    L
  { 59, 123, 243, 239,  110}, //    M
  { 59, 127, 227, 239,  110}, //    N
  { 91, 123, 73, 79,  108},   //    O
  { 0, 31, 105, 223,  238},   //    P
  { 123, 251, 73, 79,  108},  //    Q
  { 59, 95, 105, 223,  238},  //    R
  { 91, 76, 105, 89,  140},   //    S
  { 68, 132, 255, 176,  144}, //    T
  { 91, 123, 193, 207,  108}, //    U
  { 77, 251, 193, 207,  88},  //    V
  { 59, 127, 225, 255,  110}, //    W
  { 59, 95, 225, 219,  110},  //    X
  { 68, 159, 225, 217,  144}, //    Y
  { 120, 1, 249, 179,  110},  //    Z
  { 0, 0, 0, 0,  0},          //    [
  { 0, 0, 0, 0,  0},          //    "\"
  { 0, 0, 0, 0,  0},          //    ]
  { 0, 0, 0, 0,  0},          //    ^
  { 0, 0, 0, 0,  0},          //    _
  { 0, 0, 0, 0,  0},          //    `
  { 0, 31, 73, 89,  128},     //    "a" = degrés
};


void latch (void) {
  // passe à 1 la broche 4
  PORTD = PORTD | displayLatchs;
  delay(10);
  // passe à 0 la broche 4
  PORTD = PORTD & (~displayLatchs);
}

void displayOn () {
  digitalWrite(displayOnOff, LOW);
}

void displayOff () {
  digitalWrite(displayOnOff, HIGH);
}

void clearDisplay (void) {
  int nbOctets = nbAfficheurs * nbCaracteres * octetsParCaractere;

  for (byte i = 0; i < nbOctets; i++) {
    envoie(0);
  }
  latch();
}

void envoiePhrase(String laPhrase) {
  displayOff ();
  for (int noLettre = laPhrase.length() - 1; noLettre >= 0 ; noLettre--) {
    envoieLettre( laPhrase[noLettre] - offsetCodeASCII);
  }
  latch();
  displayOn ();
}

void envoieLettre (byte lettre) {
  for (byte i = 0; i < octetsParCaractere; i++) {
    envoie (alphabet[lettre].codeDuGlyphe[i]);
  }
}

void envoie (uint8_t val) {
  SPI.transfer(val);
  delay(1);
}

void setup() {
  pinMode(displayOnOff, OUTPUT);
  analogWrite(pwmPin, 128);
  pinMode(displayLatch, OUTPUT);

  digitalWrite(displayLatch, LOW);

  SPI.begin();
  SPI.setDataMode(1);
  SPI.setBitOrder(MSBFIRST);
}

void loop() {
  delay(2000);
  clearDisplay ();
  envoiePhrase("DISPLAY GV07    AEG-MIS");

  delay(2000);
  clearDisplay ();
  envoiePhrase("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

  delay(2000);
  clearDisplay ();
  envoiePhrase("0123456789      !\"%'()*+-/:=a");

  delay(2000);
  clearDisplay ();
  envoiePhrase("ATELIER D'ALGAU HTTP:// ALGAU.EU");
}