sábado, 19 de febrero de 2022

Diseñando un reloj digital con displays 7 segmentos


Existen varias configuraciones para manipular los displays de 7 segmentos cuando se desea realizar proyectos. En esta ocasión, estaremos mostrando algunas de estas configuraciones indicando las ventajas y desventajas de cada configuración y se diseñará un reloj digital con la más adecuada (según los criterios del autor).

Se asume que los displays 7 segmentos están controlados por un microcontrolador que se encuentra en el módulo Arduino.  

1. Conexión directa

Aquí se conecta el display directamente a los pines del microcontrolador. Este display puede ser de ánodo común o de cátodo común. En la figura 1 se muestra la conexión del display de cátodo común.

Figura 1. Conexión directa

En esta conexión se consumen 7 pines del uC por display. Para el reloj digital necesitamos 6 displays, entonces estaríamos requiriendo un uC de 6 x 7 = 42 pines. Esto sería un desperdicio de pines y de potencia, ya que cada pin maneja entre 20 a 30 mA entonces para 42 pines la potencia media consumida sería 25mA X 42 = 1.05 A. (lo cual es bastante para un uC).

Solo se podría usar 1 ó 2 displays con esta configuración, pero la programación sería más sencilla.  

2. Multiplexión en paralelo

Aquí se conectan varios displays en paralelo en un mismo puerto que puede ser el A0 - A7 y la tierra o alimentación de los displays se conectan a transistores bipolares que funcionan como interruptores, activando sólo un display por un periodo de tiempo pequeño. Este periodo tiene que ser menor a la persistencia visual tp < 100ms. La configuración se muestra en la figura 2.

Figura 2. Conexión directa en paralelo.


La ventaja de esta configuración es que se pueden usar más displays pero se utiliza un pin adicional por cada display, además de los pines de un puerto, digamos A0 - A7. Por otro lado, la programación es un poco más compleja.

3. Conexión en serie
 
Esta conexión es útil cuando se desea trabajar con cantidades mayores de displays usando un uC que tiene pocos pines de entrada/salida. En este caso se usan sólo 2 pines para controlar un gran número de displays conectados en serie (tipo cascada). Uno de los pines es el pin de datos y el otro es el pin de reloj usado para el desplazamiento de los datos. Esta configuración se ve en la figura 3.

Figura 3. Conexión en cascada.
 
La ventaja de esta conexión es que se puede manejar mayor cantidad de displays que la multiplexión en paralelo (el número puede superar sobradamente los 10 displays), pero la desventaja es que se tiene que usar ICs adicionales para cada display (como los registros de desplazamiento y los arreglos de transistores), encareciendo un poco el proyecto. La programación también es un poco más compleja.
 
DISEÑO DEL RELOJ DIGITAL
 
Nuestro reloj digital tendrá 6 displays y tres botones/interruptores de nivelación. Entonces se usará la 3ra. configuración o la conexión serial para implementar este proyecto. El diagrama circuital del reloj se muestra en la figura 4.

Figura 4. Reloj completo

En la figura 4 se observa que se usan 6 pines de salida (dos para las horas, dos para los minutos y dos para los segundos) y 3 pines de entrada (dos botones de nivelación y un interruptor de selección entre minutos y horas). El programa del arduino implementado se muestra a continuación:

Programa de control

 

Comentarios acerca del programa: 

  • En la función setup, además de configurar los pines de entrada y salida usados también se configura el Timer1 para que cuente cada segundo. El timer1 es de 16 bits y comienza a contar en 0. Cuando el contador llega al valor de OCR1A, la cuenta se reinicia a 0 y se produce una interrupción interna. El valor de OCR1A se determina de acuerdo a la siguiente fórmula:

OCR1A=fOSC×TpPrescaler-1

En esta ecuación, fosc es la frecuencia de oscilación del Arduino UNO que es típicamente 20 MHz.

El prescalador divide esta frecuencia haciendo que el temporizador cuente más lento. En este caso particular el prescalador se configura con 1024.

Tp es el tiempo deseado en segundos.
 
  • Cuando se produce la interrupción interna el programa salta a la función de interrupción ISR(TIMER1_COMPA_vect) y ejecuta lo que esta dentro de la función. Dentro de esta función se incrementa la cuenta de segundos, minutos y horas. Cuando termina la ejecución de la función, el vector del programa vuelve donde se quedó, en algún punto del programa principal (void loop()).
 
Simulación del proyecto

Se probó el correcto funcionamiento del proyecto usando el programa de simulación de circuitos SimulIDE, el cual es un software libre con capacidad de simular microcontroladores y tarjetas embebidas como el Arduino. Dejo el enlace en el nombre para más información.

Los resultados de la simulación del proyecto se pueden apreciar en el siguiente video. Para mayores detalles también pueden revisar los vídeos relacionados en las sugerencias al final del vídeo. Estos vídeos tratan acerca del desarrollo del proyecto paso a paso y acerca de la utilización del software.

 
 
Gracias por ver este tutorial, espero vuestros comentarios. Todos los derechos de autor están reservados.