Space Invaders en GLCD con 16F877A (DIY)

Mario Sacco . Vista 19811 veces

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.

    Circuito básico de conexión entre un 16F877A y un GLCD Samsung KS0108 Circuito básico de conexión entre un 16F877A y un GLCD Samsung KS0108

    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.

    Interpretar la hoja de datos de un dispositivo es muy importante para comprar de manera correcta Interpretar la hoja de datos de un dispositivo es muy importante para comprar de manera correcta

    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.

    Tú puedes experimentar con cualquier microcontrolador que tenga los pines suficientes para cubrir las conexiones que te mostramos en el primer esquemático.

    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.

    Aspecto que presenta una librería que incluye datos redundantes para aplicaciones diversas Aspecto que presenta una librería que incluye datos redundantes para aplicaciones diversas

    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").

    Una letra es un mapa de bits dentro de un GLCD Una letra es un mapa de bits dentro de un GLCD

    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.

    Ejemplo ofrecido por PROTON para ensayar las instrucciones PLOT, UNPLOT Ejemplo ofrecido por PROTON para ensayar las instrucciones PLOT, UNPLOT

    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, de este modo:

    Un BYTE representado en la matriz de puntos del GLCD Un BYTE representado en la matriz de puntos del GLCD

    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.

    Circuito propuesto para el videojuego Circuito propuesto para el videojuego

    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.

    Identificación de componentes en el protoboard Identificación de componentes en el protoboard

    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. Recuerda que estamos siempre en el Foro de Electrónica de NeoTeo para, entre muchos, ayudarnos a resolver las dudas y problemas que se pueden presentar en cualquier montaje. ¡Te esperamos! ¡Descarga el código fuente y disfruta del juego tú también!

    Código Fuente  Descargar Fuente:  Proton Proton Lite  Descargar

¿Y tú, qué opinas?

  • #1 Emilio
    Emilio lunes, 14 de noviembre de 2011, 18:37

    Sencillamente genial tenia muchas ganas de encontrar un proyecto que de verdad me motivara para meterme en el mundo del glcd y ahora lo tengo desde ahora mismo empiezo a mirar los materiales necesarios para ponerlo en funcionamiento. GRACIAS

    Responder >> Attention Minus Plus Votos: 2 de 2
  • #2 Alecmander
    Alecmander lunes, 14 de noviembre de 2011, 19:14

    Hola! buen material!! cuanto sale aprox en dolares un GLCD??

    Responder >> Attention Minus Plus Votos: 3 de 3
  • #3 <a href="../../foro/member.php?u=2790" target="_self">alecmander</a>
    alecmander lunes, 14 de noviembre de 2011, 19:16

    Hola! buen material!! cuanto sale aprox en dolares un GLCD??

    Responder >> Attention Minus Plus Votos: 0 de 2
  • #4 pablo
    pablo lunes, 14 de noviembre de 2011, 19:29

    Muy bueno!
    pero te faltó la luz del GLCD Mario! y comentar su consumo, que es importante. también para que salga más lindo en el video!

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #5 <a href="../../foro/member.php?u=86" target="_self">Yesbond</a>
    Yesbond lunes, 14 de noviembre de 2011, 19:34

    Hola Mario,
    Muy buen articulo; este tema lo estabamos pidiendo a gritos, debido a que podemos contar con mas recursos que con un lcd alfanumerico.
    Mil gracias.

    Yesbond

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #6 solaresmty
    solaresmty lunes, 14 de noviembre de 2011, 20:01

    #2 87 doalres
    http://www.ebay.com/itm/KS0108-128x64-GLCD-Blue-Backlight-EasyPIC5-5pcs-/160382872654?pt=LH_DefaultDomain_0&hash=item2557906c4e#ht_1103wt_952

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #7 solaresmty
    solaresmty lunes, 14 de noviembre de 2011, 20:02

    #2 encontre uno mas economico
    http://www.ebay.com/itm/KS0108-128x64-Graphic-LCD-Blue-Backlight-EasyPIC5-/130337989859?_trksid=p4340.m1374&_trkparms=algo%3DPI.WATCH%26its%3DC%252BS%26itu%3DUCC%26otn%3D15%26ps%3D63%26clkid%3D4194904372162788365#ht_1578wt_952

    Responder >> Attention Minus Plus Votos: 2 de 2
  • #8 <a href="../../foro/member.php?u=40" target="_self">jukinch</a>
    jukinch lunes, 14 de noviembre de 2011, 22:45

    Que copado Mario. DE LUJO!! Muuuy pero muuy bueno!!!

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #9 moises
    moises martes, 15 de noviembre de 2011, 05:32

    Padre proyecto!!!! y bien explicado.

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #10 <a href="../../foro/member.php?u=220" target="_self">jonbul</a>
    jonbul martes, 15 de noviembre de 2011, 06:43

    por fin podre saber si funciona el lcd grafico k pille del monton de reciclaje de donde curraba jejeje, muchas graciaaaaas

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #11 Willian
    Willian martes, 15 de noviembre de 2011, 14:47

    mario que posibilidades hay de usar un display de celular (del poderoso 1100 o 1600 a color) ya que son muuuuyyy baratos!!!

    Responder >> Attention Minus Plus Votos: -1 de 1
  • #12 kirishima_ieiasu
    kirishima_ieiasu martes, 15 de noviembre de 2011, 17:58

    Otro Space Invaders, nose si podre resistirme :)

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #13 <a href="../../foro/member.php?u=29155" target="_self">electron222</a>
    electron222 miércoles, 16 de noviembre de 2011, 01:48

    Excelente :D

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #14 mundo7
    mundo7 miércoles, 16 de noviembre de 2011, 16:36

    Siiii, explícanos a #11 y a mi como hacer con displays de celulares, específicamente con eso de Nokia 1100 o 1600, que se consiguen por poco menos de 10 U$!!!

    Responder >> Attention Minus Plus Votos: -1 de 1
  • #15 Sergio
    Sergio martes, 13 de marzo de 2012, 09:30

    chavos alguien tendra echa la simulacion en proteus? si la tienen me la pueden pasar, esque el diagrama que viene por defecto se me hace muy simple y quisiera simular esto en una protoboard con la base del proteus mejorado

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #16 Quique
    Quique miércoles, 12 de septiembre de 2012, 16:00

    Muy buen aporte!!!!!, gracias por compartirlo con la gente, de lo mejor con diferencia que e visto. gracias.

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #17 daniel
    daniel sábado, 18 de mayo de 2013, 23:24

    ola ; no puedo descargar el ´´condigo de fuente´´ ¿como le ago?

    Responder >> Attention Minus Plus Votos: 0 de 0
  • Cargando...Cargando...

  • nuevo comentario
    Nombre

    Campo obligatorio

    Email

    Escriba una dirección de correo electrónico con el formato sunombre@ejemplo.com.

    Campo obligatorio

 
Ir arriba