Décodage d'un cadran à impulsions type S63

Posted on Jan 06 - by tetalab

 S63gris


Un téléphone de ce type, ça me fais rêver !
Je passe encore de longues minutes ( pas des heures, faut pas exagérer..) à tourner le cadran en m’extasiant devant la mécanique du régulateur centrifuge, du codeur à rocher, de la simplicité du principe de numérotation décimale. Et je pense également à une poubelle que j'ai vue dans ma jeunesse; une armoire de central téléphonique électro-mécanique !!!! Imaginez, monté sur des panneaux, des centaines d’aiguilleurs électro-mécaniques à 10 positions, qui avancent à chaque impulsion. Des tonnes de ferraille qui aujourd'hui tiennent dans un seul composant de silicium... Je rêve, je vous dis!
Bref..... On peux pas jeter un truc pareil ! Je vous propose de nous intéresser à la partie numérotation, pour en faire ce que vous voulez. A partir de Arduino, bien sûr!
Voilà le schéma d'un poste S63 d'origine, complet. Nous allons nous intéresser uniquement à la partie cadran, le rond en haut et à gauche. Ce que le schéma montre mal, c'est que il y a 2 contacts indépendants. Un premier, avec des câbles bleu et blanc-bleu, n'est ouvert que lorsque le cadran est au repose. Il court-circuite micro et écouteur pour éviter entre autres des générer des bruits désagréables pour l'utilisateur lors de la rotation.

Schéma Original S63Détail Cadran

Le second, celui qui nous intéresse, en rouge et blanc-rouge, s'ouvre à chaque impulsion. Il y a 1 impulsion pour le 1 et 10 pour le 0. Chez nous. Dans d'autres pays, ça peux varier. Méfiez-vous des importations.
"Et que peux-on en faire ? " me diriez-vous ! "Ce que bon vous semble, dans la limite de la décence" vous réponds-je.
Par contre, je peux vous dire comment le faire; avec une Arduino, comme d'habitude, ou d'un AtTiny (mais il faut supprimer les commentaires bien sûr), car l'énorme avantage de ce truc, c'est de n'exiger qu'un seul pin de libre, contrairement à un clavier matriciel. En plus, c'est bien plus classe.
Donc le programme;
------------------------------------------------------------------------------------------------------------------------------------------------------

/* Décodage pour cadran à impulsion type S63
Philippe Martorell
le 6/01/2014
*/
const int PinLecture = 2 ; // Entrée lecture impulsions
const boolean Bavard = 1 ; // Génére les commentaires sur le port série
const boolean Debug = 1 ; // Génére les mesures de temps
/*
Pour compiler avec un AtTiny,
il suffit de mettre à "0" les deux constantes précédentes
Pensez bien que l'envoi sur le port série prend du temps.
C'est importatnt dans les mesures des impulsion.
*/
boolean PlusDuneFois = 1 ; // pour éviter la répétition de commentaire
unsigned long TempsImpulsionMin = 50 ;
unsigned long TempsImpulsionMax = 90 ;
unsigned long TempsInterImpulsionMin = 25 ;
unsigned long TempsInterImpulsionMax = 50 ;
unsigned long TempsInterNumero = 200 ;
unsigned long rebonds = 2 ;
unsigned long duree = 0;
unsigned long temps = 0 ;
int Numero = 0 ;

void setup()
{
 if (Debug || Bavard) // Si les deux à 0, on initialise pas
  {
   Serial.begin(115200);
   Serial.println ("Initialisation Serie") ;
  }
 pinMode(PinLecture , INPUT);
 digitalWrite(PinLecture , HIGH);
}
void loop()
{
 Numero = 0 ;
 delay ( rebonds );
 while ( !digitalRead(PinLecture) )
  {
   if ( PlusDuneFois == 1 && Bavard == 1 )
   {
    Serial.println ("Attente") ;
    PlusDuneFois = 0 ;
   }
  }
 temps = millis() ;
 if (Debug == 1 )
 {
  debug();
 }
 PlusDuneFois = 1 ;
 delay ( rebonds );
 int Numero = 0 ;
 numerotation () ;
 delay ( rebonds );
}

void numerotation()
{
 while (1) //Boucle infinie, on ne sort qu'avec les "return"
 {
  if ( Bavard == 1 )
  {
   Serial.println ("Entree impulsion") ;
  }
  while ( digitalRead(PinLecture) )
  {
   duree = millis() - temps ;
   if ( duree > TempsImpulsionMax )
   {
    if ( Bavard == 1 )
    {
     Serial.println ("Impulsion trop longue") ;
    }
    debug();
    return ;
   }
  }
  if (millis() - temps < TempsImpulsionMin )
  {
   if ( Bavard == 1 )
   {
    Serial.println ("Impulsion trop courte") ;
   }
   debug();
   return ;
  }
  delay ( rebonds );
  if ( Bavard == 1 )
  {
   Serial.println ("Sortie impulsion") ;
  }
  debug();
  Numero ++ ;
  if ( Bavard == 1 )
  {
   Serial.print ("Increment numero ; ") ;
   Serial.println (Numero) ;
  }
  temps = millis() ;
  delay ( rebonds );
  if ( Bavard == 1 )
  {
   Serial.println ("Entree inter-impulsion") ;
  }
  debug();
  while( !digitalRead(PinLecture) )
  {
   duree = millis() - temps ;
   if ( duree > TempsInterImpulsionMax )
   {
    if ( Bavard == 1 )
    {
     Serial.println ("Inter-impulsions trop longue; action") ;
    }
   debug();
  Action () ;
  return ;
   }
  }
 if ( Bavard == 1 )
 {
  Serial.println ("Sortie inter-impulsion") ;
 }
 if ( duree < TempsInterImpulsionMin )
 {
  if ( Bavard == 1 )
  {
   Serial.println ("Inter-impulsion trop courte") ;
  }
  debug();
  return ;
 }
 debug();
 temps = millis() ;
 delay ( rebonds );
 }
}
void debug ()
{
if (Debug == 1 )
 {
  Serial.print ("Lecture ; ") ;
  Serial.print (digitalRead(PinLecture)) ;
  Serial.print (" duree = ") ;
  Serial.println (millis() - temps) ;
 }
 delay(2) ; // petite tempo par principe
}

void Action ()
{
if ( Bavard == 1 )
 {
  Serial.print ("Action avec numero ; ") ;
  Serial.println (Numero) ;
 }
// Placez ici l'action à faire avec la variable "Numéro"
Numero = 0 ;
}


-------------------------------------------------------------------------------------------------------------------------------------------------------
Bon, j'ai un peu honte, il traîne des inélégant "return..", mais je n'ai pas su comment m'en passer.

Other Posts