Los LCD gráficos (GLCD) se instalaron en el mundo de los electrónicos desde hace muchos años y la gente, poco a poco, los fue adoptando para visualizar aplicaciones de todo tipo. Su puesta en marcha es tan sencilla como la de un LCD alfanumérico tradicional, aunque hay secretos que debes tener en cuenta para no perder varios días hasta hacerlo funcionar. Además, en este artículo aprovecharemos a ver instrucciones sencillas y potentes que te permitirán realizar, con poco esfuerzo, gráficos muy interesantes. Además, te acercamos este trabajo con GLCD de la mano del histórico videojuego Space Invaders para aprender interesantes líneas de código y disfrutar durante estas vacaciones de un videojuego hecho por ti mismo. Con mucho realismo, audio y toda la emoción de construirlo tú mismo, ¿te lo vas a perder?
Las interfaces de salida más populares que nos ofrecen las aplicaciones con microcontroladores son motores, luces, sonido e información en pantallas alfanuméricas o gráficas. Una de las pocas cosas que nos faltaba ensayar en NeoTeo era el uso de pantallas gráficas o GLCD. Debido a que no tienen un precio tan accesible como los LCD alfanuméricos, a todo experimentador le cuesta tomar la decisión de comprar una pantalla de este tipo para solo “intentar” desarrollar aplicaciones inciertas o que no resulten tan atractivas como las expectativas que generan. Sin embargo, en este artículo terminarás comprendiendo que son tan sencillas de utilizar como las pantallas alfanuméricas y además, podrás comenzar a comprenderlas de inmediato con un videojuego inmortal, Space Invaders. Pero antes, vamos a ver algunos detalles mínimos de hardware que son importantes para lograr una experiencia exitosa con este tipo de dispositivos. Veamos primero un circuito básico de conexión y pasemos a las indicaciones más importantes.
Vale aclarar que en este artículo vamos a trabajar (como indica el gráfico de arriba) con un GLCD del tipo Samsung que poseen el controlador KS0108. Existen otros modelos populares de pantallas que se basan en diferentes controladores como la Toshiba, donde encontramos el T6963 que, además de ser diferentes en su conexionado, las instrucciones de programa para utilizarlas también cambian y, por lo tanto, no son reemplazos unas de otras. Por este motivo, deberás tener en cuenta este detalle antes de intentar utilizar un programa desarrollado por otra persona, ya que ésta es una de las principales causas de frustración en el uso de los GLCD. Ser diferentes no significa que una pantalla sea mejor que otra, sino lo que el texto menciona: son diferentes y no serán lo mismo el hardware y el programa a correr dentro del microcontrolador para hacerlos funcionar. Es probable (tal vez) que el vendedor de la tienda no sepa esta diferencia y debas buscar las hojas de datos del modelo que dispongas en el mercado. De todos modos, cuando ya te encuentres práctico en el uso de estas pantallas, sabrás diferenciar una de otras con sólo verlas y hasta quizás, en ese momento, ya te veas utilizando pantallas color OLED, pero al iniciarte, los pequeños detalles pueden significar grandes fracasos y no deseamos que eso suceda. En la hoja de datos del modelo de GLCD encontrarás toda la información necesaria antes de la compra.
En el circuito básico hemos empleado un 16F877A ya que el proyecto original lo lleva, pero tú puedes experimentar con cualquier microcontrolador que tenga los pines suficientes para cubrir las conexiones que te mostramos en el primer esquemático. Por supuesto, para ello deberás recompilar el código fuente. Los primeros y notables cambios respecto a un LCD alfanumérico es la utilización de dos “chips” que se encargan de controlar media pantalla cada uno. Estos tienen un pin dedicado para su activación (15 y 16 en nuestro GLCD) conocidos como “Chip Select” (CS1 y CS2). En este punto debemos tener algunas precauciones. Algunas pantallas suelen traer estos pines invertidos y los resultados obtenidos en imagen pueden ser nulos o defectuosos si no se realiza una conexión correcta de estos terminales. De todos modos, puede ocurrir que a pesar de tener una conexión apropiada sigamos sin logros visibles y esto se soluciona, en el caso de PROTON, con la instrucción GLCD_CS_INVERT = ON. Esto, por lo general se realiza en las librerías que se agregan como “INCLUDES” en la cabecera de cada código fuente. En nuestra experiencia, utilizando el modelo de pantalla que te mostramos en el gráfico de arriba, tuvimos que agregar la instrucción mencionada ya que los gráficos obtenidos eran espantosos y la visión era confusa por completo.
Estos “includes” también son tenidos en cuenta como librerías en otros programas de desarrollos para microcontroladores. Allí encontramos muchos datos importantes para el funcionamiento del circuito. En nuestro montaje, la librería que menciona el código fuente almacena el tipo de PIC a utilizar, la frecuencia del cristal, los pines dedicados a las conexiones de display (GLCD), I2C, comunicación serie y muchos otros datos. Lo destacado, entonces, es que debes controlar estas librerías y editarlas si es necesario para que tu GLCD funcione de manera correcta. La mayoría de los programas que emplean un GLCD las utilizan, por lo tanto, será una buena costumbre darles una mirada para controlar conexiones de pines y declaraciones apropiadas. Por ejemplo, esta es una parte del “include” que observas en la parte alta del código fuente que utilizamos y te ofrecemos al final de este artículo. Observa además, el detalle de que en estas declaraciones complementarias se especifica, entre otras cosas, que utilizaremos fuentes internas. Otra variante respecto a los LCD alfanuméricos.
Tú puedes experimentar con cualquier microcontrolador que tenga los pines suficientes para cubrir las conexiones que te mostramos en el primer esquemático.
Los GLCD no poseen en su interior las fuentes (las letras y/o símbolos) como sí las traen los LCD alfanuméricos. Aquí tú puedes elegir el tipo de letra que deseas utilizar, puedes dibujar y crear tus propias fuentes y además, tienes la opción de almacenarlas dentro o fuera del microcontrolador para ahorrar espacio de memoria. En estos casos se suele agregar una memoria EEPROM para almacenar allí los datos que forman el tipo de letra que deseamos utilizar. Observa nuevamente la imagen superior y verás que están contempladas las conexiones del bus I2C aunque, en el programa utilizado, incorporaremos las letras (y símbolos) dentro del PIC (INTERNAL_FONT = ON) que estarán representadas dentro de una tabla de datos (CDATA). Por ejemplo, CDATA $7E, $11, $11, $11, $7E, $00 ‘ (Chr 65 “A”), luego la letra B, CDATA $7F, $49, $49, $49, $36, $00 ‘(Chr 66 “B”) y así hasta completar todos los símbolos alfanuméricos que debamos utilizar. Por lo general, cada programa de desarrollo para microcontroladores trae una tabla hecha dentro de una librería que, valga la redundancia, se llama “Font”. O copias y pegas su contenido dentro del listado del programa o la incluyes como una línea de código (Include “FONT.INC”).
Finalmente, para mostrar los datos en pantalla, debes asumir que tenemos ante nosotros una matriz de puntos. En nuestro ejemplo es de 128 X 64 puntos (píxel) aunque puede tener otros tamaños. Por lo tanto, escribir en pantalla será ocupar estos puntos con información ordenada de manera apropiada. Esos puntos que te mencionamos, son coordenadas dentro de la pantalla que se denominan X e Y, siendo X los puntos ordenados un forma horizontal e Y los ordenados en forma vertical. Por ejemplo, las coordenadas 0,0 serían el vértice superior izquierdo; 0,127 sería el vértice superior derecho; 63,0 el inferior izquierdo y 63,127 el inferior derecho. (Recuerda: 0 a 127 para eje X y 0 a 63 para eje Y) Para “dibujar” líneas, formas geométricas o gráficos, PROTON posee la instrucción PLOT que, si la asociamos a variables que se incrementan o descienden de valor en el tiempo, podemos crear formas y dibujos.
Por ejemplo, PLOT 32,63 creará un punto casi en el centro de la pantalla, una instrucción FOR-NEXT (aplicada a uno de los ejes) puede dibujar una línea y si además incorporamos algún tipo de ecuación podremos graficar circunferencias, elipses, o cualquier tipo de gráfica. Por su parte, la instrucción UNPLOT, borrará píxeles escritos siguiendo el mismo modo de operación. Combinando las instrucciones, por ejemplo, podrás dibujar el disparo de la nave, el movimiento de ésta y hasta el de los invasores. La instrucción LCDWRITE, no escribe puntos (o bits) sino que directamente escribe BYTES en pantalla y lo hace, en este tipo de pantallas
Por su parte, LCDREAD, lee el BYTE existente a partir de determinado punto (X, Y) de la matriz; es decir, recupera la información existente en el sector de pantalla que el programa le indique. Un funcionamiento análogo posee la instrucción PIXEL que nos devuelve hacia una variable el estado de un determinado punto en la pantalla (activado o no). Finalmente, la clásica instrucción PRINT se encarga de realizar el mismo trabajo que hace en los LCD alfanuméricos: escribir a partir de un punto indicado y en este caso, como te mencionamos antes, tomando las letras desde una tabla ubicada en el interior del PIC o dentro de una EEPROM externa. A partir de estos pocos comandos sucede toda la magia. La práctica, el uso de los ejemplos que vienen con el programa (encontrarás el enlace a la versión gratuita al final de este artículo) y hasta los que puedas crear tú, agilizarán tus cualidades artísticas con estos dispositivos.
Volviendo a las conexiones nos quedan por mencionar, encontramos un terminal llamado RESET que se conecta por medio de una resistencia de 1K al positivo de alimentación y el potenciómetro de contraste que ya no estará conectado como en los LCD alfanuméricos. El pin central del control se puede conectar en Vo y los extremos entre Vee y Vcc respectivamente, como se aprecia en los circuitos. Para el montaje de hoy sólo agregaremos tres pulsadores sobre RB0 – RB3 para comandar el juego y una combinación resistiva sobre RA0 – RA3 para obtener el sonido. El resto es un PIC 16F877A que seguramente tendrás en cualquier cajón o, como ya lo habrás pensado, también puedes adaptar de manera muy sencilla este circuito (y la librería empleada, no te olvides de eso) para utilizar un 16F887 o un 18F4550.
Puedes utilizar otro tipo de PIC (con menos pines) y emplear expansores de puertos, puedes utilizar AMICUS con el 18F25K20, es decir, las variantes son inmensas, sólo depende de tus posibilidades y ganas de aprender. Nosotros te mostramos el proyecto tal como lo construyó Les Johnson en 2003, como programa de demostración para PROTON. Observar como escriben código los que saben hacerlo, es una actividad muy instructiva y enriquecedora. No dejes de visualizar el código fuente para apreciar las posibilidades y facilidades que brinda PROTON para utilizar estas pantallas gráficas.
Si estás dando tus primeros pasos con PIC’s este artículo puede ahorrarte mucho tiempo de investigación e interpretación del funcionamiento de un GLCD, y si ya eres un programador experimentado, puedes permitirte un descanso y disfrutar una partida de Space Invaders.
¡Descarga el código fuente y disfruta del juego tú también!