Arduino + Mémoire + Minitel

Un log shield sur carte SD avec horloge RTC et zone de prototypage à pastilles carrées

Arduino + Mémoire + Minitel

Message non lude Zigazou » Mer 3 Oct 2012 08:05

Bonjour,

voici un projet sur lequel je travaille et qui nécessite la mezzanine Mémoire.

Il est destiné à une association qui fait de la sauvegarde de patrimoine industriel et technique. Le but est de réutiliser des Minitel pour présenter des informations à l’ancienne.

Pour ne pas être limité par le nombre de pages, j’utilise le module Mémoire afin de pouvoir les récupérer sur une carte SD. Ce qui facilite également la mise à jour.

Face à la vitesse du Minitel, les temps d’accès et de lecture sur carte SD sont très rapides. Cela permet de limiter l’utilisation mémoire de l’Arduino au strict minimum. Par exemple, les actions générées par une touche sont relues à chaque fois.

Le programme utilise la bibliothèque SoftwareSerial.

À terme, le montage sera alimenté directement par le Minitel

1348909892099.jpg
La mezzanine Mémoire montée sur l’Arduino avec sa carte SD de 16 Mo
1348909892099.jpg (74.66 Kio) Vu 11969 fois


Voici le résultat en vidéo :


Code: Tout sélectionner
#include <SD.h>
#include <SoftwareSerialMinitel.h>

// Broches du port série logiciel
#define rxPin 2
#define txPin 3

// Broche du lecteur de carte SD
#define chipSelect 10

// Définition du port série logiciel
SoftwareSerialMinitel minitelSerial(rxPin, txPin); // (RX/TX)

// Garde trace des noms des fichiers de page et commandes en cours
String pageActuelle;
String commandesActuelles;

void setup() {
  // Activation du port série logiciel
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  minitelSerial.begin(1200);

  // Force la broche 10 en OUTPUT
  pinMode(10, OUTPUT);
 
  // Test si la carte SD est disponible et lisible
  if (!SD.begin(chipSelect)) {
    minitelSerial.println("Impossible de lire la carte SD");
    return;
  }

  // Passe à 4800 bps
  minitelSerial.write(0x1b);
  minitelSerial.write(0x3a);
  minitelSerial.write(0x6b);
  minitelSerial.write(0x76);

  delay(500);
  minitelSerial.begin(4800);

  // Affiche la page racine
  afficherPage("racine.vdt");
}

void loop() {
  long touche;

  // Un caractère a été envoyé par le Minitel
  touche = lireTouche();

  if(touche != 0) executerTouche(touche);
}

long lireTouche() {
  long touche = 0;

  while(minitelSerial.available() > 0) {
    touche = (touche << 8) + minitelSerial.read();

    // Petit délai pour voir si le minitel n’a pas d’autres caractères à envoyer
    delay(20);
  } 

  return touche;
}

void afficherPage(char *page) {
  char nomFichier[64];
  File vdtFile;

  // Copie le nom de la page
  pageActuelle = String(page);

  // Génère le nom du fichier de commandes à partir du nom de fichier de la page
  commandesActuelles = pageActuelle;
  commandesActuelles.replace(".vdt", ".cmd");

  // Ouvre la page à afficher
  pageActuelle.toCharArray(nomFichier, sizeof(nomFichier));
  vdtFile = SD.open(nomFichier);

  // Affiche la page caractère par caractère
  while(vdtFile.available()) minitelSerial.write(vdtFile.read());

  // Ferme le fichier
  vdtFile.close();
}

void executerTouche(long touche) {
  char nomFichier[64];
  union {
    char raw[32];
    struct {
      long touche;
      char page[28];
    } data;
  } enregistrement;

  File cmdFile;
  int i;
  int trouve;

  // Récupère le nom du fichier de commandes
  commandesActuelles.toCharArray(nomFichier, sizeof(nomFichier)); 
  cmdFile = SD.open(nomFichier);

  // Le fichier de commandes est un fichier d’enregistrements
  trouve = 0;
  while(cmdFile.available()) {
    // Lit un enregistrement
    for(i = 0; i < 32; i++) enregistrement.raw[i] = cmdFile.read();

    if(touche == enregistrement.data.touche) {
      // La touche a été trouvée, on n’en cherche pas d’autres
      trouve = 1;
      break;
    }
  }

  // Ferme le fichier
  cmdFile.close();

  // La page est affichée seulement maintenant car SD ne peut ouvrir qu’un fichier à la fois
  if(trouve == 1) afficherPage(enregistrement.data.page);
}


memoireminitel-vdt.zip
Les fichiers à mettre sur une carte SD pour reproduire ce que vous voyez sur la vidéo
(6.02 Kio) Téléchargé 528 fois


La génération des fichiers est réalisée à partir d’une bibliothèque Python qui est encore en cours de développement (et surtout qui a peu de rapport avec l’Arduino et la mezzanine Mémoire ;-) )

Note : le programme fait passer le Minitel en 4800 bps ;-) La vitesse rendue dans la vidéo est donc 4 fois plus rapide que le standard du Minitel…
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34

Re: Arduino + Mémoire + Minitel

Message non lude Stéphane » Mer 3 Oct 2012 08:55

Excellent !

Les copains du tetalab ont également pas mal de bricolages à partir de minitel, ça fait plaisir de voir d'autre personnes bricoler autour de ça !

Merci pour ton partage Zigazou :)
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: Arduino + Mémoire + Minitel

Message non lude Zigazou » Mer 3 Oct 2012 09:30

Stéphane a écrit:Les copains du tetalab ont également pas mal de bricolages à partir de minitel,
Oui, j’ai vu ce qu’il faisait aussi ;-)

Stéphane a écrit:Merci pour ton partage Zigazou :)
De rien ! Ne reste plus qu’à récupérer un Arduino Mega pour créer un serveur Minitel 4 voies et le monde sera à moi :lol:
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34

Re: Arduino + Mémoire + Minitel

Message non lude phil » Jeu 4 Oct 2012 10:29

Bonjour,

tout d'abord, bravo pour ta réalisation, c'est vraiment sympathique.
Etant fan hardcore de minitel, cela me tarde que tu partage ta lib python !!!

Enfin deux petites questions :
1 ou est ce que tu as trouvé la séquence pour le passage en 4800 ?
( minitelSerial.write(0x1b);
minitelSerial.write(0x3a);
minitelSerial.write(0x6b);
minitelSerial.write(0x76);)

2 - est ce que tu n'as pas des problème avec l’écho local ?
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino + Mémoire + Minitel

Message non lude Zigazou » Ven 5 Oct 2012 08:06

phil a écrit:Etant fan hardcore de minitel, cela me tarde que tu partage ta lib python !!!
Je la peaufine et ne manquerais pas de la partager ;-)

phil a écrit:1 ou est ce que tu as trouvé la séquence pour le passage en 4800 ?
( minitelSerial.write(0x1b);
minitelSerial.write(0x3a);
minitelSerial.write(0x6b);
minitelSerial.write(0x76);)
Plusieurs dont les deux principales sont :

Le premier, c’est la bible technique du Minitel 1B, TOUT y est expliqué… mais il faut chercher un peu car la recherche full-text ne fonctionne pas :-(

Le second te donne juste les codes mais il permet d’avoir ceux du Minitel 2 (notamment la redéfinition de caractères).

Les séquences 1B39, 1B3A et 1B3B correspondent aux séquences Protocole. 1B39 indique qu’un seul octet suit, 1B3A deux octets et 1B3B trois octets.

phil a écrit:2 - est ce que tu n'as pas des problème avec l’écho local ?
Au début oui. Mais depuis, j’ai rencontré le STUM1B et j’ai découvert une totale liberté de pensée cosmique vers un nouvel âge réminiscent… oups, je digresse :lol:

Dans le STUM1B, il t’explique comment fonctionne le système d’aiguillage des différents modules du Minitel.

Pour couper court, il faut envoyer la séquence 1B3B615852 pour activer l’écho et la séquence 1B3B605852 pour le désactiver. Les deux commandes gère l’aiguillage du modem vers la prise péri-informatique. Et hop ! Fini l’écho qui chagrine et les touches du clavier restent aiguillées vers la prise péri-informatique !
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34

Re: Arduino + Mémoire + Minitel

Message non lude phil » Ven 5 Oct 2012 10:27

super !!!

Merci pour toutes ces informations :)

Je te laisse, j'ai du pain spiritique sur la planche... ;) J'ai récupéré un Minitel 2 couleur, c'est parti pour du DRCS...
Dernière édition par phil le Ven 5 Oct 2012 11:40, édité 1 fois.
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino + Mémoire + Minitel

Message non lude Zigazou » Ven 5 Oct 2012 10:53

phil a écrit:J'ai récupérer un Minitel 2 couleur, c'est parti pour du DRCS...

Raaah ! Je n’ai que des Minitel monochrome (1, 1B et 2).

Pour le DRCS : il faut encoder par paquet de 6 bits. Quand tu as 6 bits, tu ajoutes 0x40 pour obtenir le caractère à émettre. Comme les matrices sont de 8×10 (80 bits), il faut envoyer 14 caractères (6×14 = 84 bits, les 4 derniers bits à mettre à 0).
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34

Re: Arduino + Mémoire + Minitel

Message non lude phil » Ven 5 Oct 2012 11:44

Zigazou a écrit:Pour le DRCS : il faut encoder par paquet de 6 bits. Quand tu as 6 bits, tu ajoutes 0x40 pour obtenir le caractère à émettre. Comme les matrices sont de 8×10 (80 bits), il faut envoyer 14 caractères (6×14 = 84 bits, les 4 derniers bits à mettre à 0).


Oula, pas bien compris...
Tu as un exemple ?
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino + Mémoire + Minitel

Message non lude Zigazou » Ven 5 Oct 2012 12:59

phil a écrit:Oula, pas bien compris...
Tu as un exemple ?


Prenons un caractère de 8×10 pixels représentant un rectangle. 1=pixel allumé, 0=pixel éteint
Code: Tout sélectionner
████████ → 11111111
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
█░░░░░░█ → 10000001
████████ → 11111111

Si on travaillait sur 8 bits, on pourrait le coder comme suit 0b11111111 → 0xFF, 0b10000001 → 0x81. Manque de bol, le Minitel fonctionne sur 7 bits. Pire encore, les codes < 32 sont réservés et les valeurs que l’on peut soumettre au Minitel (norme vidéotex) vont de 0x40 à 0x7F. Cela nous laisse donc 64 valeurs possible, codables sur 6 bits (2^6 = 64).

On va donc prendre tous les bits du dessus, les mettre les uns à la suite des autres et les regrouper par paquets de 6 et rajouter 4 bits à 0 car 80 n’est pas divisible par 6 :
Code: Tout sélectionner
11111111-10000001-10000001-10000001-10000001-10000001-10000001-10000001-10000001-11111111
↓↓↓↓
11111111100000011000000110000001100000011000000110000001100000011000000111111111
↓↓↓↓
111111-111000-000110-000001-100000-011000-000110-000001-100000-011000-000110-000001-111111-11
↓↓↓↓
111111-111000-000110-000001-100000-011000-000110-000001-100000-011000-000110-000001-111111-110000

En code hexa, ça nous donne la séquence suivante :
Code: Tout sélectionner
111111-111000-000110-000001-100000-011000-000110-000001-100000-011000-000110-000001-111111-110000
↓↓↓↓
3F-34-06-01-20-18-06-01-20-18-06-01-3F-30

Comme dit précédemment, on ne peut pas envoyer ces valeurs directement au Minitel, il faut qu’elles soient comprises entre 0x40 et 0x7F, on ajoute donc 0x40 à chacune des valeurs :
Code: Tout sélectionner
3F-34-06-01-20-18-06-01-20-18-06-01-3F-30
↓↓↓↓
7F-74-46-41-60-58-46-41-60-58-46-41-7F-70

Voilà, notre séquence est prête, il ne reste plus qu’à l’empaqueter dans la commande de définition DRCS :
Code: Tout sélectionner
7F-74-46-41-60-58-46-41-60-58-46-41-7F-70
↓↓↓↓
1F-23-20-20-20-43-49 (rentre dans le mode définition de caractères du jeu graphique G’1)
1F-23-21-30-7F-74-46-41-60-58-46-41-60-58-46-41-7F-70-30 (définition du caractère 0x21
1F-41-41 (sort du mode définition de caractères)

(j’ai fait ça de tête et sans Minitel sous la main, ça devrait marcher sauf erreur…)
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34

Re: Arduino + Mémoire + Minitel

Message non lude phil » Ven 5 Oct 2012 13:24

(j’ai fait ça de tête et sans Minitel sous la main, ça devrait marcher sauf erreur…)

:shock: Respect !!!!

Merci pour le coup de main
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino + Mémoire + Minitel

Message non lude christianc » Jeu 27 Fév 2014 15:58

Bonjour,

j'aurais aimé essayer votre programme avec le minitel, mais ou trouve t'on la

librairie SoftwareserialMinitel ? peut etre l' avez vous encore


a bientôt

Christian
christianc
 
Messages: 1
Inscription: Jeu 27 Fév 2014 15:50

Re: Arduino + Mémoire + Minitel

Message non lude phil » Ven 28 Fév 2014 10:09

bonjour,

pour jouer avec des minitels, il y a cette librairie qui est pas mal du tout (merci le GRL)
https://github.com/01010101/Minitel
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19


Retourner vers Mémoire

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron