En la entrada anterior vimos qué voltajes necesitamos para conectar nuestros dígitos VFD, sin embargo, lo hicimos stand-alone sin hacer uso de Arduino. Ahora, vamos a por fin, darle algo de inteligencia conectando nuestros dígitos VFD a Arduino, para lo que tenemos que hacer el interfaz con Arduino. Además, para poder usar varios dígitos usando la menor cantidad de pines posibles, vamos a implementar la multiplexación temporal con un Serie-Paralelo (SN74HC164N/SN74HC595N).

Un dígito VFD funcionando

Un dígito VFD funcionando

 Interfaz con Arduino (UDN2981)

Dejo por aquí otra vez los pines del IV-6 (el display fluorescente que estoy usando), además recordamos que para hacer que estos siete segmentos funcionen, necesitamos poner un voltio entre los terminales del filamento, 25V en la Rejilla, y otros 25V en cada una de los dígitos.

Esquema de pines del IV-6

Esquema de pines del IV-6

Ya os adelanto que si intentamos trabajar con 25V y el Arduino, sin poner nada entre medias, vamos a invocar a nuestro querido magic smoke. Así, si no quieres ver como tu Arduino pasa a mejor vida, vamos a tener que hacer algún interfaz.

El objetivo del interfaz es poder controlar señales de 25V cuando la entrada es de tan solo 5V. Hay dos tipos de drivers para esta función: los sink drivers y los source drivers. Los primeros se ponen entre la carga y la tierra, mientras que los últimos se ponen entre la fuente de voltaje y la carga.

En nuestro caso vamos a usar los source drivers ya que es la única manera de poder poner a 0V o a 25V las entradas de los segmentos. Como además, necesitamos que las salidas suban hasta 25V vamos a usar el driver UDN2981 (datasheet). El UDN2981 es un chip muy sencillo de usar, y lo podemos entender fácilmente con el diagrama interno que podemos encontrar en el datasheet, que os dejo a continuación.

Recuerda que puedes apoyar este blog y su contenido si adquieres los componentes a través de nuestros enlaces, por ejemplo, si tienes pensado comprar el UDN2981 te dejo aquí el enlace compra en Aliexpress.

Esquema interno del UDN2981

Básicamente, tenemos las conexiones de entrada, que se “amplifican” hasta el nivel de Vs. Por lo que si en la entrada IN1 tenemos 5V, en la salida de “en frente” tendremos 25V. De esta manera, el circuito que nos queda sería muy sencillo, os lo dejo a continuación, pero simplemente, las entradas IN del UDN2981 se conectarían directamente a un Arduino. El resto de conexiones del VFD las dejamos como en el primer post y con las 8 salidas digitales del Arduino, ya podríamos controlar qué símbolo mostrar en el dígito.

Interfaz para Arduino con el UDN2981

Interfaz para Arduino con el UDN2981.

Demasiados cables: Serie-Paralelo

Llamadme loco de la eficiencia si queréis, pero esto de tener 8 salidas del Arduino ocupadas para esto… No me mola un pelo… Yo uso el Arduino Nano y tenerlo así me supone gastar un porcentaje muy alto de todas sus salidas. Además, que lo guay de todo esto es romperse la cabeza para hacer las cosas mejor y más elegantemente.

Para ello, lo que vamos a usar, como os ha espoileado el título, es usar un conversor serie a paralelo. Esto lo que nos va a permitir es, Sorpresa: enviar los datos en serie y obtenerlos en paralelo. Así, solo necesitaremos 2 conexiones del Arduino: una para los datos y otra para el reloj.

Funcionamiento básico

El funcionamiento de todos estos integrados es muy parecido. Todos ellos se basan en puertas lógicas Flip-Flop con 3 entradas: La primera los datos, la señal de reloj y por último el reset. Estas puertas lógicas, cuando reciben una señal de reloj, leen el valor a su entrada y lo pasan a la salida. La salida solo lee el dato de entrada cuando se recibe el pulso de reloj, y la salida cambia al recibirse el pulso de reloj, o activar el reset.

Si la salida de uno de los Flip-Flop es la entrada del siguiente, entonces podemos ir pasando los datos entre las puertas lógicas y avanzando el dato, de uno a otro, en cada ciclo de reloj.

Chips Serie-Paralelo: 74HC595 vs 74HC164

Generalmente nos podemos encontrar dos tipos de conversores serie-paralelo: los no latched y los latched. He intentado traducirlo al castellano, pero sería algo así como “con interruptor”, y me gusta más como queda en inglés. Total, que me voy por las ramas, los conversores no latched son los más sencillos, de este tipo tenemos los 74HC164 (link aliexpress).

74HC164 sin latch

Como hemos visto en la sección del funcionamiento básico, si encadenamos varias puertas lógicas, y conectamos la señal de reloj a todas ellas, podemos ir pasando el dato que esté en el primer Flip-Flop, hacia “delante” en cada ciclo. Y esto es exactamente lo que hace el 74HC164.

En el siguiente esquema tenéis el interior del 74HC164, para que podáis entender el comportamiento. Aunque este chip tiene una puerta AND en la entrada de DSA y DSB, se puede conectar una entrada a HIGH y usar solo la otra, o interconectar las dos y ya funcionaría como si no estuviese esa puerta lógica.

Puertas lógicas del 74HC164

Puertas lógicas del 74HC164

74HC595 Latched

Por otro lado tenemos el 74HC595 (link Aliexpress) que es igual que el 74HC164 solo que en este caso, las salidas del integrado no están directamente conectadas a las salidas de las puertas lógicas. Estos chips incluyen un paso de complejidad más, añadiendo una etapa de salida, con la que podemos controlar cuando vamos a sacar los datos hacia el exterior.

Puertas Lógicas Internas del 74HC595

Puertas Lógicas Internas del 74HC595

Como podemos ver en el esquema, la primera parte, es decir, la conexión de serie a paralelo básica, es igual que en el 74HC164, pero este además tiene dos entradas más de control: RCLK y nOE. RCLK es la encargada de, cuando los datos de la primera etapa están listos, los pasa a la salida. Mientras que nOE activa las salidas.

Las comparaciones son odiosas

Aunque son dos integrados muy parecidos, puede ser que uno sea o no sea útil para tu proyecto. Por eso vamos a ver cuales son las ventajas y desventajas de cada uno, y así que puedas elegir el mejor para ti. Aunque, ya te adelanto que en muchos casos, son intercambiables y ambos pueden valer para lo mismo, con cambios menores.

  • 74HC164 Gana en:
    • Interfaz más sencilla, solo se necesitan 2 salidas de Arduino.
    • Más simple y fácil de entender
  • pero…
    • Las salidas se van actualizando según los datos van pasando.
    • Además, no se pueden cortar las salidas y ponerlas en alta impedancia

 

  • 74HC595 es mejor en:
    • Capacidad de controlar mejor las salidas del integrado
    • Se puede “convertir” en algo parecido a un 74HC164 juntando las señales de reloj (esto es un poco más avanzado)
  • pero…
    • El interfaz y código son un poco más complejos
    • Se necesitan más pines del Arduino/uC para controlarlo

Añadimos el Serie-Paralelo

En nuestro caso, hemos elegido el 74HC164 por una sencilla razón, el latch lo podemos hacer con la rejilla del dígito. Es decir, si queremos que no se vaya viendo como los datos van saliendo por las salidas del integrado, podemos desactivar la malla del VFD, y así no se iluminará nada.

El circuito queda como en el siguiente esquema. En este, ya podemos manejar, con tan solo 2 pines del Arduino, todos los segmentos de nuestro display fluorescente. En nuestro caso hemos optado por poner nMR y DSA a 5V para así que nunca se borren los datos de los registros.

Aunque en el diagrama aparezca ‘Serial Data’ y ‘Serial_CLK’ no son pines de I2C o SPI del Arduino, vale con cualquier Pin digital.

Conexión Serial-Paralelo, interfaz y VFD IV-6

Conexión completa con el Serie-Paralelo, luego interfaz de alto voltaje y el VFD

El código fuente en Arduino

Para manejar los diferentes dígitos y usar el Serie-Paralelo, vamos a usar la función de arduino ‘ShiftOut’. Además vamos a poner el ejemplo de pintar un ‘2’. Mirando el diagrama del principio del post, vemos que para iluminar el ‘2’ necesitamos encender los segmentos: 2,3,4,6 y 10;

En la función ‘shiftOut’ tenemos que definir en que orden vamos a enviar el dato. Si definimos el numero como 01110110, de manera que el primer bit de la izquierda sea lo que salga por el OUT1 del serie-paralelo, necesitaremos enviar primero el LSB.

int DataPin = 8; // Serial_Data (D8)
int ClockPin = 7; // Serial_CLK (D7)


int data = 0b01110110;

void setup(){
  pinMode(DataPin, OUTPUT);
  pinMode(ClockPin, OUTPUT);
}

void loop(){
  shiftOut(DataPin, ClockPin, LSBFIRST, data);
  delay(1000);
}

Espero que haya quedado claro, y no dudéis en dejarme en los comentarios lo que os ha parecido. En la próxima entrada, hablaremos de la multiplexación temporal para iluminar varios dígitos.

Más allá de esto recordad pasaros por mi canal de Youtube para seguir mis avances en vídeo :).


Gluón

Teleco con ganas de aprender más y compartirlo. Viajero empedernido y amante de la fotografía y la tecnología. Espero dejar mi granito de arena y que este pueda servir de ayuda.

0 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *