¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. 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 gran central
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 gran central

Consideraciones técnicas

1. Se vuelve un poco más complicado

La pequeña central solo permite controlar una locomotora a la vez. Este no es el objetivo del protocolo DCC, que tiene capacidad para direccionar 9998 locomotoras. Una vez que se ha construido un panel de control que permite controlar numerosas locomotoras de forma simultánea, es plenamente legítimo querer aprovecharlo al máximo.

Un Arduino Uno no será suficiente para tal tarea. No hay suficiente memoria, ya sea RAM para los datos o memoria flash para el programa. Además, existen limitaciones en términos de entradas-salidas.

Por lo tanto, el uso de un Arduino Mega2560 se impone como una evidencia. Como su precio no es muy superior al de un Uno, sería una pena prescindir de él. El hecho de aumentar la RAM de 2 kB a 8 kB es realmente una comodidad innegable y justifica plenamente esta elección. Además, se ha aumentado el tamaño de la EEPROM de 1 kB a 4 kB, lo cual es muy útil, ya que los parámetros de las locomotoras se almacenan en esta memoria.

En el siguiente diagrama, los circuitos están todos conectados al Arduino mediante etiquetas, lo que evita dibujar cables en todas las direcciones y permite presentar el diagrama en tres páginas diferentes. En este primer esquema, además del propio Arduino, encontramos la fuente de alimentación, la pantalla y el teclado.

images/cap08_img_01.png

El conector J1 se une al módulo de alimentación descrito...

Los teclados

1. Los botones

La central DCC tiene botones de control dispuestos alrededor de la pantalla, como en una consola de juegos.

  • Lado izquierdo: una almohadilla direccional.

  • Lado derecho: botones de validación, anulación, retorno.

  • Abajo: elección de la página que se quiere mostrar.

El resultado tendrá, más o menos, este aspecto.

images/cap08_img_03.png

Estos botones permiten navegar por la interfaz de usuario y se conectan directamente a las entradas D42 a D53, por un lado, y a tierra, por el otro. Por lo tanto, basta con configurar las entradas en INPUT_PULLUP, lo que añade una resistencia de polarización (pull-up) a los +5 V de cada entrada. Si no se pulsa un botón, la entrada no se conecta y el valor leído es 1. Cuando se pulsa un botón, la entrada se conecta a tierra y se lee cero.

images/cap08_img_04.png

La lectura de las teclas alrededor de la pantalla es bastante sencilla, ya que no están en una tabla. Basta con definir la asignación de cada tecla para poder acceder a ella.

#define SW_H 42 
#define SW_B 43 
#define SW_G 44 
#define SW_D 45 
#define SW_P1 46 
#define SW_P2 47 
#define SW_P3 48 
#define SW_P4 49 
#define SW_ESC 50 
#define SW_DEL 51 
#define SW_NO 52 
#define SW_OK 53 

2. El teclado numérico

El conector J7 permite la conexión de un teclado numérico opcional. Este se conecta a las entradas de D32 a D39. No es obligatorio, pero permite ahorrar tiempo cuando se trata de introducir un valor numérico.

images/08B05-CLAVIER.png

Los renglones se conectan de D32 a D35, que se configuran como salidas; las columnas se conectan de D36 a D39, que se configuran como entradas de tipo INPUT_PULLUP.

El cableado es realmente muy sencillo, ya que la mayor parte se efectúa dentro del teclado. Las ocho conexiones disponibles en el exterior corresponden a los cuatro renglones y a las cuatro columnas.

images/cap08_img_06.png

Si se pulsan simultáneamente dos botones de la misma columna, dos salidas del Arduino se encuentran conectadas juntas. Cuando una está en 0 y la otra en 1, se produce un cortocircuito en las salidas y esto puede dañar el circuito. Unas resistencias de bajo valor, unos 470 Ω, aseguran la protección de las salidas sin alterar los valores leídos en las entradas, ya que la resistencia colocada en el renglón y la de pull-up, interna del Arduino, actúan como un divisor...

La pantalla

1. La pantalla

Se pueden conectar diversas tecnologías de pantalla a un Arduino: pantalla monocromática o de color, en modo texto o gráfico y en una amplia variedad de tamaños. Sin embargo, si queremos ser razonables, debemos evitar elegir una pantalla que consuma demasiada energía o memoria, ya que la central se volvería insoportable de usar. Para que sea razonable y, al mismo tiempo, hacer que la interfaz resulte atractiva, se ha elegido una pantalla monocromática de 128 x 64 píxeles con retroiluminación para la implementación de la central.

Existen tres estándares principales para la comunicación con este tipo de pantallas: paralelo, I²C y SPI. En el caso de los LCD de 128 x 64 píxeles, los circuitos de comunicación en modo paralelo son los más comunes, por lo que este fue el modelo elegido para el diseño de la central. Puede encontrarlos en Internet buscando «LCD12864 PARALLEL».

La siguiente foto muestra la pantalla que sirvió de modelo para el diseño del circuito impreso. El área de la pantalla es de aproximadamente 68 x 36 mm, o 77 mm en diagonal (que corresponde a 3 pulgadas).

images/08B10-P1030519.png

La interfaz paralela se basa en señales compatibles con el circuito HD44780 de Hitachi, lo que permite que diferentes fabricantes de pantallas LCD ofrezcan circuitos con la misma configuración de pines. Las señales que permiten controlar el circuito son las siguientes:

  • D0-D7: ocho líneas de datos.

  • E o EN (enable): activación del acceso al circuito.

  • R/W (read/write): 1 = lectura; 0 = escritura.

  • RS (register select): 0 = acceso a los registros; 1 = acceso a los datos.

En la práctica, la señal R/W puede conectarse directamente a tierra; la biblioteca gráfica solo escribe en el circuito. Las 10 señales necesarias se conectan a las salidas de la D22 a la D31 del Arduino Mega.

Las salidas D12 y D13 también se utilizan para ajustar el contraste y el brillo de la pantalla. Se utilizan en modo PWM, que permite enviar señales analógicas a la pantalla.

2. La biblioteca gráfica

Hay una gran cantidad de ellas, basta con ir a la página web oficial, que las enumera todas, para darse cuenta de que realmente hay una gran variedad: https://www.arduino.cc/reference/en/libraries/category/display/...

Implementación

1. El circuito impreso

Es bastante imponente, pero contiene pocos componentes; la pantalla y las teclas del teclado requieren un cierto espacio que no se puede reducir y toda la parte trasera está ocupada por conectores.

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

images/cap08_img_11.png

Es necesario precisar algunos puntos importantes que hay que tener en cuenta al realizar este circuito.

El Arduino Mega está serigrafiado en la cara superior del circuito impreso, pero en realidad sus conectores deben estar situados en la cara inferior, es decir, en la cara en la que el Arduino Mega no está representado. Esta curiosa disposición se debe a que proviene de una de las librerías de KiCad y a que es una implementación destinada a un shield Arduino

También hay que tener cuidado a la hora de elegir los botones pulsadores, sobre todo en lo que respecta a la longitud de la varilla utilizada para accionarlos. Para poder utilizarlos, los botones deben sobresalir del panel frontal, pero la pantalla debe colocarse detrás de este. Por lo tanto, los botones, con sus capuchones, deben ser al menos 5 mm más altos que la pantalla. Esto puede conseguirse soldando la pantalla directamente al circuito impreso, pero esto siempre es un poco arriesgado si algo sale mal. Como alternativa, se puede considerar la posibilidad de extender las varillas de los pulsadores. Si no se encuentran «alargadores» para ellos, se pueden conseguir pegándoles separadores de plástico de tamaño M3.

images/08B12-P1030517.png

La lista de componentes puede variar un poco en función de las opciones elegidas.

C1-C3

100 nF cerámica multicapa

D1, D2

Led rojo de 5 mm

DS1

Pantalla LCD de 128 x 64 píxeles interfaz tipo HD44780

J1

Cabezal de 4 pines macho con paso de 5,08 mm

J2

Conector HE13 macho de 4 contactos

J3, J4

Base DIN hembra de 8 contactos

J5

Base SubD 9 hembra para CI

J6

Base SubD 15 hembra para CI

J7

Conector HE13 macho de 8 contactos

J8

Base DIN hembra de 3 contactos

R1 - R4

470 Ω

R5, R6

1 kΩ

R7, R8

10 kΩ (depende del bus I²C)

SA1, SA2

Switch 2RT con paso de 4 mm

SW1 - SW12

Botón...

La gestión de paquetes

1. El almacenaje y las prioridades

Dado que la pequeña central solo puede controlar una locomotora a la vez, una pequeña tabla es más que suficiente para almacenar todos los paquetes emitidos. Para gestionar varias locomotoras, hay que implementar una lista algo más sofisticada.

Esta lista debe permitir el almacenamiento de tres tipos de paquetes diferentes: la consigna de velocidad, el estado de las funciones y la programación de las variables de configuración. Los datos se almacenan allí, listos para enviarse; la suma de verificación ya está calculada. La interrupción solo tiene que leer el contenido de los paquetes y enviarlos a la salida. Pero no es tan fácil. Para enviar los datos en el orden correcto y saber qué hacer con ellos, hay que poner en marcha toda una lógica de secuenciación. No todos los distintos tipos de paquetes tienen las mismas prioridades, ni la misma durabilidad. Por ejemplo, los datos de conducción de las locomotoras deben transmitirse regularmente a la red, ya que de lo contrario las locomotoras acabarán parándose; se trata de un elemento de seguridad.

En la práctica, si no se hacen circular demasiados trenes, se puede enviar la lista de paquetes tal cual. Pero si se aumenta el número de locomotoras, las cosas se complican rápidamente. Se puede calcular la tasa de repetición en el peor de los casos.

La cabecera consume 20 bits. Una dirección larga ocupa 2 bytes. Un control de velocidad de 128 muescas requiere otros 2 bytes. Con la suma de verificación, ya son 5 bytes, es decir, 46 bits incluyendo el START y STOP. Por lo tanto, el comando de velocidad requiere 66 bits en total.

Para los comandos de función basta 1 byte, pero hay que añadir el direccionamiento largo y la suma de verificación, por lo que son 4 bytes en total, es decir, 37 bits. Añadiendo la cabecera, el total llega a los 57 bits. Si se quieren aprovechar las 12 funciones de base, hay que enviar tres paquetes, es decir, 171 bits.

En total, el control de una sola locomotora con 12 funciones consume 66 + 171 = 237 bits. Como el ancho de banda es de 8620 bits a 1 por segundo, o de 4310 bits a 0, la media es de 6465 bits por segundo. Esto significa que se pueden enviar...