domingo, 17 de enero de 2010

Matriz de LED

Uno de los mejores métodos para indicar información es por medio de pantallas LED, que, aunque costosas, dan muy buenos resultados a la hora de llamar la atención, gracias a su luminosidad.

Para generar la sensación de que la matriz muestra los datos, se usa el método de multiplexación, el cual consiste en ir encendiendo, fila a fila o columna a columna, de un forma secuencial, los respectivos LED, dentro de un arreglo de los mismos, a lo cual le llamaremos Matriz LED.

Por ejemplo, si quisiéramos encender el LED encerrado en el círculo rojo, deberíamos conectar los 2v al pin R3 (en los demás 0v) y conectar a 0v al pin C2.

Una de las cosas importantes para que nuestro letrero quede llamativo, es garantizar su luminosidad, y esto se logra suministrando la corriente necesaria para ello. No olvidemos que en estos casos, los LED van a estar encendidos una fracción de tiempo unicamente y por ende hay que elevar la corriente que pasa a través de el. Un microcontrolador no suministra la suficiente corriente para este caso, por lo que es recomendable usar transistores BJT o MOSFET según sea el caso.

El hardware básico para manejar una matriz de LED de 7 Filas por 5 Columnas puede ser el siguiente (en el cual está incluido un conector MiniUSB para la programación del microcontrolador via ICSP).



Después de varios minutos de ruteado ...


Ya teniendo el hardware básico, podemos adentrarnos en el manejo del firmware del microcontrolador para lograr, en este caso, visualizar algunas letras en nuestra matriz de LED.

Como bien se dijo al inicio de este hilo, se usa la multiplexación para generar la sensación de continuidad de encendido de los LED. El tiempo al cual se enciende y/o se apagan los LED puede ser de 1 o 2 milisegundos, con lo cual no se observaran parpadeos en la matriz.

Se puede usar una interrupción del Timer0 para controlar la multiplexación de las columnas, un código alternativo puede ser:

#int_TIMER0
void visualizar(void)
{
Ints++;
if(Ints>=8)
{
Ints=0;
FlagOk=1;
output_a(0xFF);
}
}

En el programa principal, se validaría la bandera FlagOk para visualizar los datos correspondientes a cada columna.

while(true)
{
if(FlagOk)
{
FlagOk=0;
if(i>6)
i=0;
output_b(Fila[i]);
output_a(ColLetra[i]);
i++;
}
}

Los datos correspondientes a cada fila se guardan en un buffer y se toman de un arreglo bidimensional guardado en la ROM del PIC. Para la letra A, por ejemplo, se tiene:

const char May7x5[27][7]={
{0x0E,0x13,0x13,0x13,0x1F,0x13,0x13},//A
....
};

Para cambiar la letra, usamos los pulsadores:

if(!input_state(BT1))//Verifico el estado del pulsador BT1
{
j++;
memcpy(ColLetra,May7x5[j],sizeof(ColLetra));
}






Aunque en el video no se alcanza a distinguir muy bien el mensaje, no es asi en realidad, cosas de las camaras digitales.






DESCARGAS:
PCB : Tarjeta de ensamble
CÓDIGO: Simulación en ISIS y .hex para programar

sábado, 16 de enero de 2010

DiscoPlay

Normalmente cuando se usan letreros luminosos basados en LED, uno de los grandes obstaculos se presenta cuando definimos el tamaño del mismo, ya que nosotros queremos el mas grande posible...y esto hace que los costos de fabricacion sean muy altos para la mayoria de nosotros.

Una mejor opción es usar pocos LED y que nos de la sensación de tener muchos LED's, es lo que sucede cuando ponemos a girarlos. Esto se debe a que el ojo humano solo puede resolver (o diferenciar) la frecuencia de movimiento de cuerpos a un bajo periodo de tiempo, caso que podemos aprovechar para crear la sensacion que buscamos.

Si tenemos un arreglo de 5 LED girando y los encendemos, nos da la sensacion de que hay 5 barras luminosas .... asi que solo es cuestion de controlar el encendido y apagado de estos 5 LED para crear mensajes.




El hardware de visualizacion es mucho mas sencillo y mas econónimo de realizar que un letrero publik, ya que solo consta de 5 LED, 5 transistores, 10 resistencias.

Usaremos tambien, en esta primera versión, un microcontrolador PIC12F629 configurando su oscilador interno de 4MHz, con lo cual nos quedan libres los pines del oscilador para usarlos como pines de I/O normales.

Lastimosamente, el pin de MCLR no se pude usar, ya que, por conflictos con el programador hay que decidir si se usa el oscilador interno o el pin de MCLR, otro inconveniente es que no tenemos mas pines para detectar una referencia con algun sensor (Hall o IR) para indicar el inicio de giro, por lo que hay que adaptar el código para el motor; el cual, se encargará de dar giro a nuestro desarrollo.

La ventaja es que la brd es pequeña y puede alcanzar, incluso, en ventiladores como los que se usan en PC's, claro está, con una resolución de 5 filas para dibujar las letras, si ya se quiere letras mas grandes y demás, solo es cuestion de migrar a otro microcontrolador como el 16F628A y usar ademas algún pin para detectar el inicio de giro ... podriamos decir que sería una proxima tarea para el DiscoPlay :)

Aqui la board del DiscoPlay con los LED's, resistencias y transistores en SMD:

Para visualizar la palabra HOLA, por ejemplo, se debe seguir la siguiente rutina de encendido y apagado de los LED's.

En donde los cuadros negros indican el LED encendido y los cuadros blancos indican el LED apagado, no olvidemos que el barrido es de forma horizontal, es decir, columna a columna. En camara lenta seria asi:



Por ahora no poseo el motor para montar al DiscoPlay, asi que para la demostración basta con sacudirlo un poco para ver como se forman las letras, en este caso.