Go Down

Topic: [Projet] Minitel arcade game (Read 13148 times) previous topic - next topic

Artouste


Bonjour,

oui ce code (enfin l'original) fonctionne bien, nous nous en sommes servi comme base à plusieurs reprises au Tetalab à Toulouse pour des projets utilisant le minitel...


http://tetalab.org/blog/update-webcam-pour-minitel-%C3%A7a-manquait

voir aussi en milieu/bas de page ici http://tetalab.org/blog/11

je vais faire venir les softeux qui ont bossé dessus sur ce post  8)

Lionel


sympa  8)

sauf erreur de ma part et juste sur ça :

Quote
Enfin un Arduino permet de faire l'adaptation de niveau et transfert les datas en 7 bits + parité à 1200 bps (a donf quoi !!!) vers le minitel et le tout en softwareSerial


les minitels étaient  pour ce qui concerne la vitesse par la DIN switchable soft (ou clavier) en 1200,2400,4800 , encore plus à donf quoi !   :smiley-mr-green:

teta-phil

En effet, c'est possible via des commandes spécifiques. Je suis en train de faire une lib pour les fans hardcore de ce hardware.

Sinon, voila un bout de code qui montre ce qu'il est possible de faire graphiquement avec un minitel
http://www.tetalab.org/system/resources/BAhbBlsHOgZmIjQyMDEyLzAxLzA1LzE3XzQ5XzI1Xzk4NV9taW5pdGVsX2RlbW9fdGV4dGUyLnBkZQ/minitel_demo_texte2.pde

Ce code fonctionne avec ce setup
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1271350467

Perso, j'ai pas mis de résistance. Cependant, faites bien attention au câblage, je connais des gens qui ont cramé leur ATMEGA (et presque leur port USB) avec un mauvais brochage du connecteur DIN

Monstercrunch

Ouah ! merci pour toutes ces réponses ! Je suis honoré que des membres du tetalab viennent me fournir un peu d'aide. J'ai entendu parler de vous dans un Science et vie, et j'avais adoré l'article !

Pour ce qui est du montage, il est assez simple, donc je vais faire attention de pas me tromper, mais pour le coup je flippe de griller ma uno toute neuve  :smiley-sad-blue:

Je vais tester le code que vous m'avez passé, et je verrai ensuite ce que je peux faire. Cependant, c'est pas pour tout de suite, j'ai un bac blanc sur le feu  =(

Merci +

Snootlab

(...)
Perso, j'ai pas mis de résistance. Cependant, faites bien attention au câblage, je connais des gens qui ont cramé leur ATMEGA (et presque leur port USB) avec un mauvais brochage du connecteur DIN

OUep, il y a un 12V (noté alim) sur le connecteur DIN... il ne faut pas le laisser trainer...
- Distributeur officiel Arduino - France

Monstercrunch


En effet, c'est possible via des commandes spécifiques. Je suis en train de faire une lib pour les fans hardcore de ce hardware.

Sinon, voila un bout de code qui montre ce qu'il est possible de faire graphiquement avec un minitel
http://www.tetalab.org/system/resources/BAhbBlsHOgZmIjQyMDEyLzAxLzA1LzE3XzQ5XzI1Xzk4NV9taW5pdGVsX2RlbW9fdGV4dGUyLnBkZQ/minitel_demo_texte2.pde

Ce code fonctionne avec ce setup
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1271350467

Perso, j'ai pas mis de résistance. Cependant, faites bien attention au câblage, je connais des gens qui ont cramé leur ATMEGA (et presque leur port USB) avec un mauvais brochage du connecteur DIN


Je l'ai dl, j'ai remplacé les Serial.print par Serial.write, ainsi que les ", BIN" que j'ai retiré. Rien ne s'affiche sur l'écran, mais je peux écrire avec le clavier.

skywodd

Salut,


Je l'ai dl, j'ai remplacé les Serial.print par Serial.write, ainsi que les ", BIN" que j'ai retiré. Rien ne s'affiche sur l'écran, mais je peux écrire avec le clavier.

Je viens de tester sur mon minitel v1 avec le code ci dessous et arduino 1.0, l'affichage marche mais le clavier semble bugger ...

Code: [Select]

// Commandes de mise en page
byte gauche = 8;
byte droite = 9;
byte bas = 10;
byte haut = 11;
byte debutDeLigne = 13;
byte hautGauche = 30;
byte hautGaucheEfface = 12;
byte separateurDeSousArticle = 31;
byte remplissageEspace = 24; //Remplit le reste da la rangée avec des espaces

void setup() {

  UCSR1C = B00100100; // passage en mode 7bits + bit de parité
  Serial1.begin(1200);

  presentation(); // écran de démarrage
  Serial.begin(9600); // pour debug



}

void loop() {

  //Serial.print(menu()); //(Pour debug seulement)
  switch (menu())
  {
  case 49 :
    fakebook();
    break;
  case 50 :
    credits();
    break;
  }

}

void presentation() {
  int i =0;

  Serial1.write(hautGaucheEfface);

  while(i<11)
  {
    Serial1.write(bas);
    i++;
  }
  i=0;

  while(i<16)
  {
    Serial1.write(droite);
    i++;
  }

  Serial1.write(27);
  Serial1.write(79); //Grossit la police
  Serial1.print("MiniOS");
  Serial1.write(27);
  Serial1.write(76); //Police normale
  Serial1.write(bas);
  Serial1.write(bas);
  i = 0;
  while(i<13)
  {
    Serial1.write(gauche);
    i++;
  }
  Serial1.print("The Minitel OS");
  i=0;
  while(i<6)
  {
    Serial1.write(bas);
    i++;
  }
  i=0;

  while(i<22)
  {
    Serial1.write(droite);
    i++;
  }
  Serial1.write(27);
  Serial1.write(72); // clignotement
  Serial1.print("Appuyez sur une touche...");
  Serial1.write(27);
  Serial1.write(73); // fixe

  Serial.write(7);
  while(Serial1.available() <= 0) { 
  }
  Serial1.read(); // Attente d'une touche

}

int menu(){
  Serial1.write(hautGaucheEfface);
  Serial1.write(27);
  Serial1.write(77); // lettres de double hauteur
  Serial1.write(bas);
  Serial1.print("                ### Menu ###");
  Serial1.write(27);
  Serial1.write(76); //Police normale

  Serial1.write(bas);
  Serial1.write(bas);
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("1 - Fakebook");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("2 - Credits");
  int inByte = 0;

  while(Serial1.available() <= 0) { 
  }
  Serial1.write(hautGaucheEfface);
  inByte = Serial1.read();

  return inByte;

}
void fakebook(){
  Serial1.write(hautGaucheEfface);
  Serial1.write(bas);
  Serial1.write(27);
  Serial1.write(77); // lettres de double hauteur
  Serial1.print(" 3615  ");
  Serial1.write(27);
  Serial1.write(79); // lettres de double grandeur
  Serial1.print("FACEBOOK");
  Serial1.write(27);
  Serial1.write(77); // lettres de double hauteur
  Serial1.write(bas);
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("Amis               Mon Statut");
  Serial1.write(27);
  Serial1.write(76); // police normale
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("- Mikou Coco      ......................");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("- Matthieu Gaill  ......................");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("- Nielsou Ptich   ......................");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("- Mel Gormany     ......................");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("                  ......................");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("- voir mes amis        valider le statut");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("                           ");
  Serial1.write(27);
  Serial1.write(93); //Inversion de fond
  Serial1.print(" ENVOI ");

  Serial1.write(27);
  Serial1.write(76);
  Serial1.write(27);
  Serial1.write(92); //Inversion de fond // police normale
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("----------------------------------------");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.write(27);
  Serial1.write(77); // lettres de double hauteur

  Serial1.print("  Actualites :");

  Serial1.write(27);
  Serial1.write(76); // police normale
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("        Soranne Guilly :");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print(" A vu des screenshots du prochain");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print(" Windows 2.1!");



  while(Serial1.available() <= 0) { 
  }
  Serial1.read(); // Attente d'une touche
}

void credits() {
  Serial1.write(hautGaucheEfface);
  Serial1.print("MiniOS by Ronan Gaillard");
  Serial1.write(bas);
  Serial1.write(debutDeLigne);
  Serial1.print("Powered by Arduino");
  while(Serial1.available() <= 0) { 
  }
  Serial1.read(); // Attente d'une touche
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Monstercrunch

J'essaye de l'envoyer sur la carte sans le modifier mais j'ai:
Code: [Select]
"UCSR1C was not declared in this scope
Je le remplace donc par UCSR0C, et ça me dit:
Code: [Select]
'Serial1' was not declared in this scope
Je le remplace donc tous les 'Serial1' par 'Serial'.

Au final, rien ne s'affiche. Mais je pense que je vais utiliser le bout de code qui fonctionnait pour travailler dessus, tant pis pour les autres exemples...  :~

skywodd


J'essaye de l'envoyer sur la carte sans le modifier mais j'ai:
Code: [Select]
"UCSR1C was not declared in this scope
Je le remplace donc par UCSR0C, et ça me dit:
Code: [Select]
'Serial1' was not declared in this scope
Je le remplace donc tous les 'Serial1' par 'Serial'.

Au final, rien ne s'affiche. Mais je pense que je vais utiliser le bout de code qui fonctionnait pour travailler dessus, tant pis pour les autres exemples...  :~

Faut une mega pour utiliser mon code que j'ai posté au dessus, sinon il faut supprimer tout les Serial, les remplacer Serial1 par Serial et modifier UCSR1C :

Code: [Select]
// Commandes de mise en page
byte gauche = 8;
byte droite = 9;
byte bas = 10;
byte haut = 11;
byte debutDeLigne = 13;
byte hautGauche = 30;
byte hautGaucheEfface = 12;
byte separateurDeSousArticle = 31;
byte remplissageEspace = 24; //Remplit le reste da la rangée avec des espaces

void setup() {

  UCSR0C = B00100100; // passage en mode 7bits + bit de parité
  Serial.begin(1200);

  presentation(); // écran de démarrage
  //Serial.begin(9600); // pour debug



}

void loop() {

  //Serial.print(menu()); //(Pour debug seulement)
  switch (menu())
  {
  case 49 :
    fakebook();
    break;
  case 50 :
    credits();
    break;
  }

}

void presentation() {
  int i =0;

  Serial.write(hautGaucheEfface);

  while(i<11)
  {
    Serial.write(bas);
    i++;
  }
  i=0;

  while(i<16)
  {
    Serial.write(droite);
    i++;
  }

  Serial.write(27);
  Serial.write(79); //Grossit la police
  Serial.print("MiniOS");
  Serial.write(27);
  Serial.write(76); //Police normale
  Serial.write(bas);
  Serial.write(bas);
  i = 0;
  while(i<13)
  {
    Serial.write(gauche);
    i++;
  }
  Serial.print("The Minitel OS");
  i=0;
  while(i<6)
  {
    Serial.write(bas);
    i++;
  }
  i=0;

  while(i<22)
  {
    Serial.write(droite);
    i++;
  }
  Serial.write(27);
  Serial.write(72); // clignotement
  Serial.print("Appuyez sur une touche...");
  Serial.write(27);
  Serial.write(73); // fixe

  //Serial.write(7);
  while(Serial.available() <= 0) { 
  }
  Serial.read(); // Attente d'une touche

}

int menu(){
  Serial.write(hautGaucheEfface);
  Serial.write(27);
  Serial.write(77); // lettres de double hauteur
  Serial.write(bas);
  Serial.print("                ### Menu ###");
  Serial.write(27);
  Serial.write(76); //Police normale

  Serial.write(bas);
  Serial.write(bas);
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("1 - Fakebook");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("2 - Credits");
  int inByte = 0;

  while(Serial.available() <= 0) { 
  }
  Serial.write(hautGaucheEfface);
  inByte = Serial.read();

  return inByte;

}
void fakebook(){
  Serial.write(hautGaucheEfface);
  Serial.write(bas);
  Serial.write(27);
  Serial.write(77); // lettres de double hauteur
  Serial.print(" 3615  ");
  Serial.write(27);
  Serial.write(79); // lettres de double grandeur
  Serial.print("FACEBOOK");
  Serial.write(27);
  Serial.write(77); // lettres de double hauteur
  Serial.write(bas);
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("Amis               Mon Statut");
  Serial.write(27);
  Serial.write(76); // police normale
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("- Mikou Coco      ......................");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("- Matthieu Gaill  ......................");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("- Nielsou Ptich   ......................");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("- Mel Gormany     ......................");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("                  ......................");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("- voir mes amis        valider le statut");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("                           ");
  Serial.write(27);
  Serial.write(93); //Inversion de fond
  Serial.print(" ENVOI ");

  Serial.write(27);
  Serial.write(76);
  Serial.write(27);
  Serial.write(92); //Inversion de fond // police normale
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("----------------------------------------");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.write(27);
  Serial.write(77); // lettres de double hauteur

  Serial.print("  Actualites :");

  Serial.write(27);
  Serial.write(76); // police normale
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("        Soranne Guilly :");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print(" A vu des screenshots du prochain");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print(" Windows 2.1!");



  while(Serial.available() <= 0) { 
  }
  Serial.read(); // Attente d'une touche
}

void credits() {
  Serial.write(hautGaucheEfface);
  Serial.print("MiniOS by Ronan Gaillard");
  Serial.write(bas);
  Serial.write(debutDeLigne);
  Serial.print("Powered by Arduino");
  while(Serial.available() <= 0) { 
  }
  Serial.read(); // Attente d'une touche
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

#23
May 25, 2012, 10:52 pm Last Edit: May 25, 2012, 11:04 pm by Super_Cinci Reason: 1
Un petit UP...

Bah oui, j'ai une info certainement très utile pour tout le monde : C'est le moment de devenir pote avec le personnel des déchetteries!

Le minitel va vivre ses derniers mois, après 30 ans de bons et loyaux services. la fin programmée en septembre de cette année va inciter les gens à poubéller leurs terminaux.

Je viens à ce titre d'en récupérer un, version 1B Cu< , le grand classique de chez alcatel telic.

Avant même de l'allumer, je l'ai ouvert. que trouve-t-on dedans?

- la din avec le RX/TX et un +13V/1A (idéal pour alimenter un arduino, non?)
- un trou +5V juste à côté pour la résistance de pull-up TX en interne
- une prédécoupe de la forme d'une prise péritel dans le plastique,
- quelques trous bien allignés sur le PCB avec "R", "V", "B", "SYNC", "+5", "+12"...

Alors j'ai fouillé, testé... et oui, ces trous sont à relier directement sur une péritel vers votre poste TV pour voir la même chose que sur le minitel, mais.... EN COULEUR! Oui, la couleur est en natif sur les minitel (8 couleurs, mais bon...), elle est transformée en NB pour envoyer sur l'écran interne via trois ou quatre portes logiques.

Bref, ce petit terminal vaut de l'or pour nous, l'interfaçage avec l'arduino sera très simple, permettant d'afficher de la couleur sur une TV! Même que dans les déchetteries, on va trouver des modèles en couleur dans les mois à venir!

un aperçu des possibilités quand on soude 5 fils dedans :



avec flash pour prouver que la qualité est là :



J'ai écrit cette page directement sur le clavier du minitel. Pour changer un paramètre d'affichage, c'est juste deux touches (soit deux octets à envoyer). Ca marche un peu comme le HTML : on ouvre une balise, on met le texte et on referme la balise. Avec la possibilité de faire sauvegarder la typo et de la rappeler (gain de temps). Pour un terminal de débug gratuit à 4800 bauds, ça vaut le coup, non? c'est (mini)tellement simple!

EDIT : A savoir que là, il est en mode 40x25, on peut le passer en 80x25, mais on perd le contrôle de couleur (selon les versions, le mien passe en magenta et en blanc pour les modes "surlignage"). Il y a un tas de choses à prendre là-dedans! J'imagine que remplacer le processeur par un arduino permettrait de mieux profiter des possibilités du EF9345 (proc vidéo). J'imagine déjà la classe quand tu dois modifier les paramètres de ton montage in situ en branchant un minitel dessus...

skizoh

et bas dit donc j'avais jamais vue ce topic, il est génial, il me faut un minitel :p lol je vais regarder un peut tout ça et pour ton 13V 1A ça me semble être une mauvaise idée :s en générale pour un arduino il faut:

5V - 1A ou 12V - 500 mA enfin je ne suis pas du tout sur de ces chiffres mais je sais que proche des 12V il faut que tu face gaff à pas avoir trop d'intensité et au dessus encore plus donc prend garde, sinon belle trouvaille ce minitel :p

Skizo !

Super_Cinci

#25
May 26, 2012, 08:28 am Last Edit: May 26, 2012, 08:30 am by Super_Cinci Reason: 1

pour ton 13V 1A ça me semble être une mauvaise idée :s en générale pour un arduino il faut:

5V - 1A ou 12V - 500 mA enfin je ne suis pas du tout sur de ces chiffres mais je sais que proche des 12V il faut que tu face gaff à pas avoir trop d'intensité et au dessus encore plus donc prend garde, sinon belle trouvaille ce minitel :p

Skizo !

non, ça marche. On ne le répètera jamais assez : l'ampérage indiqué par une alimentation n'a aucune incidence sur ce qu'on alimente, tant que l'alim fournit plus d'ampères que ce que demande le montage. Mais on peut fouiller dans le minitel pour remplacer le 13V de la prise par le 5V interne si on n'est pas sûr... le 13V est régulé par un LM317 couplé à une diode zener, on peut aussi changer cette zener pour faire descendre la tension de sortie à 5V, mais au risque de multiplier par 2 la puissance dissipée par le LM317... Mais tous les minitels ne proposent pas cette broche d'alimentation (par exemple les modèles Cu2 à Cu4), et la tension n'est pas non plus la même selon les modèles. La doc précise :
Quote

L'alimentation disponible sur la prise présente les caractéristiques suivantes :
- tension : 8.5V minimum au débit maximum, 5V maximum à vide;
- courant : débit d'un ampère maximum dans les conditions normales de fonctionnement.

Mais j'ai vérifié le câblage du régulateur, il est câblé pour donner 13,25V à vide, avec une résistance de 1.1ohm en série, soit une chute de tension de 1.1V pour 1A de débit (donc 12.15V en sortie). Y'a comme un lézard... Je crois qu'ils voulaient dire "15V max à vide"

Reste maintenant à trouver tous les codes qui permettent de configurer le minitel par le port série, car dans ma doc de 190 pages, bien qu'en français, il y en a dans tous les sens!

Ce qui est dommage, c'est que le µP principal ne gère la couleur qu'en mode télétel (40x25 caractères), mais pas en téléinformatique (80x25), alors que le EF9345 sait le faire... et surtout que les codes de mise en page sont complètement différents d'un mode à l'autre.

Il y a plusieurs modes d'affichage :
- télétel / videotex 40x25 (mode de base)
- téléinformatique 80x25 ou 40x25 (ISO 6429), américain ou français
- compatible PAD-X3, mais j'ai pas encore regardé ce que c'était.

:smiley-roll:

Pour info, car j'ai mis 2 heures à comprendre comment faire, le câblage d'une péritel sur le minitel (c'est comme toujours sur le net : tout le monde en parle, mais personne ne donne d'explication) :
Code: [Select]

Minitel => Péritel  // contenu du signal
--------------------------------------------
R => 15  // signal rouge
V => 11  // signal vert
B => 7   // signal bleu
SVH => 20 // synchro verticale et horizontale
0V => 21 et 18 // Ground
5V => 8 et 16  // 8 = commutation automatique de la TV sur péritel : la TV bascule sur l'affichage minitel dès qu'on allume le minitel
                // 16 = commutation rapide, indique à la TV qu'on travaille en RVB. ne pas relier cette broche affichera une image toute blanche.

les broches 8 et 16 ont des fonctions différentes selon le signal qui est dessus, il semblerait qu'en mettant 12V sur la 8, l'image de la TV passe en 4:3...

A pluche!

Go Up