lunes, 17 de septiembre de 2012

Display de 7 segmentos con Arduino



Vamos a manejar un display de 7 segmentos cátodo común miniatura de referencia SM420561K para ser implementado en el protoboard.

El display dispone de 7 leds para los segmentos a, b, c, d, e, f, g tal como se muestra en la figura anterior.Además se dispone de un octavo led para el punto. La configuración de pines se indica también en la figura. Existen dos pines para el cátodo común que debe conectarse a GND (tierra).

El objetivo del presente proyecto es visualizar en el display los números del 0 al 9, y las letras A,B,C.D,E,F,
del sistema numérico  Hexadecimal.
El punto solo enciende con las letras.



En los almacenes especializados, como tienda de Robótica,  donde se suministran accesorios para trabajar con el Arduino venden  cables  de colores, muy útiles para llevar un orden y no confundirnos al  conectar el display a los pines del Arduino.
Conectores rápidos Macho - Macho 12" x 10
Nosotros conectamos cada segmento con un cable de color específico tal como se muestra en el siguiente esquema, disponiendo de una resistencia de 220 ohmios, 1/4 watio, en serie con cada diodo led, para limitar  la corriente en cada led y proteger los puertos del Arduino:


El programa en Arduino es el siguiente:


//Visualización en display de 7 segmentos de los caracteres del sistema hexadecimal

// Si el carácter es alfabético se enciende el punto decimal

// Los Leds  a,b,c,d,e,f,g y el punto decimal P se encienden al producirse un nivel lógico alto(HIGH) en el pin 

int i;
int j;
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
int P=  9;
int retardo= 2000;

void setup( )
{
  pinMode ( a, OUTPUT);
  pinMode ( b, OUTPUT);
  pinMode ( c, OUTPUT);
  pinMode ( d, OUTPUT);
  pinMode ( e, OUTPUT);
  pinMode ( f, OUTPUT);
  pinMode ( g, OUTPUT);
  pinMode ( P, OUTPUT);

  }

 void loop ( )
 {
       
    for (i=0;i<=15;i++) 
   { 
     
     if (i == 0)   // 0
    {digitalWrite(a,HIGH);    //enciende el segmento a     
     digitalWrite(b,HIGH);    //enciende el segmento b          
     digitalWrite(c,HIGH);    //enciende el segmento c         
     digitalWrite(d,HIGH);    //enciende el segmento d          
     digitalWrite(e,HIGH);    //enciende el segmento e         
     digitalWrite(f,HIGH);    //enciende el segmento f         
     digitalWrite(g,LOW);    //apaga el segmento g     
     digitalWrite(P,LOW);   //apaga el punto P  
     delay(retardo);}
                  
    if (i == 1)    // 1
     {digitalWrite(a,LOW);    //apaga el segmento a  
     digitalWrite(b,HIGH);    //enciende el segmento b        
     digitalWrite(c,HIGH);    //enciende el segmento c         
     digitalWrite(d,LOW);    //apaga el segmento d          
     digitalWrite(e,LOW);    //apaga el segmento e         
     digitalWrite(f,LOW);     //apaga el segmento f       
     digitalWrite(g,LOW);    //apaga el segmento g     
     digitalWrite(P,LOW);   //apaga  el punto P
      delay(retardo);}
         
     if (i == 2)     //2
    {digitalWrite(a,HIGH);     //enciende el segmento a    
     digitalWrite(b,HIGH);     //enciende el segmento b         
     digitalWrite(c,LOW);     //apaga el segmento c         
     digitalWrite(d,HIGH);    //enciende el segmento d          
     digitalWrite(e,HIGH);    //enciende el segmento e        
     digitalWrite(f,LOW);     //apaga el segmento f        
     digitalWrite(g,HIGH);   //enciende el segmento g     
     digitalWrite(P,LOW);    //apaga el punto P
      delay(retardo);}
        
     if (i == 3)    //3
    {digitalWrite(a,HIGH);     //enciende el segmento a    
     digitalWrite(b,HIGH);     //enciende el segmento b         
     digitalWrite(c,HIGH);     //enciende el segmento c        
     digitalWrite(d,HIGH);     //enciende el segmento d          
     digitalWrite(e,LOW);     //apaga el segmento e       
     digitalWrite(f,LOW);      //apaga el segmento f       
     digitalWrite(g,HIGH);    //enciende el segmento g     
     digitalWrite(P,LOW);  //apaga el punto P
     delay(retardo);}
          
     if (i == 4)    //4
    {digitalWrite(a,LOW);      //apaga el segmento a    
     digitalWrite(b,HIGH);      //enciende el segmento b          
     digitalWrite(c,HIGH);      //enciende el segmento c         
     digitalWrite(d,LOW);      //apaga el segmento d         
     digitalWrite(e,LOW);      //apaga el segmento e         
     digitalWrite(f,HIGH);     //enciende el segmento f       
     digitalWrite(g,HIGH);    //enciende el segmento g     
     digitalWrite(P,LOW);    //apaga el punto P
     delay(retardo);}
      
     if (i == 5)    //5
    {digitalWrite(a,HIGH);     //enciende el segmento a  
     digitalWrite(b,LOW);      //apaga el segmento b          
     digitalWrite(c,HIGH);     //enciende el segmento c         
     digitalWrite(d,HIGH);    //enciende el segmento d          
     digitalWrite(e,LOW);     //apaga el segmento e       
     digitalWrite(f,HIGH);     //enciende el segmento f         
     digitalWrite(g,HIGH);    //enciende el segmento g     
     digitalWrite(P,LOW);    //apaga el punto P 
    delay(retardo);}    
       
     if (i == 6)    //6
    {digitalWrite(a,LOW);       //apaga el segmento a  
     digitalWrite(b,LOW);       //apaga el segmento b        
     digitalWrite(c,HIGH);      //enciende el segmento c         
     digitalWrite(d,HIGH);     //enciende el segmento d          
     digitalWrite(e,HIGH);     //enciende el segmento e         
     digitalWrite(f,HIGH);     //enciende el segmento f         
     digitalWrite(g,HIGH);    //enciende el segmento g    
     digitalWrite(P,LOW);    //apaga el punto P
     delay(retardo);}
         
     if (i == 7)     //7
     {digitalWrite(a,HIGH);     //enciende el segmento a
     digitalWrite(b, HIGH);     //enciende el segmento b          
     digitalWrite(c, HIGH);     //enciende el segmento c         
     digitalWrite(d,LOW);      //apaga el segmento d         
     digitalWrite(e, LOW);     //apaga el segmento e         
     digitalWrite(f, LOW);     //apaga el segmento f       
     digitalWrite(g, LOW);    //apaga el segmento g     
     digitalWrite(P,LOW);    //apaga el punto  P
     delay(retardo);}
   
     if (i == 8)      //8
    {digitalWrite(a,HIGH);      //enciende el segmento a  
     digitalWrite(b, HIGH);     //enciende el segmento b   
     digitalWrite(c, HIGH);      //enciende el segmento c    
     digitalWrite(d, HIGH);     //enciende el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);     //enciende el segmento
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,LOW);    //apaga el punto P 
      delay(retardo);}
    
    if (i == 9)      //9
    {digitalWrite(a,HIGH);     //enciende el segmento a  
     digitalWrite(b,HIGH);     //enciende el segmento b   
     digitalWrite(c,HIGH);     //enciende el segmento c     
     digitalWrite(d,LOW);     //apaga el segmento d         
     digitalWrite(e,LOW);     //apaga el segmento e       
     digitalWrite(f,HIGH);    //enciende el segmento f         
     digitalWrite(g,HIGH);   //enciende el segmento g    
     digitalWrite(P,LOW);   //apaga el punto P
    delay(retardo);}
      
     if (i == 10)      // A 
    {digitalWrite(a,HIGH);      //enciende el segmento a  
     digitalWrite(b, HIGH);     //enciende el segmento b   
     digitalWrite(c, HIGH);      //enciende el segmento c    
     digitalWrite(d, LOW);      //apaga el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);     //enciende el segmento
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,HIGH);   //enciende el punto P
      delay(retardo);}

     if (i == 11)       // B
    {digitalWrite(a, LOW);      //apaga el segmento a  
     digitalWrite(b, LOW);      //apaga el segmento b   
     digitalWrite(c, HIGH);      //enciende el segmento c    
     digitalWrite(d, HIGH);     //enciende el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);     //enciende el segmento
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,HIGH);     //enciende el punto P
      delay(retardo);}


     if (i == 12)       // C
    {digitalWrite(a, HIGH);      //enciende el segmento a  
     digitalWrite(b, LOW);       //apaga el segmento b   
     digitalWrite(c, LOW);       //apaga  el segmento c    
     digitalWrite(d, HIGH);      //enciende el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);      //enciende el segmento
     digitalWrite(g, LOW);      //enciende el segmento g  
     digitalWrite(P,HIGH);     //enciende el punto P
     delay(retardo);}
     
   
     if (i == 13)       // D
    {digitalWrite(a, LOW);       //apaga el segmento a  
     digitalWrite(b, HIGH);      //enciende el segmento b   
     digitalWrite(c, HIGH);      //enciende el segmento c    
     digitalWrite(d, HIGH);     //enciende el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, LOW);      //apaga el segmento f
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,HIGH);   //enciende el punto P
     delay(retardo);}

    
     if (i == 14)      //E
    {digitalWrite(a,HIGH);       //enciende el segmento a  
     digitalWrite(b, LOW);       //apaga el segmento b   
     digitalWrite(c, LOW);       //apaga el segmento c    
     digitalWrite(d, HIGH);     //enciende el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);     //enciende el segmento
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,HIGH);    //enciende  el punto P 
      delay(retardo);}

     
    if (i == 15)      //F
    {digitalWrite(a,HIGH);       //enciende el segmento a  
     digitalWrite(b, LOW);       //apaga el segmento b   
     digitalWrite(c, LOW);       //apaga el segmento c    
     digitalWrite(d, LOW);      //apaga el segmento d   
     digitalWrite(e, HIGH);     //enciende el segmento e       
     digitalWrite(f, HIGH);     //enciende el segmento
     digitalWrite(g, HIGH);    //enciende el segmento g  
     digitalWrite(P,HIGH);    //enciende  el punto P
     delay(retardo);}
               
     }
     }

Veamos una fotografía del montaje realizado:


La alimentación al Arduino UNO R3 se establece a través de una pila de 9 voltios recargable, con un plug de 2.1 mm, positivo al centro.
Se puede obtener un programa mucho más corto utilizando arreglos,tal como se muestra a continuación:


// Display de 7 segmentos,catodo común, en hexadecimal usando arreglos

void setup (){ 

  for (int X = 2; X <= 9; X++)
  pinMode(X,OUTPUT);
}

void loop (){

  int caracter = 0;
  while (caracter <= 15) {
  display7sg(caracter);
  caracter ++;
  delay (3000);
  }
  }

 void display7sg(int num){
 byte
 valores[]={B00111111,B00000110,B01011011,B01001111,B01100110,B01101101,B01111101,B00000111,B01111111,B01101111,B11110111,B11111100,B10111001,B11011110,B11111001,B11110001};
 for (int X = 0; X <= 7; X++) digitalWrite ( X + 2, bitRead(valores[num],X));
 }

















No hay comentarios:

Publicar un comentario