La idea de este sistema es detectar los trenes mediante reflexión de infrarojos.
Tras la detección, la información se volcará a un a la MGV-101 que usa loconet.
La solución para la reflexión me la dio opendcc y es bastante sencilla:
- Con ayuda de un PIC se genera una señal 01010 y se manda al emisor IR.
- En cada ciclo se mide la tensión en el receptor infrarrojo.
- Si la tensión viene porque el circuito se activa por la luz ambiente… el circuito se habrá activado siempre: 11111… es decir, evaluando la tensión recibida en el receptor, la suma de tensiones (o su media) en los periodos 0 será mayor que en los periodos 1
- Si por el contrario la detección viene por una reflexión, se tendrá: 01010, y la suma de la tensión en los periodos 1 será mayor que en los ceros.
La tensión en receptor se evalúa con un conversor analógico digital puesto que los niveles de detección pueden depender de la cantidad de luz ambiente existente… y por lo tanto es difícil fijar que valor de tensión equivale a 1 y que valor equivale a 0. Éste es un punto en el diseño que aún no he cerrado, De hecho existen una serie de variables que se pueden todavía optimizar para mejorar la detección.
Por un lado tenemos que en un circuito clásico de detección – como el que sugiere las hojas de catálogo del sensor que utilizo, CNY70 – las dos variables que se manejarían son la resistencia en el emisor, y la resistencia en el receptor.
Con mis conocimientos amateur de electrónica, en general interesa tener una resistencia baja en el emisor y alta en el receptor.
- Rd lo más baja posible en el emisor para que circule toda la corriente posible sin quemar el led: en este caso si el máximo que soporta es 50mA, con lo que da una caída de tensión de 1,25-1,6V. Poniéndonos en el caso peor, y buscando una corriente de 40mA para dar un poco de margen de seguridad, tenemos:
Rd=(Vcc-Vf)/If=85-93Ohms
Para estar en el caso más restrictivo habría que elegir el valor mayor. En mis pruebas, me he ido a una Resistencia de 390 Ohms (lo más bajo que tenía por casa), con lo que la corriente que circulaba variaba entre 8 y 9 mA… obviamente he de hacer pruebas con una resistencia más acorde (100Ohms?). El problema futuro será como alimentar un juego de 8 leds emisores desde una única salida de un PIC, que sólo entrega 5V y 25mA – ni en serie ni en paralelo sería capaz de entregar el voltaje o la corriente suficiente (≈3mA por Led)
- Rt lo más alta posible en el receptor para aumentar la sensibilidad. Por poca corriente que llegue al receptor, se traducirá en una caída de tensión importante. Esto es necesario porque el pic evalúa la tensión en un margen de 0 a 5V (una precisión de ≈0,005V), y lo interesante es tener la mayor diferencia entre la detección del símbolo 0 y la detección del símbolo 1.
- Una opción sería modificar la tensión de referencia del conversor A/D en el pic, para que, por ejemplo, se evaluara de 0 a 1,5V… Aún no lo he descartado, pero esta solución implicaría más componentes y perder un pin en el pic (el que se usa para obtener Vref)
- Otra opción sería usar una resistencia adecuada. Para el cálculo se puede usar la siguiente gráfica y estimar la distancia a la que queremos que se produzca la detección.
El problema es que esta gráfica considera unas condiciones muy favorables con una superficie lisa de detección. En cualquier caso sirve de guía, ya que nuestra detección se encuentra en el entrono de los 10mm… Poniéndonos en un caso catastrófico con una corriente de 0.001 mA, una resistencia de 1M, nos daría una caída de 1 V (demasiado poco). Con estas consideraciones comencé a probar 1K, 10k, 100k y 1M. Los resultados, como se esperaba eran mejores cuanto mayor era Rt.
Una característica adicional a considerar es que el sensor sí que recibe reflexiones no provenientes de un vagón detectado, por ejemplo de la vía. Obviamente estas reflexiones (falsos positivos) inducen una caída de tensión menor que la del vagón… y deben ser descartadas. Así que no sólo interesa optimizar Rt para que el valor del símbolo “1” esté lo más lejos posible del valor del símbolo “0”, también hay que garantizar que el valor del “1” detección, esté lo más lejos posible del valor de “1” falso positivo.
De hecho con con 1M existía siempre una diferencia de casi 3V entre el ambos valores en diferentes condiciones de luz ambiental.
Para evaluar que es un falso positivo he hecho un pequeño programa de calibrado en el pic, que mide 50 veces la señal que se recibe al mandar un 1 al emisor cuando no debería haber reflexión. Esta medida debería hacerse en ausencia de luz, puesto que lo que se quiere medir es la luz que proviene del emisor, y no la ambiental. El máximo captado, es el valor límite que se utilizará para desestimar los falsos positivos. Otra opción – más potente y a explorar – sería medir la diferencia de tensión entre “1” y “0” en el falso positivo para desestimarla cuando se tiene una detección real. Esto es más potente porque se mantiene el principio de inmunidad a la luz ambiental. Con luz tenue en el primer caso se podría tener una situación en la la luz ambiental ayuda a superar el umbral, sin saturar, dando un falso positivo… si lo que se desestima es la diferencia de tensión proporcionada por la falsa reflexión, es sistema será más robusto. De momento las pruebas se han hecho con el primer supuesto… con lo que aún hay espacio para mejorar.
El problema al integrar el PIC en el circuito, se hace más interesante.
Leyendo el catálogo del pic, la resistencia de carga del conversor AD no debería superar los 10K… de hecho con 1M, aunque como comento da una caída de tensión muy adecuada… el sistema no funciona, el PIC no consigue capturarla. Así que para las pruebas he tenido que rebajar a 100k (aún fuera de especificación). La solución si quiero seguir usando una resistencia alta será usar un seguidor de tensión con un operacional o con un transistor – esta parte he de mirarla en detalle repasando mis apuntes de electrónica. Probablemente un operacional será lo más adecuado… pero veré que tengo por casa para hacer pruebas.
Y todavía quedan más variables a optimizar:
- El tiempo de refresco entre actualizaciones de estado, que afecta para saber si el vagón será detectado atodas las velocidades. El tiempo de la captura AD es prácticamente despreciable (0,1ms-1 canal; 0,8 ms-8 canales), pero para dar tiempo al que el ciclo 01010 se propague de forma correcta he tenido que poner un retraso de 10ms (50ms por canal, 200 ms en 8 canales). Esto podría traer problemas, pero en las pruebas, cualquier cosa por debajo de 1ms daba problemas. Quizás deba jugar más con eso, en especial si considero 8 canales y luego me decido por un bus s88. Lo primero será hacer una prueba con un vagón en movimiento. Opendcc hace unos cálculos que no termino de entender:
«This evaluation is done every 10ms for a sensor. Assuming a train traveling with 50km/h (scale H0). it will travel 16cm in one sec. Thus, the query interval is 1.6mm.»
- La cadencia entre detecciones. Para tener un resultado más estable he introducido un tiempo de espera entre detecciones positivas. La idea es que si el sensor es muy sensible, no deje de detectar el vagón demasiado pronto. No sé muy bien como funcionará esta solución en 8 canales. Por un lado no puede tener el pic parado mucho tiempo – se podría solucionar con contadores o vigilando el reloj. Por otro lado hasta que no pruebe con un tren en movimiento no sabré si realmente hará falta este tiempo de carencia – especial me preocupa que pasa entre, idealmente, el sensor debería ser suficientemente sensible para detectar el enganche.
Mientras miro como optimizar esas variables, he hecho ya una prueba con la MGV-101 y la MGV-50… y parece funcionar. La idea sería modificar el código de la MGV-50 para que corra el firmware que ya tengo para el PIC 16f675.
EN PRÓXIMAS ACTUALIZACIONES:
Actualizaión sofware GV-0 para que corra la detección por IR