Pantalla, RF y plan de vías
Este proyecto lleva mucho tiempo gestándose, y por una cosa y otra, siempre lo he ido posponiendo. Pero por fin tengo una versión en la que todas las funciones están operativas.
La base del proyecto es un Arduino UNO y una pantalla ILI9481 de 3.5” y una resolución de 480*320. Es la misma que utilizamos para el proyecto de Pantalla llegadas de trenes Adif. El otro proyecto es el de Sensores con módulos RF433 también tiene parte del código de la central DCC++, el que se refiere al archivo SerialCommand.cpp en su función SerialCommand::process()
A día de hoy se podría realizar con un microcontroloador y pantalla mejores. Dicho esto, vamos a describir el proyecto:
Contamos con una pantalla donde mostraremos las vías, funciones como accesorios o desvíos y también un módulo receptor MX-RM-5V.
- Pantalla
- Comunicación serial
- Recepción RF 433
*-Problemas de comunicación:
Uno de los problemas que han surgido es como gestionar las conexiones, tanto de la central DCC como la pantalla.
Por una parte tenemos la central DCC que en este caso esta montada sobre una placa Arduino MEGA y de ella podemos usar todos los puertos seriales (4). En este caso será el puerto Serial3
- Serial: Comunicación con PC/Programación
- Serial1: Comunicación Wifi
- Serial2: Comunicación Bluetooth
- Serial3: Comunicación auxiliar, pines D14 y D15
![Diagrama general pantalla y central DCC](/assets/images/Arduino/Pantallas/pantalla_diagrama/pantalla_diagrama_vias_00.png)
La central también ha tenido algunos añadidos ya que por el momento no se ha probado con los módulos S88 tuve que añadir unas lineas en el archivo TextCommand.cpp.
Las lineas que se añaden por un conflicto con la función Sensores ya que estos están preparados para ser controlados con un pin de entrada de la placa Arduino. Debido a esto tendremos que saltarnos esta parte. Si no lo comentamos en el archivo DCCpp.h la respuesta siempre será la misma, un estado bajo o “q”.
Por otra parte tenemos la pantalla, la llamaremos así por el momento, de la que usaremos el Serial de la placa Arduino UNO, es decir, pines 0 Rx y 1 Tx y para la recepción de los mensajes RF433 el puerto A4.
*- Librerías usadas:
- VirtualWire.h Comunicación con PC/Programación (pines 0 Rx y 1Tx)
- Adafruit_GFX.h Comunicación RF 433 (pin A4 Rx)
- MCUFRIEND_kbv.h
- Fonts/FreeMonoBold12pt7b.h
También se pueden añadir librerías donde tengamos una lista personalizada con los Accesorios o con una lista de sensores. Ya vimos como personalizar estas librerías en Organizar elementos DCC en Arduino.
- listaAccesorios.h
- listaDetectores.h
*- El programa:
El programa Diagrama de vías esta dividido en varios archivos llamados:
- Diagrama_vias.ino Donde se encuentra el setup() y loop()
- Funciones.ino Funciones programadas para locomotoras, accesorios y sensores
- Recepción_datos.inoGestión de datos seriales y RF
- Secciones.ino Dibuja las diferentes secciones en la pantalla
- ScreenDefine.h Define parámetros como el ancho o largo de las diferentes secciones dibujadas en la pantalla
Una de las cosas que tenemos que tener en cuenta es que la configuración del módulo RF siempre tiene que estar al final del setup(). También que, una vez conectado con la central DCC, no podremos reprogramar el Arduino ya que entrará en conflicto con el puerto Serial de la central y el puerto serial del pc.
*- Funciones generales:
Es el archivo donde están las funciones correspondientes a cada comando, sea un accesorio, desvío, locomotora o sensor. También el código es compatible con la central DCCEX. De todas ellas la relativa a los sensores CheckSensores(char *s, bool low, bool serial) es la que evita la retroalimentación del comando. Sin esta función la pantalla mandaría el dato y la central respondería y la pantalla volvería a mandar el dato y esto se repetiría en un bucle sin fin.
El resto de funciones dependerá de circuito personalizado que tengamos dibujado en la pantalla como el número de accesorios y desvíos.
*- Función de recepción de datos:
Las funciones principales en la recepción de datos son Recibe433() y Recibe_datos(). Una vez que el dato sea correcto, es decir, que empiece por < y termine con > que es el formato estandar de las centrales basadas en DCC++, pasara la cadena de caracteres char a la función decodata().
La función decodata(char *com, uint8_t serial) toma la cadena char y el bit de control serial. Es la encargada de leer el primer dato de la cadena que corresponde al comando. Serial es que se utiliza para evitar la retroalimentación. Si el comando es recibido por Serial el comando es true y false si el comando se recibe por el modulo MX-RM-5V
*- Secciones:
Son las secciones o cantones de cada parte de la pista. Esta parte hay que personalizarla y la verdad es la parte más tediosa de todo el proyecto. Pero con un poco de paciencia, se puede dibujar cualquier pista o podemos limitarnos a las zonas de, por ejemplo, estaciones.
*- ScreenDefine.h
En este archivo están los valores que serán fijos en el programa, como el ancho de la pista, colores, o textos. También el número de desvíos accesorios y sensores.
*- Cambios en la central DCCpp LMD:
Hemos intentado que la central DCCpp LMD tenga los menores cambios posibles y al final solo se han añadido unas cuantas lineas referentes a los comandos Q y q. Hay información más detallada en DCCpp LMD TextCommand.
Tenéis todos los datos sobre el programa en Github Pantalla_diagrama vías 2 bucles