MAKER.

Aprende a hacerlo tú mismo paso a paso y automatízalo.

Contador 0 a 9 con decodificador 74LS47N y Arduino.

En otras entradas de este blog hemos hablado sobre el display de 7 elementos y cómo configurarlo para que nos muestre una numeración según la alimentación de sus pines. Visita los siguientes enlaces para más información:

¿Cómo conectarlo a ARDUINO?

En el vídeo anterior vimos como conectar un display de 7 segmentos a un decodificador 74LS47N de manera directa, introduciendo las entradas de los puertos ADBC de manera directa, lo que implicaba que, para cada número decimal, se intercambiara las posiciones de los puertos de entrada según el código BCD establecido en la hoja de características del chip 7447.

tabla de verdad del 74LS47N

Como puedes ver tenemos 8 posibilidades para mostrar una salida en el display, cambiando los terminales de entrada y según la configuración de la tabla de la verdad.

Si lo piensas esta forma de proceder no es óptima, ya que necesitas de manipular manualmente las entradas para obtener un valor específico. Y como eso no nos gusta, vamos a crear la forma de hacer que los números se representen automaticamente. Y eso lo haremos con ARDUINO.

El circuito que vamos a utilizar es el siguiente:

Circuito decodificador conectado a display en ARDUINO

La única diferencia en el circuito manual es que el circuito con ARDUINO simulado mediante Tinkercad no tiene el decodificador 74LS47N, sino otro equivalente CD4511 que utiliza un cátodo común. Pero tanto la alimentación de sus patillas como la configuración de sus pines de entrada y salida son las mismas.

NOTA: El CD4511 de Tinkercad no tiene funcionalidad habilitada para funcionar con el ARDUINO, por lo que si simulas un circuito con Tinkercad no va a funcionar (de momento a la hora de hacer este tutorial no funciona).

Visita el proyecto en TINKERCAD.

El código que va a hacer que se repita continuamente es el siguiente:

const int pin[] ={9,10,11,12};
const byte numeros[10] = {0b00000000,0b00000001,0b00000010, 0b00000011, 0b00000100, 0b00000101, 0b00000110,0b00000111, 0b00001000, 0b00001001};

void setup() {
 for (int i = 0; i < 4; i++){
 pinMode(pin[i], OUTPUT);
}
}

void loop() {
 for (int i=0; i<10; i++){
 display(i);
 delay(1000);
}
}

void display(int number){
 byte numerodigito = numeros[number];
 for (int i=0; i<4; i++){
 int bit = bitRead(numerodigito, i);
 digitalWrite(pin[i], bit);
}
}

Explicando el código.

El código es sencillo de entender. Para empezar antes de la función principal main(), creamos dos constantes que representarán a los pines de ARDUINO que vamos a utilizar (en nuestro caso los pines digitales del 9 al 12 incluidos), y otra constante que también nos servirá para guardar los valores de cada número que se va a mostrar en el display.

En realidad los números que se guardan en esta constante son números en formato binario, ya que se utiliza el modificador 0b (que indica que el número que tiene esta constante es binario).

Y las constantes son constante de tipo Array, siendo la primera constante pin[], la que guarda en un array el número de puerto de la Arduino, y la segunda constante números[], la que guarda los números del 0 al 9 en formato binario. Fijate que el tipo de constantes es diferente en cada constante porque, en la primera definimos los puertos y eso hace que necesitemos un tipo entero (int); mientras que en la segunda necesitamos un tipo byte porque cada elementos del Array es un valor byte.

En el setup, necesitamos recorrer los puertos de nuestro Arduino. Por eso utilizamos un bucle for para asignar los puertos seleccionados en la constante pin[i], y los definimos como salida.

Para el loop() vamos a escribir la estructura repetitiva, lo que necesitamos hacer es que por cada entrada del 7447, obtengamos una salida representativa. Como el valor de la constante numeros[] es 10, tenemos que crear un bucle que llame a los 10 primeros valores del array numeros[], que son la representación binaria de los 10 primeros números decimales. A continuación llamo a una nueva función display y entre paréntesis le paso el valor del elemento de la constante numeros[]. Para terminar le doy un delay de 1000 mili segundos.

El loop hace que el vaya cogiendo cada elemento de la constante numeros[], que tiene guardado los números decimales en formato binario. Con eso, hacemos le pasamos a la función display cada elemento cargado en el programa.

Y nos queda el elemento display(). Como puedes ver entre paréntesis se le incluye un tipo entero como parámetro que representará el valor del elemento numero[] seleccionado en el instante del loop. Ese valor es asignado a una nueva variable numerodigito, que guarda el valor instantáneo del valor de numero[]. Como las entradas del integrado 7447 son 4, para cada valor de número[], le corresponde una de las entradas, de ahí que haga un bucle de 4 elementos; por eso, dentro del bucle, una nueva variable bit, lee el valor del array numero[] seleccionado en dicho instante gracias a la función interna de Arduino bitRead (por eso se le pasa la variable que acumula el valor y el puerto correspondiente del bucle anterior).

Así que ya solo queda hacer que la salida se active o no con el método digitalWrite().

Ahora cuando conectes el cable USB a tu ARDUINO y subas el scket a tu placa, cuando se suba empezará a mostrarse los números decimales en el display de 7 segmentos con un control del decodificador 74LS47N.

funcionamiento del dsiplay con ARDUINO y decodificador 7447N

Espero que te haya gustado esta entrada y recuerda compartir esta entrada para que llegue a más gente. Así es como puedes ayudarme a que mi formación llegue a más personas.