Clavier PS/2 et Arduino (sans bibliothèque dédiée)

Le montage :

Port PS/2
Broche 1 (data) => Broche 4 de l’Arduino
Broche 2 (non connecté)
Broche 3 => GND de l’Arduino
Broche 4 => 5V de l’Arduino
Broche 5 (clock) => Broche 3 de l’Arduino
Broche 6 (non connecté)

Le code Arduino :

///////////////////////////////////////////////////////////////////

const int DATA_PIN = 4;
const int CLOCK_PIN = 3;

///////////////////////////////////////////////////////////////////

void setup() {
  pinMode(DATA_PIN, INPUT);
  // C'est le clavier qui génère l'horloge de synchronisation
  pinMode(CLOCK_PIN, INPUT);
  Serial.begin(9600);
}

///////////////////////////////////////////////////////////////////

void loop() {
  Serial.println(dataRead(),HEX);
}

///////////////////////////////////////////////////////////////////

int dataRead() { // La trame est de 11 bits
/*
  Si la pression est maintenue, le code est envoyé environ toutes
  les 100 ms (make code). Quand la touche est relachée, le clavier
  envoie le code F0 suivi du code de la touche relachée (break
  code), sauf pour quelques touches particulières (voir le fichier
  PDF correspondant ci-dessous).
*/
  byte data = 0;
  while (digitalRead(DATA_PIN) && digitalRead(CLOCK_PIN));
  // 1 bit de start : La ligne de transmission des données est
  // passée au niveau bas et un signal d'horloge est engendré :
  while (digitalRead(CLOCK_PIN));
  while (!digitalRead(CLOCK_PIN));
  // 8 bits de données (bit de poids faible (LSB) en premier)
  for (int d=0; d<=7; d++) {
    // Les données sont valables sur le front descendant
    // du signal d'horloge
    while (digitalRead(CLOCK_PIN));
    data = data | digitalRead(DATA_PIN) << d;
    while (!digitalRead(CLOCK_PIN));
  }
  // 1 bit de parité
  while (digitalRead(CLOCK_PIN));                    
  while (!digitalRead(CLOCK_PIN));
  // 1 bit de stop
  while (digitalRead(CLOCK_PIN));                   
  while (!digitalRead(CLOCK_PIN));
  return data;
}

///////////////////////////////////////////////////////////////////

Les codes obtenus avec le programme Arduino ci-dessus :

Clavier PS/2 (fichier PDF)

Les circuits imprimés sont arrivés

Les circuits imprimés du shield 3615 pour Minitel et Arduino sont arrivés aujourd’hui. J’ai soudé les différents composants du shield : tout est fonctionnel. Pour ceux que ça intéresse, j’ai deux circuits imprimés de cette série en stock (sans les composants donc). Tarif unitaire : 16 € avec les frais de port.

Tweeter avec un Minitel

Le matériel à mettre en oeuvre : Le minitel, le câble DIN-USB, une Arduino Uno, le shield 3615, un Raspberry Pi.

On crée un compte Twitter puis une application Twitter depuis cette adresse : https://apps.twitter.com.

On règle les permissions.

On récupère les clés qui sont dans les 4 zones rouges. Elles seront utilisées ultérieurement dans le fichier Python minitel.py.

Le programme minitel.py utilise Twython.
Il faut donc installer (sudo apt-get install) :
pour Python 2.7 : python-twython / python-oauth / python-oauth2client / python-oauthlib / python-requests-oauthlib
pour Python 3 : python3-twython / python3-oauth / python3-oauth2client / python3-oauthlib / python3-requests-oauthlib

Pour que le programme minitel.py se lance dès qu’on allume le Raspberry Pi, on ajoute la ligne suivante dans le fichier /etc/rc.local :
su -l pi -c "python /home/pi/3615/minitel.py &"

Dans le fichier /boot/cmdline.txt , il faut enlever « console=ttyAMA0,115200 ».

Enfin, pour pouvoir tweeter, le Raspberry Pi doit être à l’heure sinon on a en retour le message « Twitter API returned a 401 (Unauthorized), Timestamp out of bounds. ». J’ai donc ajouté une horloge temps réel sur le Raspberry Pi : http://www.nagashur.com/wiki/doku.php?id=raspberry_pi:ds3231_rtc_horloge

Pour consulter l’heure et la date contenue dans le module :

sudo hwclock

Pour mettre à l’heure le Raspberry Pi manuellement :

sudo date -s "2017-06-18 17:10"
sudo hwclock -w

Pour ce qui concerne l’interface Minitel gérée par l’Arduino, le programme qui utilise Minitel1B_Soft est ici.

Enfin, il reste à relier le shield 3615 au Raspberry Pi :
TX0′ du shield > RXD du Raspberry Pi (broche 10)
RX0′ du shield > TXD du Raspberry Pi (broche 8)
GND du shield > GND du Raspberry Pi (broche 6)

Fabrication du câble Minitel-Shield

Se procurer le matériel suivant :

  • Minitel 1B avec une prise péri-informatique disposant d’une sortie alimentation sur la broche 5 (type Cu5 / Cu; / Cu< / Bu0 et suivants).
  • Cordon USB A mâle – USB B mâle.
  • Fiche Din mâle 5 contacts à 45° avec collier serre-câble.
  • Gaine thermorétractable transparente 1,2 mm avant retreint.

Le principe : On coupe le connecteur USB B du cordon et on le remplace par la fiche Din.

Pour tout comprendre, partons de la documentation du Minitel :

Les numéros de broches sont positionnés de la même manière pour la fiche DIN mâle vue côté soudures.

Concernant le connecteur USB A, nous avons :

Etant donnés les choix faits au niveau du shield 3615 :
D- vers broche 8 de l’Arduino
D+ vers broche 9 de l’Arduino

Etant donnée la ligne de code suivante dans les exemples de la bibliothèque Minitel1B_Soft :
Minitel minitel(8, 9); // RX, TX

Il faudra souder, pour avoir un câble croisé :

  • Le fil vert à la broche 1 de la fiche DIN
  • Le fil noir à la broche 2 de la fiche DIN
  • Le fil rouge à la broche 5 de la fiche DIN
  • Le fil blanc à la broche 3 de la fiche DIN