Controladores independientes
El hardware
1. Presentación
El panel de control presentado anteriormente puede causar problemas si son varias personas las que quieren controlar los trenes. En este caso, es mucho más práctico tener controladores independientes. Estos controladores podrían conectarse a «regletas» o ladrones I²C que podrían disponerse en diferentes puntos de la red.
Esto es lo que se podría hacer:
-
Hacer una conexión por medio del bus I²C.
-
Utilizar un Arduino Nano como controlador.
-
Controlar la velocidad y el sentido de la marcha.
-
Usar pulsadores e interruptores para controlar las funciones.
-
Conectar una pequeña pantalla OLED para conocer la consigna de velocidad y la locomotora que se está conduciendo.
-
Y, por qué no, instalar un led RGB para ver desde lejos el estado del controlador.
Todo está integrado en el siguiente diagrama, con el pequeño Arduino Nano usado de forma óptima.
Son necesarias algunas explicaciones. La conexión I²C se realiza a través del conector J1, arriba a la izquierda; la señal I²C entra por los pines A4 y A5. La tensión de alimentación se inyecta directamente a Vin, por lo que es necesario que sea superior a 5 V para que el regulador integrado al Arduino Nano funcione correctamente. Es por ello por lo que utilizaremos la alimentación de 7,5 V, disponible en los conectores I²C. En la parte inferior, se puede ver el potenciómetro de control de velocidad y el interruptor de selección de dirección conectados a A6 y a A7.
El sentido de la marcha se controla por medio de un interruptor de tres posiciones conectado al conector SW1. El interruptor controla un divisor de voltaje, como en el panel de control, por lo que es un valor analógico que será leído y convertido en uno de los tres valores posibles: avance, retroceso y parada.
Dependiendo de la posición del interruptor, las resistencias R2 y R3 se mantienen o se derivan, lo que permite variar el voltaje aplicado a A6 y, por tanto, el valor leído por el programa, tal y como se muestra en la siguiente tabla.
Posición |
R2+R3 |
Voltaje en A6 |
Valor leído |
Valor/128 |
Parada (Stop) |
14,7 kΩ |
2,00 V |
410 |
3,2 |
Avance |
4,7 kΩ |
0,88 V |
180 |
1,4 |
Retroceso |
10 kΩ |
1,56 V |
320 |
2,5 |
En la última columna, el valor se ha dividido entre 128...
El programa
1. La librería gráfica
El Arduino Nano no tiene mucha memoria. Por eso se eligió la biblioteca u8x8. A diferencia de su hermana mayor, la biblioteca u8g2 (que ya hemos utilizado en el capítulo anterior), u8x8 escribe directamente en la memoria de la pantalla; de ahí un importante ahorro de memoria (con esta pantalla de 128 x 64 píxeles, hay que reservar 1 kB de memoria para poder utilizar la u8g2). Esto no está exento de algunas limitaciones: no es posible dibujar gráficos en pantalla, pero se pueden mostrar bloques de 8 x 8 píxeles; el texto solo puede tener un tamaño de múltiplos de 8 píxeles, ya que la pantalla se corta en «tejas» de 8 x 8 píxeles (de ahí el nombre de la biblioteca).
La biblioteca u8x8 está disponible en la siguiente dirección: https://github.com/olikraus/u8g2/wiki/u8x8reference
Para instalarla en el entorno de desarrollo de Arduino, basta con abrir el gestor de bibliotecas e incorporar la biblioteca u8g2, que también incluye la librería u8x8. Así que probablemente ya se instaló en el capítulo anterior.
El constructor
Para utilizar la biblioteca u8X8, primero hay que declarar una instancia del objeto u8x8. No hay solo una clase U8X8, sino muchas clases derivadas, una para cada modelo de pantalla; solo hay que abrir uno de los programas de ejemplo proporcionados con la biblioteca para darse cuenta de ello. Para manejar la pantalla presentada aquí, se debe instanciar la siguiente clase:
U8X8_SSD1306_128X64_NONAME_4W_HW_SPI
El nombre no se elige al azar, sino que corresponde a las características técnicas de la pantalla:
-
SSD1306: referencia del controlador de pantalla.
-
128x64: número de columnas y renglones.
-
NONAME: significa que se trata de un modelo genérico.
-
4W: comunicación en 4 cables.
-
HW: utilización de la interfaz física (hardware).
-
SPI: interfaz SPI.
El constructor toma varios parámetros adicionales que permiten definir las señales suplementarias necesarias para manejar la pantalla:
-
CS (chip select): selección del circuito (D10).
-
DC (display control): acceso a la memoria de despliegue (D7).
-
RES (register select): acceso a los registros de configuración (D8).
El constructor que permite la inicialización del circuito tiene...
Para ir más allá
1. Un amplificador de bus
Para conectar los controladores al bus I²C, será necesario crear algún tipo de «regleta I²C» que permita la conexión de los controladores. Ya que estamos en ello, igual crear un alargador de bus I²C que también permita la conexión de otros periféricos I²C.
Si se busca bien en los catálogos de componentes de NXP (p. ej., Philips, el creador del estándar I²C), se pueden encontrar circuitos diseñados para ampliar el alcance del bus I²C, superando así su principal limitación. Uno de los circuitos más recientes de esta categoría es el PCA9615. Permite establecer un enlace I²C diferencial, en el que cada una de las señales SDA y SCL requiere dos cables para la transmisión de datos. Esto significa que se necesita un total de cinco cables, incluyendo la tierra, en lugar de tres para un enlace I²C convencional. Este bus se llama dI²C, que significa I²C diferencial.
El PCA9615 se constituye esencialmente de dos amplificadores bidireccionales. Por un lado, está el bus I²C clásico y, por el otro, el bus dI²C. El punto fuerte de este circuito es su lógica de cambio de sentido, que permite que los amplificadores se activen instantáneamente en un sentido u otro, según el lado del que provengan las señales.
La ventaja de este enlace diferencial es una alta inmunidad de las señales al ruido. Además, la instalación de verdaderos terminadores en los extremos del bus (y no simples pull-ups como en I²C) permite garantizar una alta velocidad de transmisión incluso en distancias importantes.
Todavía no existe un conector realmente estandarizado, ya que, aunque se recomienda un cable Ethernet de categoría 5 para transportar las señales, el diagrama de conexión del conector 8P8C de tipo RJ45 varía según el fabricante.
La placa de evaluación propuesta por NXP (descrita en la ficha técnica del UM10856) y la placa de interfaz desarrollada por SparkFun (ya no está disponible) proponen conexiones incompatibles. La placa desarrollada para este libro será necesariamente incompatible con una de las dos y, como se ha optado por llevar dos fuentes de alimentación distintas (5 V y 7,5 V)...