ESTE BLOG COMENZÓ A PUBLICARSE EN 2008, POR LO TANTO MUCHOS DE LOS TEMAS HAN QUEDADO DESACTUALIZADOS U OBSOLETOS. LOS LECTORES QUE DESEEN UTILIZAR ALGUNO DE LOS ELEMENTOS AQUI DESCRITOS DEBERÏAN ASEGURARSE DE BUSCAR LAS REFERENCIAS MAS MODERNAS DE LOS TEMAS DE SU INTERÉS. EL BUSCADOR INCLUIDO SERÄ UNA AYUDA PARA ESA BÚSQUEDA

jueves, 26 de abril de 2012

Señal de entrada




Recientemente coloqué en mi maqueta los semáforos que estaban previstos para regular el tráfico de los trenes, materializando el sistema de ocho cantones en que siempre he considerado dividida la maqueta.

Sin embargo, una vez puestos, me he encontrado con dos cosas: Por un lado que los semáforos añaden un "realismo ferroviario" muy grande, de manera que la inclusión de los mismos ha mejorado muchísimo el aspecto de la maqueta, y eso que todavía no hay nada de decoración. Por otro lado, poniendo los semáforos tal como estaba previsto, es decir, uno al principio de cada bloque, la pequeña estación "de montaña" de mi maqueta quedaba un tanto desgarbada, porque quedaba con dos señales de salida, pero ninguna señal de entrada, lo cual es muy poco realista.

Así que,  me decidí a completar las señales de esa estación, tal como correspondería a una estación de paso, como esta, de tres vías. Debería llevar una señal de entrada para cada vía de llegada y una señal de salida para cada vía de estación, es decir en mi caso dos señales de entrada y tres de salida. De las tres de salida, dos ya las tenía, como señales de bloque, así que he puesto una señal de salida en la vía de sentido contrario.

Respecto de las señales de entrada, una de ellas no la he puesto, porque realmente debería quedar dentro de un túnel, pero la que si he puesto es la señal de entrada del otro sentido, que corresponde a la vía que se divide en dos en la estación.

Pero aquí he querido ser fiel a la realidad en cuanto al tipo de señal. Las señales de salida de una estación normalmente son de dos aspectos, ya que normalmente solo necesitan indicar la parada o la vía libre para un tren que debe pararse en la estación, o debe continuar.

Sin embargo una señal de entrada normalmente es de tres aspectos, porque pueden darse tres situaciones: La primera es parar ante la señal, porque por ejemplo las vías de la estación estén ocupadas o porque no se haya establecido el itinerario de desvíos que debe seguir el tren. Una segunda situación permite al tren entrar en la estación, pero a velocidad reducida. Esto se puede deber a que el tren debe parar en la estación, o sea, que encontrará la señal de salida en rojo, o bien que, aunque el tren no deba parar en la estación, va a atravesar una serie de desvíos transversales que debe tomar a velocidad reducida. La tercera situación se da cuando el tren puede atravesar la estación sin reducir la velocidad.

En el ferrocarril alemán, que es el representado en mi maqueta, estas tres situaciones se denominan


respectivamente Hp0, Hp2 y Hp1.

En la figura anterior vemos un semáforo mecánico capaz de hacer estas tres indicaciones tanto con el movimiento de sus dos palas como con las luces correspondientes.

Märklin fabrica un semáforo mecánico de tres aspectos con la referencia 89402, así que pedí una de estas señales para situarla como señal de entrada en la estación. También tenemos la misma señal fabricada por Viessmann con código 4901.

Aquí Märklin y Viessmann han hecho una pequeña trampa, porque realmente este semáforo no puede situarse en la posición HP1. Sólo tiene dos posiciones, que corresponden a Hp0 y a Hp2. Seguramente hacerlo para las tres posiciones en escala Z habría sido muy complicado, así que han hecho esa solución. En escalas mayores si que existen semáforos que pueden adoptar las tres posiciones. También en escala Z tenemos señales luminosas con los tres aspectos operativos, pero en señal mecánica solo existe ésta y la normal de dos aspectos.

En el vídeo de la cabecera vemos esta señal regulando la entrada de un tren en la estación de montaña. La entrada se autoriza como HP2, ya que la señal de salida, que vemos al fondo está en rojo. Como se comprueba en el vídeo, resulta muy atractivo el juego de señales que parece gobernar el movimiento de los trenes de una forma muy próxima a la realidad.

El problema es que ahora me he metido en una complicación, ya que estas señales no estaban previstas en el plan inicial. No quiero hacer más cantones, entre otras cosas porque quiero mantener la concordancia de los cantones con los circuitos eléctricos independientes (Tal como explicaba en CabControl) así que estas nuevas señales no definen el principio de un bloque. Tengo que pensarme cómo las hago funcionar de forma realista sin complicarme demasiado.

sábado, 21 de abril de 2012

Software de detección




Efectivamente, faltaba el software capaz de entenderse con la placa Velleman y detectar que un tren ha pasado sobre uno de los detectores.

Como ya he comentado anteriormente, el montaje informático que utilizo incluye, además del programa principal que es el que el usuario maneja, otro programa que permanece oculto, salvo que expresamente se quiera hacerlo visible, y que es realmente el que maneja las comunicaciones. Tan es así que de este segundo programa se abren varias instancias,  tantas como placas Velleman existan en la instalación.

Cuando este programa se hace visible, la pantalla del ordenador presenta un "log" de todos los mensajes que se envían y se reciben de la correspondiente placa de comunicaciones, lo cual es muy útil para comprobar el funcionamiento del sistema. Las comunicaciones entre este programa, y el programa principal son ya una cuestión puramente de software, de modo que no tiene más complicación que el adecuado desarrollo de los programas.

Bueno pues ya tengo desarrollada la parte de comunicaciones de este software, con lo cual se imponía una prueba global. Para ello he preparado el montaje que se ve en el vídeo, en el cual he situado dos detectores Hall en un tramo de vía.

Los Sensores los he montado en un trocito de circuito impreso de tiras perforadas que lleva un conector Molex, el detector Hall, y un condensador, según se recomienda en las hojas de datos del sensor Hall A1120EUA-T y  tal como puede verse en la imagen. De esta forma el sensor se introduce desde debajo del tablero a través de un orificio de 4 mm de diámetro, y al final se dobla su cabeza hacia atrás para dejarla horizontal entre las vías. Cuando lo haga en la maqueta, utilizaré una gota de adhesivo para dejarlo fijo.
De los tres cables que llegan a cada sensor, el negro es la masa, el rojo la alimentación (5 V), y el verde la salida de señal. Los cables rojo y negro pueden llevarse en plan guirnalda de un conector a otro. El cable verde, es el que hay que llevar individualmente desde cada sensor a una de las entradas del CODIF32. Para esta prueba, he puesto dos sensores Hall, y he conectado uno de ellos a la entrada 12 y otro a la entrada 19. Se puede ver aquí la conexión:
Cada uno de los conectores de entrada de CODIF32 tiene 10 vías, pero solo 8 son entradas. El primero y el último de cada conector son, uno de masa y otro de alimentación. Así se facilita el conexionado de los sensores. Las cinco salidas más la masa de CODIF32 se conectan directamente a la correspondiente regleta de entradas digitales de la placa Velleman. No hay ninguna indicación visual en la placa. del funcionamiento de estas entradas.

Y desde luego, el conexionado termina conectando la placa Velleman al puerto USB del ordenador.

En el vídeo, podemos ver como todo este montaje funciona perfectamente. Se puede comprobar que cada vez que la locomotora pasa sobre uno de los detectores, aparece un mensaje en la pantalla, indicando qué detector se ha activado. En el vídeo se hacen varias pruebas a distintas velocidades, sin que se pierda ninguna señal.

La verdad es que aquí había un tema pendiente muy importante. Como ya comenté hace tiempo, (Ahjjjj qué fallo y Laboratorio de eléctrónica), hay dos formas de que un programa de ordenador detecte que un dato de entrada ha cambiado. El método más perfecto es que el sistema produzca una interrupción o evento cada vez que el dato cambie. Los programadores de Visual Basic están acostumbrados a funcionar así. Por ejemplo cuando el usuario pulsa un botón en la pantalla se dispara el evento "click" del objeto "botón"  La otra forma de que un programa se entere de que una entrada se ha activado, se denomina en técnica informática polling,  consiste en leer periódicamente los valores de las entradas y detectar si ha habido algún cambio respecto de la lectura anterior. En el ejemplo anterior el programa analizaría constantemente el estado del "botón" para ver si su estado cambia.

Cuando, como es este caso, los datos que pueden cambiar proceden de un sistema de hardware, el método de interrupciones es muy difícil de implementar por lo que se recurre al polling.  En aquella ocasión,  un fiel seguidor de este blog, Marco Retama, aportó que estaba haciendo un sistema semejante al mío y que utilizaba un control timer de Visual Basic para hacer una lectura del estado de las entradas cada cierto tiempo. Evidentemente ese es el sistema, pero en su caso se trata de sensores de ocupación, mientras que en mi caso se trata de sensores de paso. La diferencia es que por pequeño que sea el bloque cuya ocupación queremos detectar, un tren estará mucho más tiempo sobre un bloque, que el tiempo que tarda en pasar sobre un detector de paso. Así que para el caso de Marco le bastaba leer las entradas cada décima de segundo. Sin embargo una décima de segundo es muchísimo par un detector de paso, porque el tiempo que está activado el detector puede ser menor, y puede ocurrir, que entre lectura y lectura se haya producido una activación y una desactivación, y el programa no lo detecta.

En un primer intento, hice exactamente eso, es decir un bucle de lectura con una frecuencia de 100 milisegundos. Al hacer las pruebas, comprobé que efectivamente se perdían lecturas.

El problema es que no se puede aumentar arbitrariamente la frecuencia porque llega un momento que el ordenador no hace otra cosa que leer y releer las entradas y se bloquean el resto de los procesos.

Este problema tiene dos soluciones completamente distintas: una por hardware que consiste en que una vez que una entrada se ha activado, se mantenga activada hasta que recibe una orden de volver a ponerse "a la escucha" Hay unos circuitos llamados latchs que hacen eso, pero me meto en tema de sincronismo que no me apetece nada. Sólo iré por ahí si no tengo otro remedio.

Quise quemar el último cartucho por el segundo camino, es decir, afinando la programación, y parece que lo he conseguido. La forma de hacerlo ha sido hacer la lectura en dos escalones. Un primer escalón hace solamente una lectura y detecta si ha habido alguna variación respecto de la lectura anterior. Si ha habido cambios, pone el nuevo dato en una variable. Así que esta variable funciona exactamente como un latch ya que mantiene el dato leído aunque en la lectura siguiente el dato vuelva a cero. Este ciclo de lectura se ejecuta cada 15 milisegundos. Un segundo ciclo, que se ejecuta cada 100 milisegundos detecta si el valor de la variable es distinto de cero y si es así actúa según lo previsto, dando el mensaje en pantalla, enviando este dato al programa principal, etc Y al final pone la variable a cero. Al ser la primera operación muy simple, su ejecución  es rapidísima de modo que no sobrecarga apenas el ordenador. Todo el trabajo pesado se deja al segundo proceso que se ejecuta muchas menos veces.

Este sistema tiene un posible problema: si dento de un ciclo de 100 milisegundos se producen dos entradas distintas y consecutivas del ciclo de 15 milisegundos, una de las dos, (la primera) se perdería. Esto supone que coincidan en la misma décima de segundo la activación de dos detectores distintos. Creo que la probabilidad de que esto ocurra es bajísima, así que asumo ese riesgo.

Y ¿porqué precisamente 15 milisegundos? Pues he detectado que aunque el programa intente leer las entradas con mayor frecuencia, el número de lecturas no aumenta. Está claro que lo que ocurre es que la placa Velleman tarda ese tiempo en proporcionar una lectura. Este es pues un límite insalvable. Si con 15 milisegundos de intervalo entre lecturas me vale para que no escape ninguna lectura, el sistema funcionará bien. Si no es así tendré que ir al latch por hardware

martes, 17 de abril de 2012

Encoder


Una vez tomada la decisión de utilizar sensores Hall para detectar los trenes, viene el problema siguiente: ¿Cómo hacer que el programa de control se entere de que se ha activado un determinado detector? La solución pasa desde luego por la placa Velleman que cuenta con cinco "entradas digitales", es decir capaces de reconocer un cero o un uno (0 voltios o 5 voltios) y transmitir esta información hacia el ordenador. Sin embargo, aparece el mismo problema que teníamos con las salidas: Allí había ocho salidas únicamente, pero mediante un circuito demultiplexor (DEMU01, DEMU02 y DEMU03) las convertíamos en hasta 256 señales distintas.

Con la entrada tenemos un problema parecido pero al revés: Solamente hay cinco entradas en la placa, pero mediante una conversión a código binario, podemos detectar muchas más de cinco señales. En concreto el número es 2 elevado a 5 o sea 32 señales distintas.  32 Es un buen número, teniendo en cuenta que necesito dos por cada cantón, o sea 2 x 8 =16, más una por cada vía de la estación oculta (6) y otras tantas para la estación principal, lo cual da ya 28. Y seguramente saldrán más necesidades. Tampoco me preocupo mucho, porque en caso de que me falten tendría la posibilidad de otras 32 entradas contando con la segunda placa Velleman que va llevar mi instalación.

El problema entonces consiste en convertir 32 posibles señales individuales en una señal de cinco bits. Es decir exactamente el problema contrario al que resolví con el demultiplexor. Puede uno pensar que si lo anterior lo hacían unos circuitos llamados "demultiplexores", lo que yo ahora necesito es un circuito "multiplexor", pero eso sería demasiado fácil. Los multiplexores existen, pero hacen algo totalmente distinto, así que tuve que hacer una investigación para llegar a saber que los circuitos que hacen lo que yo quiero se llaman "encoders", en inglés. La palabra española sería "codificador" pero resulta tan genérica que nadie la usa, así que nos quedaremos con encoder. Dicho sea de paso, tampoco la palabra encoder es demasiado precisa: Hay varios dispositivos totalmente distintos incluso dentro de la especialidad electrónica, que reciben este nombre. Uno de los más conocidos son los "posicionadores" que devuelven un código digital en función de la posición de un eje que puede girar........como por ejemplo el eje de giro del puente de una rotonda....(en que estaré yo pensando?)

Bueno, pues también podía uno pensar que hubiese circuitos encoder capaces de convertir 16 entradas a cuatro bits, que sería lo contrario a lo que usé en el demultiplexor (de cuatro bits a 16 salidas). Pues tampoco: lo que he encontrado son encoders de 8 entradas a 3 salidas. Concretamente el circuito que he localizado es un "8-line to 3-line priority encoder" con referencia 54HT148.

Afortunadamente, los señores de Texas Instruments, en la hoja de datos de ese circuito han tenido la amabilidad de incluir (ver la página 7 del documento enlazado) el esquema para conectar dos de estos circuitos para hacer un encoder de doble capacidad, es decir de 16 entradas a cuatro bits, o sea lo que yo esperaba encontrar en un único chip. Esto incluye, además de los dos 54HT148 un circuito HC08 que es una cuádruple puerta AND. La fotografía de la cabecera recoge exactamente ese circuito realizado en la protoboard con unos cuantos leds para ver las señales. Pues si: funciona.

Naturalmente, puedo hacer dos de estos circuitos, con lo cual ya tengo las 32 entradas, pero claro, por las salidas tendría 4 bits de uno más 4 bits de otro. Hay que poner además una tercera matriz de puertas para pasar de 4 + 4 a 5 bits. Podía haber hecho todo el circuito en la protoboard pero decidí arriesgarme y pasar a construir directamente el circuito que sería un encoder de 32 entradas y cinco bits de salida. Antes de fabricarlo, dibujé el esquema, que resulta bastante espectacular:



El diseño del circuito impreso para este dispositivo resulta bastante complicado. En primer lugar hay un montón de conexiones, ya que en definitiva hay siete circuitos integrados, pero además como prácticamente no hay más componentes, resulta que no hay forma de cruzar las pistas (normalmente cuando el circuito tiene resistencias y otros componentes discretos, se aprovecha para cruzar por debajo de ellos las pistas de cobre). La solución a esto es evidentemente hacer un circuito de doble cara, y estuve a punto de lanzarme a ello, pero ya he comentado que salvo por el tema estético, los circuitos de doble cara no tienen ninguna ventaja y si varios inconvenientes. Yo lo siento por los puristas, pero este circuito va a llevar un montón de puentes de alambre. La verdad es que yo mismo he contribuido bastante a esta falta de componentes discretos, ya que por primera vez he empleado las llamadas matrices o arrays de resistencias. Estos componentes son un conjunto de resistencias del mismo valor con un extremo común y el otro individual, montadas en una única cápsula. Cuando hay que poner una serie de resistencias iguales como es el caso de las resistencias de pull-up en las entradas de este montaje, o las resistencias que limitan la corriente en los Leds de una serie de ellos que visualizan la salida de datos, resultan muy cómodas porque ahorran espacio y simplifican el cableado.

Me ha llevado unas cuantas horas hacer el diseño, pero finalmente el resultado es el siguiente:


Y todo eso, da como resultado..... ¡esta preciosidad1:


Bueno, bonita precisamente no ha quedado con tanto puente, pero la belleza de un circuito electrónico se mide por su eficacia. En el vídeo siguiente podemos ver como funciona.

Los cinco Leds amarillos que se ven a la derecha de la placa son indicadores del estado de los cinco bits de salida. Para probar el funcionamiento, voy tocando sucesivamente con un cable cada una de las entradas 32 entradas del circuito. Cada vez que toco una entrada, en la salida se enciende la combinación de leds que corresponde al número de la entrada que se ha activado.

Ese cable con el que voy tocando cada entrada está unido a masa, de manera que la acción de tocar con él cada entrada, es equivalente a que se cierre un interruptor que ponga a masa la entrada correspondiente. Esto puede hacerse con cualquier dispositivo que actúe como interruptor al paso de un tren, ya sea una vía de contacto, un reed, o un sensor hall.

Las cinco salidas que vemos en la foto en primer término se conectarán directamente a las cinco entradas digitales de la placa Velleman (el conector tiene un sexto pin para la masa)



Bueno, pues con esto, estoy a punto de terminar uno de los "subproyectos" que me había marcado, ya que si efectivamente todo funciona como espero con la placa Velleman, se habrán cumplido los objetivos para el tema de detección de trenes, y por cierto en un tiempo record.
Tampoco quiero dar la impresión de que todo ha ido sobre ruedas. La primera vez que conecté la placa no funcionó correctamente y uno de los chips comenzó a calentarse de forma alarmante.

Inmediatamente supuse que el fallo estaba en la parte del circuito que no había ensayado en la protoboard, así que desmonté varios chips y fui haciendo comprobaciones cuidadosas y avanzando paso a paso hasta que llegué a reconstruir todo el circuito de nuevo. Lo curioso es que desde ese momento ha funcionado bien, sin hacer cambio alguno, así que mi conclusión es que ese circuito integrado que se calentaba estaba defectuoso. En la fotografía pequeña vemos el montaje en plena comprobación.

Por supuesto queda por desarrollar el software que interprete estas señales, pero esto pertenece ya más al tema del software y será objeto de otro capítulo.


NOTA: En la página "Descargas" de este blog, están disponibles para su descarga los archivos necesarios para poder construir este circuito electrónico