Gracias al bajo costo de los leds "comunes" hoy en dia es posible la realizacion de carteles que presentan mensajes con letras representadas por leds que se conectan matriacialmente en una configuracion de filas y columnas.
Cada uno de estos led forman lo que en una pantalla seria lo que llamaríamos pixel.
Obviamente que para lograr esto y ahorrarse de una cantidad importante de circuitos integrados es imprensindible la utilización de un microcontrolador.
El uso de un microcontrolador por supuesto que implica no solo tener conocimientos de electronica digital sino también de programación.
La tecnica que se utiliza para realizar estos carteles es el multiplexado ya que es el metodo que nos permite encender mayor cantidad de leds con una cantidad de pines del micocontrolador razonable, ante todo esto hay que decir que segun sea el tamaño del cartel que se quiera construir (tanto en numeros de letras como en tamaño de las mismas) va a depender de que tan sostificado debe ser el microcontrolador (PIC) a utilizar, esto a su vez va a incidir en el costo monetario claro está.
Uno de los tamaños que más se suele emplear es el de una matriz de 7 filas por 80 columnas, que permite escribir unas 14 o 16 letras de 7 "pixeles" de altura.
A pesar de no ser muy grande se necesitan 560 leds para realizar el cartel. Los circuitos integrados encargados para encender los leds que representaran la letra pueden ser de dos tipos, uno llamado LATCH que basicamente es una memoria en a que le grabamos un valor y este lo mantiene en sus salidas hasta que se le indique. Esto nos permite que si usamos varios latches se podrian encender los leds uno por uno pero con una velocidad que no haga notar el parpadeo, y asi formar la palabra en el cartel.
La otra forma es utilizar circuitos integrados de registro de desplazamiento. El registro de desplazamiento es un sistema secuencial que trabaja con los pulsos de reloj. El principio de este es que a cada transicion de la señal de reloj (clock) de nivel logico inferior a nivel logico superior, las salidas evolucionan de tal manera que cada una de ellas toma el valor de su precedente, excepto, por supuesto, la primera, que toma el valor de la entrada serie.
Para controlar un registro de desplazamiento de esta tipo (1 entrada serie y 8 salidas paralelo) se necesitan tan solo 3 patas del microcontrolador PIC, DATA es el encargado de decirle al registro de desplazamiento que lo que ingresamos es un 0 o un 1, CLOCK este se encarga de avisarle al registro que el dato ya esta listo para ser ingresado, RESET se encarga de "vaciar" la columna escribiendo 0 en todas las salidas del registro.
Un circuito integrado de registro de desplazamiento que cumple con las funciones requeridas para lograr esto es el 74HC164N un registro de 8 bits muy barato y facil de conseguir. Es decir con este circuito se puede lograr una columna de 8 bits, para construir un cartel de 80 columnas necesitamos 10 de este integrado.
Las columnas son las salidas del registro de desplazamiento y las filas las salidas del PIC.
En el diagrama de arriba se puede apreciar en forma simple como conectar la matriz de leds, por o que vemos podemos decir que para lograr una matriz de 7 x 80 necesitariamos conectar 10 registros de desplazamiento de forma tal que la ultima salida de cada uno de ellos (Q7) se conecte a la entrada serie del registro siguiente es decir se conectaria en serie, mientras que las salidas data y clock del PIC se conectarian en paralelo con las entradas serie y clock de los 10 registros.
Para encender los 80 leds por ejemplo, habria que escribir en la linea DATA 11111…..111 si se quisiera encender los leds uno por medio se escribiria 10101……0101 en la linea data, por supuesto que eso lo logra la programacion que le demos al PIC.
Con lo que dijimos solo podemos "manejar" tan solo una fila, pero si tenemos 7 filas ¿Debemos utilizar un registro de desplazamiento para cada una de las filas?, la repuesta es no, si bien se podria utilizar 7 registros de este tipo, la cantidad de circuitos integrados necesarios (56) haría muy complejo el dieño del circuito impreso y el costo total del proyecto no sería aconsejable.
Lo que se hace es aprovechar un "defecto" del ojo humano, que mantiene la imagen de la vista por unos 20 o 30 milisegundos, para encender una fila a la vez, pero muy rapidamente, de forma que todo el cartel parezca estar encendido conjuntamente.
Si estamos con un proyecto de 7 filas y 80 columnas, sin utilizar registros de desplazamiento necesitariamos 560 patas de entrada/salida del PIC. Con el diagrama expuesto (multiplexado) solo necesitamos 7 de ellos para seleccionar la fila a escribir y tres para controlar el registro de desplazamiento, afortunadamente con un PIC economico se puede lograr esto.
Funcionamiento de una matriz
La matriz esta compuesta por una serie de filas y columnas la interseccion entre ambas contiene un led, para que este encienda, tiene que recibir simultaneamente un 0 en la fila y un 1 en la columna, cuando se da esta condicion la electronica del circuito se encarga de encender el led correspondiente.
La forma de generar un mensaje sobre el cartel es relativamente mas sencilla si procedemos a aplicar el siguiente algoritmo:
1) Apagar todas las filas
2) Escribir los valores correspondientes a la primer fila en el que el registro de desplazamiento, teniendo en cuenta que el primer digito binario colocado corresponde al ultimo en poner al de la primer columna.
3) Encender la primera fila, esperar un tiempo y volver a apagarla.
4) Repetir los pasos 2 y 3 para las filas restantes.
El tiempo de la demora debe ser tal que permita una visualizacion correcta, sin molestos parpadeos y con los leds brillantes. Hay que tener en cuenta que si utilizamos tiempos mayores para el encendido de cada fila, el brillo de los leds sera mayor, pero también aumentara el parpadeo.
La forma de transformar este algoritmo en un programa funcional depende de cada programador, y puede ser más o menos complejo segun se permitan diferentes tipos de caracteres, animaciones etc.
Un punto a tener en cuenta es el brillo del led por lo que la intensidad del mismo dependera de que tipo de led se utilice. En caso de un tipico cartel de 7 filas, a pesar de que las veremos encendidas al mismo tiempo, cada led estara solamente encendido la septima parte del tiempo, por lo que su brillo sera siete veces inferior al normal, y nuestro cartel apenas sera visible.
Por suerte esto tiene solucion, dados que los tiempos que permanecera encendido cada led no superara los 20 o 30 milisegundos, podremos hacerles circular una corriente mayor a la nominal sin que lleguen a dañarse, con lo que brillaran mucho mas intensamente, dando como resultado un cartel perfectamente visible.
El Circuito
Se explicara el circuito en base a un Pic sencillo y economico como el 16F628A, y como se dijo anteriormente el proyecto tamaño de cartel etc dependera de cuan sostificado sea el pic a utilizar.
El empleo de una memoria EEPROM externa de un tamaño relativamente grande como la 24C256, nos brinda la posibilidad de almacenar mucho texto en ella, tambien esta seccion puede ser ampliada segun los requerimientos del proyecto.
El circuito se puede considerar en dos partes: la primera sera la logica de control y la segunda en el display o pantalla con sus correspondientes registros de desplazamiento.
Circuito Controlador
Este es el cerebro de nuestro cartel. Sera el encargado de gestionar el encendido de cada led mediante ordenes enviadas a las columnas mediante el registro de desplazamiento y a las filas.
Como una fila tendra muchos leds (80 por ejemplo) y existe la posibilidad que en algun momento puedan estar todos encendidos, no podemos conectarlas directamente a las patas E/S del PIC, porque la corriente que necesitarian los leds en cuestion haria que el puerto del microcontrolador se quemara, para que esto no ocurra se utilizan transistores que puedan manejar la corriente necesaria.
El corazon del circuito es el propio PIC 16F628A, que tiene su pata RESET conectado a un pulsador y una resistencia de 10K. Este pulsador reiniciar cuando lo necesitemos. Tambien se ha implementado un circuito de reloj externo, basado en un cristal de 4 MHz y dos capacitores de 22nF. Esto le permite al PIC ejecutar un millon de instrucciones por segundo, mas que suficiente para este proyecto.
Las patas 1 y 2, correspondiente a los terminales A2 y A3 del PIC, se han utilizado para acceder a una memoria EEPROM del tipo 24C256, esta memoria es de acceso serial (por eso se necesitan tan solo dos patas del PIC para usarla) mediante el protocolo I2C, y tiene capacidad para almacenar 32.768 Bytes, si nuestro programa hace uso de ella, podemos guardar alli 32.768 caracteres (con display en modo texto) o mas de 450 pantallas de 7 x 80 pixeles en modo grafico. Si la capacidad de esta memoria fuese insuficiente, puede usarce una memoria de mayor capacidad compatible con el PIC y el protocolo.
Todo el puerto B del PIC esta dedicado a controlar las filas del cartel, se puede apreciar en el circuito que hay 8 salidas para filas y nuestro cartel tiene solo 7 filas, efectivamente la fila 8 no se utilizara si nuestra pantalla esta construida con modulos led de 7 x 5, pero el circuito de control esta preparado para el uso (en caso de que se prefiera) de modulos 8 x 8 o bien para crear un cartel de 8 filas mediante el uso de leds sueltos. Quienes utilicen modulos de 7 x 9 pueden ahorrarse el transistor de la fila 8.
Por ultimo, las patas 17 y 18 correspondiente a los terminales A0 y A1 del PIC se encargan de la gestion del registro de desplazamiento. El programa debera generar los pulsos de reloj necesarios para la pata 18 e ingresar los datos en el registro por la pata 17.
No se ha incluido la fuente de alimentacion, se puede usar cualquier fuente que suministre unos 5v 2A, demas esta decir que los 5v deben estar bien regulados (estabilizados) y por supuesto, el software debera estar escrito correctamente, es decir no encender varias filas al mismo tiempo, ya que el consumo de todo el cartel encendido seria de unos 80 x 70 x 20mA = 11,2A, lo que podria destruir la fuente en caso de que no cuente con protecciones de sobrecarga.
La Pantalla
El circuito de la pantalla utiliza un total de 10 circuitos integrados 74HC164N para construir el registro de desplazamiento de 80 bits de largo, uno para cada columna, si el cartel va a ser mas largo o mas corto habra que utilizar mas o menos de estos circuitos integrados.
Si se van a comprar modulos de leds comerciales (ya armados) es importante ver en el circuito como va conectado cada led dentro de la matriz de 7 x 5 ya que los modulos vienen de distintos modelos y algunos tienen la conexion de los leds en sentido inverso.
Cada modulo tambien difiere en la funcion de cada terminal por lo que se debe prestar atencion a la informacion correcta del mismo para el diseño del circuito impreso.
En el circuito no se muestran la conexion de todos los modulos y los 10 circuitos integrados 74HC164N por cuestion de espacio pero la conexion de todos es la misma a la que se puede apreciar.
No se utilizara el pin de RESET esta puesto a 5v, de forma que el integrado funcione continuamente. Si por algun motivo se desea borrar la pantalla, basta con enviar 80 ceros al registro de desplazamiento y listo. El tiempo empleado para esta tarea es despreciable, ya que el microcontrolador esta ejecutando 1 millon de instrucciones por segundo. El utilizar una linea de control menos nos permitira tener una placa de circuito impreso ligeramente mas sencilla.
Cada salida de los 74HC164N se conecta a una columna de la serie de displays. Esta conexion se realiza por medio de un resistor de 1/8W que en el esquema se ha dibujado con un valor de 330?. Ese es el valor adecuado para el tipo de modulo que se empleo en el prototipo, pero el valor de esta resistencia va a depender de los leds o modulos que se utilicen, en realidad este valor va a incidir directamente en el brillo del led por lo que se elegira su valor de acuerdo a esto.
Software
Obviamente que la electronica sola no basta para lograr el funcionamiento correcto del cartel, a esta es necesario dotar al microcontrolador de la programacion que hara que el circuito funcione como queremos.
El hecho de que este cartel puede adoptar diferentes tamaños de acuerdo a cada una de las necesidades que uno posea hace imposible lograr un programa especifico que funcione en cualquier version de cartel que se ha construido, sin embargo se explicara de que manera se escribe el programa en BASIC (del PIC SIMULATOR IDE) para que cada uno pueda desarrollarlo en su proyecto.
Se debe pensar en un programa que permita mostrar pixeles individuales representados sobre la pantalla de nuestro cartel. Siguiendo con el ejemplo del cartel de 80 columnas y 7 filas de altura, aunque la explicacion sirve para cualquier tamaño.
Lo primero que se necesita saber es que el "barrido" del cartel debe hacerse por filas. Es decir se debe mostrar el contenido de la primera fila, se espera un tiempo determinado (unos pocos milisegundos) y se muestra el contenido de la segunda fila, se espera un tiempo y asi hasta llegar a la ultima fila, tal como se explica en algoritmo que se describio anteriormente.
El motivo para no emplear las columnas para realizar el barrido es debido a la gran cantidad que son, el tiempo total que se necesita para "escribir" por filas es mucho menor que el necesario para escribir por columnas, y en la practica eso significa que el brillo del cartel sera mucho mayor si lo hacemos por filas, ya que cada led permanecera encendido 1/7 del tiempo. Si lo hiciecemos por columnas, cada led estaria (en este ejemplo) encendido solo 1/80 del tiempo, por lo que su brillo seria unas 10 veces menor.
¿Pero cómo escribo los datos de una fila del cartel?
Esto tiene una solucion mas que simple: solo debemos introducir en el registro de desplazamiento los 0 y 1 necesarios para que los leds que queremos encendidos en esa fila tengan +V en sus anodos. Por supuesto que todos las patas del microcontrolador que controlan las otras filas deberan estar en 0 para que no se perciba una debil luminosidad en todos los leds de la fila que estamos escribiendo a medida que pasan los datos a traves del registro.
El primer valor que se debe ingresar en el registro de desplazamiento es el que correspondera a la ultima columna. A medida que vamos ingresando los siguientes, se van desplazando hacia el final del cartel, cuando hayamos introducido el valor numero 80 (que correspondera a la primera columna) el primer valor que ingresamos habra llegado a su posicion.
En ese momento tenemos todo el registro escrito, y ya podemos activar la salida del PIC que corresponde a esa fila en particular. El tiempo que debe estar encendida la fila se puede determinar empiricamente, pero por lo general unos 10 milisegundos son suficientes. Si tenemos 7 filas, 10ms de demora permitirian escribir todo el cartel en uno 70ms, por lo que obtendriamos un maximo de 1000/70 = 14 "frames" por segundo. Este es un muy buen valor para una pantalla de este tipo, ya que solo muestra un texto y no un video.
En los calculos anteriores no se tuvo en cuenta el tiempo que se demora en escribir los 80 valores en el registro de desplazamiento, esto es por que cada valor ingresado en el registro de desplazamiento demora unos 2 microsegundos, es decir, demoramos unos 2 x 80= 160 millonesimas de segundos en escribir toda la fila. Si multiplicamos este valor por 7 tendremos que necesitamos 1136 millonesimas de segundo, es decir poco mas de 1 millonesima. Este es un tiempo despreciable frente a las 70 milesimas que nos tomamos para mostrar la imagen completa y se puede despreciar.
Dicho todo esto vamos a ver como se escribe un valor en el registro de desplazamiento en lenguage Basic, recordando que el dato ingresa al registro en el momento en que se produce la transicion de 0 a 1 del pulso CLOCK, por lo que se deberan seguir los siguientes pasos para ingresar cada uno de los 80 valores correspondiente a cada fila.
1) Fijar el valor del dato a escribir (si DATA es 1, hacer PORTA.0 = 1, si no PORTA.0 = 0)
2) Poner la linea de CLOCK en estado bajo (PORTA.1 = 0).
3) Esperar un 1 microsegundo (WaitUs 1)
4) Poner la linea de CLOCK en estado alto (PORTA.1 = 1). En este punto el dato entra efectivamente en el registro de desplazamiento)
5) Esperar un microsegundo (WaitUs 1)
6) Fin
En Basic si hemos declarado que
Symbol clock = PORTA.1
Symbol data = PORTA.0
Un "0" se escribira asi:
data = 0
clock = 0
WaitUs 1
Clock = 1
WaitUs 1
Y un "1" se escribira asi
Data = 1
Clock = 0
WaitUs 1
Clock = 1
WaitUs 1
Para escribir los 80 valores de la fila necesitamos hacer una subrutina que, tomando 10 bytes de la memoria EEPROM (10bytes x 8 = 80 bits, es decir una fila completa) los vuelque al registro de desplazamiento.
Si repetimos 7 veces este procedimiento, tendriamos una pantalla de 7 x 80 completa. Eso significa que en la EEPROM cada display va a necesitar de 70 bytes (10 bytes por filas) para almacenar el mapa de bits correspondiente. Veamos un ejemplo de como podria ser la subrutina encargada de escribir un byte tomado de la EEPROM en el registro de desplazamiento, a la que hemos llamado escriboByte:
escriboByte:
For columna = 1 To 8
If dato.7 = 0 Then
Data = 0
Clock = 0
WaitUs 1
Clock = 1
WaitUs 1
Else
Data = 1
Clock = 1
WaitUs 1
Clock = 1
WaitUs 1
Endif
aux = Shiftleft(dato, 1)
Next columna
Return
Esta function debe ser llamada 10 veces para escribir la fila completa, con el valor a escribir guardado en la variable "dato". El motivo por el cual el bucle FOR NEXT toma los bits del byte desde el 7 hasta el 0 se debe a que justamente el último bit es el que debe ingresar primero al registro de desplazamiento, tal como se explico antes.
Se debe partir de la base de que la informacion de la EEPROM la vamos a grabar desde un ordenador, y que seguramente se creara un programa que permita, a partir de un texto determinado, generar los bits individuales que componen el bitmap de cada pantalla del cartel. Esto simplifica muchisimo la programacion del microcontrolador, ya que solo debe dedicarse a leer la EEPROM y volcar su contenido al registro de desplazamiento, sin tener que "dibujar" las letras a partir de una tabla ni nada por el estilo.
Textos animados
Para animar el texto mostrado en el display hay dos opciones. La primera de ella es que, una vez que el bitmap de la EEPROM ha sido mostrado en la pantalla, comencemos a redibujarlo continuamente (si no lo hacemos, el texto desaparecera de la pantalla) pero cada un tiempo determinado (1 segundo por ejemplo) escribimos un bit "0" mas en cada fila. Es decir, escribimos 81 bits en el primer segundo, 82 en el segundo, etc. Esto hara que el texto se desplace de izquierda a derecha, y es la animacion mas facil de implementar.
Sin embargo. Lo normal es que lo textos se desplacen en sentido contrario, por lo que nuestro programa deberia hacer lo siguiente: comenzar escribiendo 80 "0" en el registro antes de enviar la informacion de la fila, luego escribir 79 "0", y asi sucesivamente. De esa manera, el texto al principio no sera visible (estara "dibujado" a la derecha, fuera del registro de desplazamiento), y luego a medida que el numero de "0" escritos vaya disminuyendo, comenzara a ser visible, entrando desde la derecha.
La segunda manera es que el software que escribe los datos en la EEPROM guarde cada "cuadro" de la animacion, uno a continuacion del otro, y que el PIC se limite a escribir cada cuadro leido durante por ejemplo un segundo. Esto vuelve a facilitar mucho la programacion del PIC, a la vez que permite animaciones mucho mas complicadas, por supuesto el precio a pagar es el espacio de la EEPROM requirida para esta tecnica.