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.