Laboratorio 16 - Matriz de LED´S con Arduino
Registros de desplazamiento
Muchas veces corremos con el problema de no contar con suficientes salidas o entradas digitales en nuestros proyectos y recurrimos a utilizar otros micro controladores de apoyo en una configuración maestro-esclavo. La verdad es que manejar más de 13 Leds (sin PWM) debería sonar como algo fácil, y en realidad lo es.Los registros de desplazamiento (shifter registers) permiten expandir nuestra capacidad de entradas y de salidas digitales, basándose en el desplazamiento de una secuencia de bytes que se envía o recibe desde estos circuitos integrados.
Las dos variantes más populares de registros de desplazamiento son los de entrada en serie y los de entrada en paralelo.
Un registro de desplazamiento es un circuito digital secuencial (es decir, que los valores de sus salidas dependen de sus entradas y de los valores anteriores) consistente en una serie de biestables, generalmente de tipo D, conectados en cascada , que basculan de forma sincrónica con la misma señal de reloj. Según las conexiones entre los biestables, se tiene un desplazamiento a la izquierda o a la derecha de la información almacenada. Es de señalar que un desplazamiento a la izquierda de un conjunto de bits, multiplica por 2, mientras que uno a la derecha, divide entre 2. Existen registros de desplazamiento bidireccionales, que pueden funcionar en ambos sentidos. Los registros universales, además de bidireccionales permiten la carga en paralelo.
¿Como hicimos el proyecto?
Primero hicimos como en una tabla 8x8(por los leds de la matriz), colocamos la letra de como quisieramos que se viera y ese condigo binario que saliera convertirlo a hexadecimal y colocarlo como parte de la programacion de Arduino.
A continuacion las imagenes para formar el codigo para leer EDGAR.
Codigo Arduino(Modificado)
Este codigo esta invertido la señal puesto que asi salio en la demostracion
byte E[] = {0x7C, 0x40, 0x40, 0x78, 0x78, 0x40, 0x40, 0x7C};
byte D[] = {0x70 ,0x48, 0x44, 0x44, 0x44, 0x44, 0x48, 0x70};
byte G[] = {0x42, 0x42, 0x42, 0x42, 0x42, 0x5A, 0x7E, 0x66};
byte A[] = {0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x22, 0x1C};
byte R[] = {0x46, 0x4C,0x58, 0x70, 0x78, 0x44, 0x44, 0x78};
byte dot[]={0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
byte sp[]= {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void setup() // Prog_36_1
{ for (int j=2; j<19; j++)
pinMode(j, OUTPUT);
Serial.begin(9600);
}
void SetChar(char p)
{
Clear();
for (int fil = 0; fil <8 ; fil++)
{
digitalWrite( fil + 10 , LOW) ; // Activamos la fila para el barrido
//byte F = N[fil] ;
byte F = Selecciona( p, fil);
for (int col =7; col >= 0 ; col--)
{
digitalWrite(8-col, LOW); //Bajamos la columna
bool b = GetBit(F, col) ;
if (b)
digitalWrite( 9 - col ,HIGH); //Levantamos la columna, con su pin
else
digitalWrite( 9 - col ,LOW); // Si 0, apagamos
} // Solo si b es 1
digitalWrite( fil + 10 , HIGH) ; // Apagamos fila antes de salir
}
}
bool GetBit( byte N, int pos)
{ // pos = 7 6 5 4 3 2 1 0
int b = N >> pos ; // Shift bits
b = b & 1 ; // coger solo el ultimo bit
return b ;
}
void Clear()
{
for (int j=2; j<10; j++) // Valores de los pines de columna
digitalWrite(j, LOW); // Todos apagados
for (int k= 10 ; k<18 ; k++)
digitalWrite(k, HIGH); // Todas las filas cortadas
}
byte Selecciona( char c, byte fil)
{
if ( c == 'E') return(E[fil]) ;
if ( c == 'D') return( D[fil]) ;
if ( c == 'G') return(G[fil]);
if (c == 'A') return( A[fil]);
if (c == 'R') return( R[fil]);
if (c == '.') return( dot[fil]);
if (c == ' ') return( sp[fil]);
}
void loop()
{
String s = "EDGAR " ;
int l = s.length(); // Calcula la longitus de s
for ( int n = 0; n< l; n++ )
{
long t = millis();
char c = s[n];
while ( millis()< t+ 400)
SetChar(c);
}
}

No hay comentarios:
Publicar un comentario