Multiplexar Display 7 Segmentos
Como vimos en un articulo anterior, para controlar un Display 7 Segmentos necesitamos utilizar algun driver (por ejemplo el Registro de desplazamiento 74HC595) que nos permite controlar con pocos pines de nuestro micro controlador (arduino en nuestro caso) los 7 pines de nuestro 7 segmentos.
VENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS
Pero entonces, ¿que es y que ventajas tengo de multiplexar?, bueno supongamos que tenemos que controlar 4 displays, según nuestro análisis anterior necesitaríamos cuatro 74HC595 para controlar cada uno de los dígitos, si por cada driver utilizamos 3 pines de nuestro micro controlador, estaríamos gastando 16 pines de nuestro micro en solo visualizar números.. la cosa se empieza a complicar.
Con la técnica de multiplexado podríamos controlar los cuatro dígitos con un solo driver, esta técnica se basa en encender y apagar cada dígito de manera muy rápida, de forma tal que este cambio sea imperceptible a los ojos, aproximadamente cada 5ms.
EJEMPLO
Supongamos que quiero visualizar el numero 1234
- Unidad de mil = 1
- Centena = 2
- Decena = 3
- Unidad = 4
Para esto tenemos que hacer lo siguiente, encendemos el dígito de la unidad de mil y enviamos a visualizar el numero 1, dejamos pasar 5ms lo apagamos y prendemos el dígito de la decena y enviamos a visualizar el numero 2, dejamos pasar 5ms lo apagamos y prendemos la Decena y enviamos a visualizar el numero 3, dejamos pasar 5ms lo apagamos y prendemos la Unidad y enviamos el numero 4.
Esto es una gran ventaja ya que reducimos considerablemente el costo de nuestra placa al ahorrarnos de 3 componentes que suelen ser caros, ganando en costo y reduciendo el espacio en la placa.
RESUMEN
- Reducción de componentes en la placa.
- Economizamos nuestro proyecto.
- Menor utilización de pines.
DESVENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS
Como nada es gratis en esta vida y esto tampoco, hacer esto tiene una serie de desventajas que debemos tener en cuenta en nuestro proyecto.
- Complicación de software.
- Debemos estar prendiendo y apagando nuestros display cada 5ms.
¿Que pasaría si necesito ejecutar una acción que demore mas de ese tiempo y que no se pueda interrumpir?,
por ejemplo ejecutar la lectura de un sensor de temperatura que suele demorar mas de ese tiempo, veríamos un numero incorrecto en los displays.
CIRCUITO PARA MULTIPLEXAR DISPLAY 7 SEGMENTOS
Para esto debemos controlar el encendido y apagado de cada 7 Segmento, en este caso utilizo transistores como interruptores, cuando en la base del transistor le coloco un uno permito que circule corriente a masa y el display se encienda, cuando le coloco un cero en la base los display se apagaran por que el transistores esta funcionando como un circuito abierto.
EJEMPLO ARDUINO
Este es un ejemplo que encontré en la web y la verdad me pareció muy completo así que se los comparto
#define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 // Pushbuttons connected to pins 9 and 10 #define BTN1 14 #define BTN2 15 // Pins driving common anodes #define CC1 9 #define CC2 10 #define CC3 11 #define CC4 12 // Pins for A B C D E F G, in sequence const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 }; // Segments that make each number const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111}; int estadobtn1 = 0; int estadobtn2 = 0; int digit1 = 0; int digit2 = 0; int digit3 = 0; int digit4 = 0; int count = 0; int val; int val2; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(BTN1, INPUT); pinMode(BTN2, INPUT); digitalWrite(BTN1, HIGH); // activa RPA digitalWrite(BTN2, HIGH); // activa RPA pinMode(CC1, OUTPUT); pinMode(CC2, OUTPUT); pinMode(CC3, OUTPUT); pinMode(CC4, OUTPUT); count = 0; } void loop() { val = digitalRead(BTN1); // lee el valor de entrada y almacénlo en val if (val != estadobtn1) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { count++; count %= 10000; } } estadobtn1=val; val = digitalRead(BTN2); // lee el valor de entrada y almacénlo en val if (val != estadobtn2) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { if (count == 0) { count=9999; } else { count--; } } estadobtn2=val; } // display number digit1=count / 1000; digit2=(count - (digit1 * 1000)) / 100; digit3=(count - (digit1*1000) - (digit2*100)) / 10; digit4=count % 10; lightDigit1(numbers[digit1]); delay(2); lightDigit2(numbers[digit2]); delay(2); lightDigit3(numbers[digit3]); delay(2); lightDigit4(numbers[digit4]); delay(2); } void lightDigit1(byte number) { digitalWrite(CC1, LOW); digitalWrite(CC2, HIGH); digitalWrite(CC3, HIGH); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, LOW); digitalWrite(CC3, HIGH); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit3(byte number) { digitalWrite(CA1, HIGH); digitalWrite(CC2, HIGH); digitalWrite(CC3, LOW); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit4(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, HIGH); digitalWrite(CC3, HIGH); digitalWrite(CC4, LOW); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], bit); } }
-
Los displays son anodo o catodo común? Y los transistores?
-
Hola necesito conectar 20 displays en fila, 4 grupos de 5 displays, que obviamente muestran datos diferentes, la lógica sería la misma?
-
Hola que sucede si quiero hacer mis display a un tamaño grande y los tengo que construir con led cada segmento de cada display los tendria que alimentar con un transistor?
-
"por ejemplo ejecutar la lectura de un sensor de temperatura que suele demorar mas de ese tiempo, veríamos un numero incorrecto en los displays."
¿Como se corregiria eso? -
Disculpa una pregunta... si únicamente necesito 3 display funciona igual con el mismo código o debo de borrar alguna parte??
Si es así, me podrías decir cuál debe ser? -
Hola que sucede si quiero hacer mis display a un tamaño grande y los tengo que construir con led cada segmento ???
-
porque no utilizar ub SN 7447 o cd 4511. ( de acuerdo a si es anodo o catodo comun).
Asi se utilizarian menos pines del ARDUINO.Yo para display de dos digitos utilizo solo un SN 7447, de forma que uso solo cuatro pines para manejo de numeros y dos pines para multiplexar los anodos o catodos del display.
de esta manera me estoy ahorrando cutro pines para cuaquier otro trabajo -
estoy en un proyecto de crear un cronometro muy grande para 99seg y 99 centesimos con arduino con diplay individales de 7 segmentos
me podrias ayudar? -
de cuanto son las resistencias? lo estoy haciendo en thinkerkad pero no me encienden los displays
-
Consulta, yo tengo unos 7 segmentos de ánodo común pero que van a 1 2V, no a 5V. Que driver podría utilizar?
Deja un comentario
wauuuuuuuuuuuuuuuuuuuuuuuuuu