Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Arduino
  3. Le retour d'information
Extrait - Arduino Faites-le jouer au train (2e édition)
Extraits du livre
Arduino Faites-le jouer au train (2e édition)
6 avis
Revenir à la page d'achat du livre

Le retour d'information

Le protocole

1. Insertion des données

Il existe un protocole dédié à la rétro-signalisation depuis les locomotives vers la centrale. Il porte divers noms selon les constructeurs, mais il est le plus souvent connu sous le nom commercial de RailCom.

Il a de multiples usages :

  • Accès aux variables de configuration

  • Identification de la locomotive

  • Lecture de la vitesse du convoi

  • Lecture des codes d’erreur

Cette extension de la norme initiale permet aux décodeurs de retourner des données vers la centrale DCC ou vers un récepteur de rétro-signalisation dédié. Pour ce faire, le signal DCC est brièvement interrompu après chaque trame émise. Les décodeurs peuvent alors émettre des données par retour de courant. On peut utiliser cette possibilité pour identifier le train en circulation sur un canton. Dans ce cas, il faut un récepteur sur chaque canton. On peut aussi connaître la vitesse réelle du convoi ainsi que d’autres paramètres, comme la consommation de charbon et d’eau dans le cas d’une locomotive à vapeur.

Néanmoins, son utilisation la plus pratique consiste à interroger le contenu des variables de configuration. Cela permet de renseigner directement la valeur de la CV affichée par le programmeur avec sa valeur actuelle avant de la modifier, ce qui est particulièrement utile pour éviter des déprogrammations accidentelles.

Le fonctionnement de ce protocole est assez particulier puisqu’il consiste à interrompre l’émission du signal DCC pendant un bref instant (ce que l’on appelle le cutout dans la norme, ce qui signifie coupure). Le décodeur peut alors utiliser ce temps libre pour retourner des données vers un récepteur branché entre la centrale et la voie.

En pratique, cela se passe de la façon suivante :

  • Après la transmission du bit de STOP d’un paquet de données, la centrale attend environ 29 µs, ce qui correspond à la moitié des 58 µs de la période de l’horloge DCC.

  • La centrale coupe alors le signal et met carrément sa sortie en court-circuit pendant environ huit périodes de l’horloge DCC, soit 464 µs.

  • Le décodeur de la locomotive met alors à...

Le décodeur

1. Considérations techniques

Pour pouvoir lire les signaux du canal de retour, il est nécessaire d’intercaler un décodeur entre la centrale et la voie. Celui-ci se charge d’amplifier les signaux renvoyés par la locomotive, puis de les transmettre à un microprocesseur qui effectue le décodage des informations.

Le signal de retour est disponible aux bornes d’une résistance shunt de 1 à 2 Ω. Ce signal est assez faible : 10 mV sous 34 mA au maximum. Il est indispensable de l’amplifier pour pouvoir l’utiliser avec un Arduino, mais on ne peut pas brancher directement un amplificateur entre la voie et un microprocesseur, car ils ne travaillent pas dans la même gamme de tension : d’un côté l’un a un signal alternatif de 18 volts, et de l’autre côté il faut du 5 volts continu. Afin d’éviter tout risque de destruction des composants, il est nécessaire de prévoir d’installation d’une isolation galvanique entre les circuits d’entrée et de sortie.

La solution généralement proposée se base sur le schéma suivant. Une alimentation flottante est créée à partir du signal DCC, elle permet l’alimentation d’un double comparateur LM393 qui va détecter les signaux positifs et les signaux négatifs selon le sens de la locomotive. Ces signaux sont combinés et pilotent un optocoupleur qui permet l’isolation galvanique du circuit. En sortie, le signal est envoyé sur un autre LM393, alimenté en 5 V, qui fournit le signal numérique à l’Arduino.

images/10B04-RAILCOM.png

Cela fonctionne, mais il y a moyen de faire plus simple grâce à un circuit intégré sorti récemment et qui permet de remplacer à lui seul tous les composants de ce schéma, à l’exception du LM393 de sortie.

2. Le circuit TSC2012

Ce circuit est un amplificateur de courant bidirectionnel. Créé par ST, il fait partie d’une gamme de trois circuits, chacun ayant un gain différent. Le TSC2012 est celui qui a le gain le plus élevé.

Initialement conçu pour des applications de contrôle de charge et décharge de batterie, ses caractéristiques en font un circuit idéal...

Programmation du décodeur

1. Décodage du signal

Le décodage est entièrement effectué par un Arduino Nano. Le traitement est assez complexe. Il se passe en plusieurs étapes :

  • Détection des bits à 1 et à 0

  • Synchronisation du signal

  • Conversion des codes 4/8 reçus vers des groupes de 6 bits

  • Séparation du canal 1 et du canal 2

  • Découpage du canal 2 en un, deux ou trois paquets

  • Décodage des instructions et des données

  • Affichage ou utilisation des données

Téléchargement depuis la page Informations générales : at-retour.ino.

La première chose à faire est de définir les signaux qui entrent sur l’Arduino. SP et SM correspondent aux sorties des comparateurs, il s’agit donc du flux binaire à décoder. Les trois signaux issus de la centrale DCC sont également déclarés, même s’il n’y que DCC_C qui soit réellement utilisé.

#define SP A0  
#define SM A1  
#define DCC_E 4  
#define DCC_C 2  
#define DCC_S 6 

La fonction setup paramètre les entées. SP et SM doivent être déclarés en INPUT_PULLUP car le comparateur LM393 dispose de sorties en collecteur ouvert. Si les entrées étaient paramétrées en INPUT simple, la valeur lue serait toujours à l’état bas. On termine l’initialisation en déclarant l’interruption qui va déclencher la lecture des données et on active la lecture du prochain paquet de données en positionnant à true la variable active.

void setup()  
{  
 pinMode(SP,INPUT_PULLUP);  
 pinMode(SM,INPUT_PULLUP);  
 pinMode(DCC_E,INPUT);  
 pinMode(DCC_C,INPUT);  
 pinMode(DCC_S,INPUT);  
 attachInterrupt(digitalPinToInterrupt(DCC_C), inter, RISING);  
 active=true;  
} 

La lecture des données est donc déclenchée par une interruption. Il ne s’agit pas d’une interruption logicielle, déclenchée par un timer, mais d’une interruption matérielle, déclenchée par un signal externe. C’est la fonction attachInterrupt qui sert à définir cette interruption....