Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Arduino
  3. La retroinformación
Extrait - Arduino Hágalo jugar a los trenes
Extractos del libro
Arduino Hágalo jugar a los trenes Volver a la página de compra del libro

La retroinformación

El protocolo

1. Inserción de datos

Existe un protocolo específico para la retroinformación (o retroseñalización) de las locomotoras a la central. Recibe varios nombres según el fabricante, pero lo más habitual es que se conozca con el nombre comercial de RailCom.

Tiene muchos usos:

  • Acceso a las variables de configuración

  • Identificación de la locomotora

  • Lectura de la velocidad del tren

  • Lectura de códigos de error

Esta ampliación de la norma original permite que los descodificadores devuelvan los datos a la central DCC o hacia un receptor de retroinformación dedicado. Para ello, la señal DCC se interrumpe brevemente después de cada trama transmitida. Los descodificadores pueden entonces transmitir datos por retorno de corriente. Se puede utilizar para identificar el tren que circula en un cantón. En este caso, se necesita un receptor en cada cantón. También se puede conocer la velocidad real del tren y otros parámetros, como el consumo de carbón y agua, en el caso de una locomotora de vapor.

Sin embargo, su uso más práctico consiste en consultar el contenido de las variables de configuración. Esto permite rellenar el valor de la CV que muestra el programador directamente con su valor actual antes de modificarlo, lo que resulta especialmente útil para evitar desprogramaciones accidentales.

El funcionamiento de este protocolo es bastante particular, ya que consiste en interrumpir la transmisión de la señal DCC durante un breve momento (lo que se llama cutout, o corte, en el estándar). Así, el decodificador puede utilizar este tiempo libre para devolver los datos a un receptor conectado entre la unidad central y la vía.

En la práctica, esto pasa de la siguiente forma:

  • Después de la transmisión del bit de STOP de un paquete de datos, la central espera alrededor de 29 µs, que corresponden a la mitad de los 58 µs del período del reloj DCC.

  • A continuación, la central corta la señal y pone directamente su salida en cortocircuito durante unos 8 períodos de reloj DCC, o sea 464 µs.

  • El descodificador de la locomotora aprovecha entonces este tiempo libre para enviar los datos solicitados a las vías.

Se trata de un sistema bastante sofisticado, ya que los descodificadores...

El descodificador

1. Consideraciones técnicas

Para poder leer las señales del canal de retorno, se necesita intercalar un descodificador entre la central y la vía. Este se encarga de amplificar las señales devueltas por la locomotora y luego de transmitirlas a un microprocesador que descodifica la información.

La señal de retorno está disponible en las terminales de una resistencia de derivación de 1 a 2 Ω. Esta señal es bastante débil: 10 mV a 34 mA como máximo. Es imprescindible amplificarla para poder utilizarla con un Arduino; no se puede conectar un amplificador directamente entre la vía y un microprocesador porque no trabajan en el mismo rango de voltajes: por un lado, se tiene una señal alterna de 18 voltios y, por otro, se necesitan 5 voltios de corriente continua. Para evitar cualquier riesgo de destrucción de los componentes, se debe instalar un aislamiento galvánico entre los circuitos de entrada y de salida.

La solución que se propone generalmente se basa en el siguiente diagrama. A partir de la señal DCC, se crea una fuente de alimentación flotante que alimenta un doble comparador LM393; esta detecta las señales positivas y negativas en función del sentido de marcha de la locomotora. Estas señales se combinan y accionan un optoacoplador que proporciona aislamiento galvánico al circuito. A la salida, la señal se envía a otro LM393, alimentado con 5 V, que proporciona la señal digital al Arduino.

images/cap10_img_04.png

Esto funciona, pero hay una forma más simple de hacerlo gracias a un circuito integrado, lanzado recientemente, que permite reemplazar todos los componentes de este esquema, excepto el LM393 de salida.

2. El circuito TSC2012

Este circuito es un amplificador de corriente bidireccional. Creado por ST, forma parte de una gama de tres circuitos, cada uno con una ganancia diferente. El TSC2012 es el que tiene la mayor ganancia.

Originalmente diseñado para aplicaciones de control de carga y descarga de baterías, sus características lo hacen ideal para descodificar una señal de retroinformación DCC.

  • Voltaje máximo en sus entradas: de -20 a +70 V

  • Medición de corriente positiva o negativa

  • Ganancia: 100 voltios de salida para 1 voltio de entrada

  • Posibilidad de desactivar el circuito...

Programación del descodificador

1. Descodificación de la señal

La descodificación se realiza íntegramente por un Arduino Nano. El procesamiento es bastante complejo. Se desarrolla en varios pasos:

  • Detección de los bits a 1 y 0

  • Sincronización de la señal

  • Conversión de los códigos 4/8 recibidos en grupos de 6 bits

  • Separación del canal 1 y 2

  • Desglose del canal 2 en uno, dos o tres paquetes

  • Descodificación de instrucciones y datos

  • Visualización o uso de datos

Se puede descargar desde la página Información: at-retro.ino.

Lo primero que hay que hacer es definir las señales que entran en el Arduino. SP y SM corresponden a las salidas de los comparadores, por lo que este es el flujo binario que se ha de descodificar. También se declaran las tres señales procedentes de la central DCC, aunque solo se utilice realmente DCC_C.

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

La función setup configura las entradas. SP y SM deben declararse en INPUT_PULLUP porque el comparador LM393 tiene salidas en colector abierto. Si las entradas estuvieran configuradas como INPUT simple, el valor leído sería siempre bajo. Se termina la inicialización declarando la interrupción que disparará la lectura de los datos y se activa la lectura del siguiente paquete de datos poniendo la variable active en true.

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 lectura de datos se activa mediante una interrupción. No se trata de una interrupción de software, activada por un temporizador, sino de una interrupción de hardware, activada por una señal externa. La función attachInterrupt se utiliza para definir esta interrupción.

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

  • pin: número del pin al que se conecta la señal.

  • ISR: función callback que se ha de llamar.

  • mode: evento que desencadena la interrupción.

El número de pin no se pasa directamente a la función attachInterrupt, sino que se convierte primero...