domingo, 31 de agosto de 2014

Manejo de Display de 8 Segmentos con Arduino

Bienvenid@ al primera entrada (prácticamente) de Embebidos Sys, a donde daremos uso de la señales digitales del Arduino para manipular un display de 8 segmentos mediante un botón, con la finalidad de observar el funcionamiento de la entradas y salidas digitales de la placa Arduino.

¿Qué es lo que hace?

Mostraremos en un display de 8 segmentos la numeración hexadecimal, habrá un botón que variara la cantidad mostrada cada vez que sea presionado.

Materiales


  • 1 Display de 8 segmentos cátodo común
  • 2 (ó 3) Resistencias de 220 &#937
  • 1 Micro swith de dos terminales normalmente abierto.
  • 1 Arduino (UNO, MEGA, Leonardo, etc..)
  • 1 Protoboard
  • Alambre para protoboard o cables Dupont


Diagrama de Conexión

EL diagrama de conexión es muy sencillo, quizá lo único difícil es identificar como conectar el display, en el mercado existe una gran variedad de modelos, pero al final todos son lo mismo por lo que tendrás que identificar con un multímetro que pin es negativo (o cátodo) y cual de de los demás pines son positivos, para este caso estoy utilizando un display como se muestra en la siguiente imagen.
Una vez que se han identificado los pines se realiza la conexión de la siguiente manera:

El Código

Una vez lista la conexión procedemos a programar, pero antes de ello debemos primero identificar el funcionamiento de un display, como bien sabemos un display esta conformado por 7 u 8 leds ubicados de tal forma que se pueda visualizar un dígito, a cada led le corresponde una letra que va desde la "a" hasta la "g" (en este caso representamos al punto con "dp") y también un bit el cual puede tomar el valor de "0" o "1" (5 o 0 volts) que significa apagado o encendido respectivamente, con la combinación adecuada podemos formar números o letras, la siguiente imagen muestra la combinación de bits para formar la numeración hexadecimal.
Al principio mencionamos que tendríamos un botón que al presionarlo realizaría el cambio de un dígito a otro como si lo fuera sumando, entonces tomando en cuenta esto y los leds del display identificamos que tenemos 1 entrada y 8 salidas digitales.
Ahora si pasando al código vamos a la parte de configuración del Arduino a donde declaramos las entradas y salidas digitales que requerimos, esto se hace de la siguiente forma:

int a=0,b=1,c=2,d=3,e=4,f=5,g=6,dp=7,val=0,sum=0,i;
void setup()
{
  pinMode(a,OUTPUT);
  pinMode(b,OUTPUT);
  pinMode(c,OUTPUT);
  pinMode(d,OUTPUT);
  pinMode(e,OUTPUT);
  pinMode(f,OUTPUT);
  pinMode(g,OUTPUT);
  pinMode(dp,OUTPUT);
  pinMode(8,INPUT);//Botón
  
}
Por comodidad podemos declarar el nombre de cada segmento e igualarlo con el numero de pin al que se encuentra conectado, por otra parte se declaro solo una entrada que corresponde al pin 8 y es donde va conectado el botón, las demas variables que no tienen nada que ver con el display o el botón se utilizaran en el proceso.
Si recordamos la tabla con los digitos del display podemos ver que tenemos 16 combinaciones posibles, por ello la mejor estructura de control a utilizar es un "Switch case", en cada case le diremos a la tarjeta que pines deben mantenerse encendidos y apagados, por ejemplo si queremos mostrar en el display el numero 8 entonces todos los pines estaran encendidos:

switch(sum)  
  {
    case 8:
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
    break;
  }
Si queremos ver la letra 'd' entonces tenemos que apagar los segmentos a y f, por tanto el codigo quedaria de la siguiente forma (recordemos que en la numeracion hexadecimal la letra d corresponde al numero 13):

switch(sum)  
  {
    case 8://Muestra 8
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
    break;
    case 13: //Muestra d
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
  }
Finalmente el codigo en void loop() seria algo parecido a esto:

void loop()
{
  val=digitalRead(8);
  if(val==1)
  {
  switch(sum)  
  {
    //Aquí van los 'case' para cada digito
  } 
      sum++;
      if(sum>=16)
    {
      sum=0;
    }
   delay(250);
  }
}
Sencillamente lo que se hace es primero leer el pin 8 y guardarlo en una variable, si su valor es positivo (es decir 1) entra a un "Switch case" el cual mediante el valor del contador 'sum' determinara lo que se va visualizar en el display, si 'sum=0' entonces el display mostrara 0, si sum=7 en el display se verá un siete, si sum=12 en el display se verá la letra 'C' y asi sucesivamente. Una vez que termino de comparar a la variable 'sum' se le suma uno y después compara: si 'sum' es mayor o igual a 16 entonces sum regresa a cero, esto es para que se reinicie el contador y se muestre de nuevo cero, finalmente se poner un retardo de 250ms para que los dígitos se muestren suavemente cada vez que presionemos el botón.

Espera 5 segundos y después da clic en continuar...

El resultado de lo que acabamos de hacer esta en el siguiente vídeo:

Y eso es todo, espero que haya sido de utilidad, si tienes alguna duda o algún comentario puedes realizarlo acá abajo, no olvides recomendar este post, hasta la próxima...

No hay comentarios :

Publicar un comentario