huborarduino.com

La web de Hubor para la simulación de Arduino con Proteus

Banner Guia Programacion Arduino Con Proteus

[Proteus versión 8.2]

En la lección 16 estudiamos la forma de utilizar un display LCD de texto en nuestros proyectos ARDUINO. En aquella ocasión ya definimos un display LCD (siglas del inglés liquid crystal display) o pantalla de cristal líquido, como una pantalla delgada y plana formada por un número de píxeles, en color o monocromos, colocados delante de una fuente de luz o reflectora. Su principal ventaja es que utiliza cantidades muy pequeñas de energía eléctrica.

También vimos que existen pantallas muy variadas en el mercado. Las hay de colores diferentes (monocromo verde, monocromo ámbar o color). Unas tienen capacidad para mostrar sólo caracteres de  texto y otras admiten gráficos. La lección 16 se dedicó a la familia de pantallas que sólo eran capaces de mostrar caracteres de texto. En esta ocasión queremos introducirnos en el uso de las que tienen capacidades gráficas.

Lec23 001

Antes de empezar con la lección hay que hacer dos salvedades importantes. En primer lugar, hay que saber que existen muchos tipos diferentes de pantallas gráficas y que su gobierno puede diferir mucho de unas a otras. Cuando vayamos a elegir la pantalla para nuestro proyecto hay que tener en cuenta dos cuestiones: la pantalla propiamente dicha (su tamaño, color o monocromo, resolución, etc) y el chip con la que se controla. Hay diferentes tipos de controlador y su programación es diferente. Nosotros vamos a ver en esta lección el control de una pantalla monocromo de 128 x 64 pixels y basada en el controlador SAMSUNG KS0108.

Lec23 002

En segundo lugar, es importante tener en cuenta una cosa. La programación de una pantalla gráfica es considerablemente más compleja que el de una pantalla de texto. En esta lección vamos a explicar los conceptos más básicos y realizaremos sencillos dibujos de líneas, polígonos y caracteres. Llegar a realizar una pantalla gráfica completa y profesional puede ser una tarea bastante laboriosa y que nos lleve mucho tiempo.

Para controlar nuestra pantalla gráfica vamos a utilizar una librería para ARDUINO disponible en la página oficial en el siguiente enlace: KS0108 Graphics LCD library. Como ya hemos visto en anteriores lecciones cuando utilizamos librerías de terceros tenemos que colocarla en el directorio 'libraries' de la carpeta donde hayamos instalado nuestro entorno de desarrollo ARDUINO. En esta ocasión, la librería se creará en la carpeta llamada KS0108.

Lec23 004

Para simular nuestra pantalla gráfica, Proteus nos facilita varios modelos. Nosotros vamos a utilizar el llamado LGM12641BS1R. En la siguiente pantalla se muestra su representación gráfica y la forma en que lo tenemos que conectar a nuestro equipo ARDUINO.

Lec23 003

Es importante tener en cuenta que hemos puesto la señal de reset (RST) conectada directamente al potencial de +5V. De esta manera la pantalla está encendida en todo momento. El resto de los pines se han conectado a los pines de nuestro ARDUINO según las especificaciones de la librería que estamos utilizando. El esquema eléctrico completo es el siguiente:

Lec23 005

Veamos ahora el software. Vamos a empezar con un programa muy sencillo para poder ir introduciéndonos poco a poco en el control de una pantalla gráfica. Siguiendo con la costrumbre que vamos adquiriendo en lecciones anteriores partimos de un armazón básico que nos sirve de estructura para todos los programas.

Lec23 006

Lec23 007

Como vamos a utilizar la librería HUBOR que ya vimos en la lección 22 y que podemos descargar desde nuestra web, hemos incluído en la línea 14 un enlace a dicha librería. En la línea 15 llamamos a la librería ks0108 que es la encargada de controlar la pantalla gráfica basada en el controlador SAMSUNG.En la línea 16 incluimos en nuestro código el fichero "SystemFont5x7.h" que contiene la definición de una familia de caracteres de 5x7 pixels. Esta fichero viene incluído en la librería ks0108 y por eso hemos optado por él.

En la función setup() hemos escrito tres sentencias de programa. En la línea 31 inicializamos la pantalla con la función GLCD.Init() de la librería ks0108. Esta función sólo recibe un parámetro que puede tomar dos valores (NON_INVERTED y INVERTED) según deseemos que la pantalla tenga fondo claro y dibujemos en negro o tenga fondo oscuro y dibujemos en blando.

En la línea 32 seleccionamos la familia de caracteres que vamos a utilizar para escribr textos en nuestra pantalla.Como se puede observar, pasamos como parámetro precisamente la familia de caracteres que se define en el fichero "SystemFont5x7.h".

Por último, en la línea 33 utilizamos el primer comando para dibujar en nuestra pantalla gráfica. En este caso la función GLCD.DrawRect() que se encarga de dibujar un recuadro. Los parámetros que recibe esta función son cinco: coordenadas x e y del origen del recuadro, coordenadas x e y del fin del recuadro y color.

Compilemos y ejecutemos nuestro programa. El resultado en pantalla, aunque no es muy espectacular, si es muy satisfactorio para el tiempo empleado en escribir el código.

Lec23 008

Veamos ahora un segundo ejemplo. Con este código vamos a ver un ejemplo de utilización de la mayoría de las funciones que nos facilita la librería ks0108 para dibujar en nuestra pantalla gráfica. El código completo es el siguiente:

Lec23 013

Lec23 014

Lec23 015 

La lógica de funcionamiento es como sigue.

Hasta la línea 25 se encuentran las sentencias necesarias para llamar a las librerías utilizadas y definir las constantes y variables que vamos a utilizar a lo largo del programa.

En las líneas 26 a 38 se encuentra la función setup() para inicializar el equipo. En ella se realiza las llamadas necesarias para inicializar la pantalla y poner a cero las variables auxiliares.

A partir de la línea 40 se encuentra la función loop() que, como siempre, contiene las sentencias que se ejecutan de forma cíclica. Hemos divido esta función en cuatro secciones (siguiendo el esquema que ya hemos establecido como estándar en nuestras lecciones).

En el primer bloque leemos las entradas (en este caso no hay nada que leer).

En el segundo bloque, escribimos la lógica de control. En nuestro caso es muy sencilla. Con la ayuda de las funciones temporales iniTmp() y chkTmp() de la librería HUBOR, ejecutamos cada segundo unas sentencias que sirven para incrementar el contador y poner a uno el disparador que utilizaremos para saber cuando tenemos que escribir en nuestra pantalla.

En el tercer bloque que utilizamos para escribir las salidas tampoco hay nada, porque en este proyecto no utilizamos salidas a parte de las utilizadas para contral la pantalla gráfica.

En el cuarto bloque que utilizamos para controlar periféricos, se encuentran las líneas que más nos importan en esta lección y que se encargan de escribir en la pantalla. Para facilitar la visualización y comprensión de lo que escribimos en la pantalla hemos hecho lo siguiente. Cada vez que el disparador vale 1, realizamos una escritura en la pantalla y lo volvemos a poner a cero (línea 66). A continuación borramos la pantalla (línea 67).

En las líneas 68 a 115 utilizamos la estructura de control SWITCH-CASE. Como es la primera vez que la utilizamos en este curso, vamos a empezar por explicar cómo funciona. La sentencia SWITCH es una estructura de control de bifurcación múltiple estándar en el lenguaje de programación C. En un bloque SWITCH-CASE, el controlador comprueba el valor de una variable (en nuestro caso Contador1) de forma sucesiva frente a una lista de valores (cada una de las sentencias CASE). Cuando encuentra una coincidencia, se ejecuta el bloque de sentencias asociados con el CASE hasta que encuentra un BREAK. Si no se encuntra ninguna coincidencia se ejecuta el bloque DEFAULT.

Una vez que ya sabemos como funciona un bloque SWITCH-CASE vayamos ahora a ver cómo controlamos nuestra pantalla en cada incremento de nuestro contador. Cuando el contador vale 1 se ejecuta la función GCLD,DrawBitmap() de la librería KS0108. Esta función se encarga de dibujar en nuestra pantalla una imagen en formato de mapa de bits. En nuestro caso, la información de esta imagen se encuentra almacenada en el fichero ArduinoIcon.h que se suministra con la librería y que incluimos en la línea 16 de nuestro código.

Lec23 016

El resultado que se visualiza en nuestra pantalla es:

Lec23 017

Cuando el contador vale 2 se ejecuta un bucle repetitivo con ayuda de la estructura de control FOR. En cada iteración del bucle ejecutamos una función GLCD.DrawCircle que se encarga de dibujar un círculo en la pantalla. Los parámetros que le tenemos que pasar a esta función son las coordenadas x e y del centro, el radio del cículo y el color con el que vamos a dibujarlo. En nuestro caso, dibujamos una serie de cículos concentrícos con centro en el punto 64,32 y de radios comprendidos entre 5 y 20 en saltos de 5 en 5.

Lec23 018

El resultado será:

Lec23 019

Cuando el contador vale 3 ejecutamos la función GLCD.DrawLine() que se encarga de dibujar una línea recta. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen de la línea, las coordenadas x e y del fin de la línea y el color.

Lec23 020

En la pantalla se visualiza:

Lec23 021

Cuando el contador vale 4 ejecutamos la función GLCD.DrawVertLine() que se encarga de dibujar una línea recta vertical. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen de la línea, la longitud de la misma y el color. En este caso volvermos a utilizar un bucle FOR para dibujar una serie de líneas desde la coordenada x = 20 hasta la coordenada x=100 en saltos de 5 en 5.

Lec23 022

En la pantalla se visualiza:

Lec23 023

Cuando el contador vale 5 ejecutamos la función GLCD.DrawHoriLine() que se encarga de dibujar una línea recta horizontal. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen de la línea, la longitud de la misma y el color.

Lec23 024

En la pantalla se visualiza:

Lec23 025

Cuando el contador vale 6 ejecutamos la función GLCD.DrawRect() que se encarga de dibujar un rectángulo. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen del recuadro, las coordenadas x e y del final y el color.

Lec23 026

En la pantalla se visualiza:

Lec23 027

Cuando el contador vale 7 ejecutamos la función GLCD.DrawRoundRect() que se encarga de dibujar un rectángulo de esquinas redondeadas. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen del rectángulo, las coordenadas x e y del final, el radio con el que se redondeará las esquinas y el color.

Lec23 028

En la pantalla se visualiza:

Lec23 029

Cuando el contador vale 8 ejecutamos la función GLCD.FillRect() que se encarga de dibujar un rectángulo con relleno. Los parámetros que debemos pasar a esta función son las coordenadas x e y del origen del rectángulo, las coordenadas x e y del final y el color.

Lec23 030

En la pantalla se visualiza:

Lec23 031

Cuando el contador vale 10 ejecutamos la función GLCD.DrawLine() que ya vimos con anterioridad y que se encarga de dibujar una línea recta. Con ayuda de un bucle FOR somos capaces de dibujar una serie de líneas con origen en un punto común (0,0) y con final en un punto de coordenada x constante (127) y coordenada y variable desde 0 a 65 en intervalos de 2 pixel de separación.

Lec23 032

En la pantalla se visualiza:

Lec23 033

Cuando el contador vale más de 9 no existe ninguna claúsula CASE que se cumpla, así que se ejecutará el bloque DEFAULT. En este bloque se utilizan varias funciones. La función GLCD.CursorTo() se encarga de situar el cursor en las coordenadas x e y correspondientes. La función GLCD.Puts() escribe una cadena de texto en el lugar donde se encuentre el cursor en este momento. La función GLCD.PrintNumber() escribe un número en la pantalla. También nos ayudamos de la función estándar de C strcpy() para escribir en la variable 'Cadena' el valor de una constante de texto.

Lec23 034

En la pantalla se visualiza en cada nuevo incremento del contador, un mensaje con el valor del contador.

Lec23 035

Lec23 036

Y con esto, terminamos nuestra lección de hoy. Ya hemos aprendido a utilizar un display gráfico. Todavía exigirá por parte del lector una buena dosis de trabajo para mostrar resultados satisfactorios en sus proyectos. Pero las bases están sólidamente fundamentadas.

El código completo de la lección se puede descargar desde este enlace: Código lección 23.

 

Comparte este artículo en redes sociales

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedIn


Esta página es propiedad de Hubor.

2014.

¡Atención! Este sitio usa cookies y tecnologías similares. Si no cambia la configuración de su navegador, usted acepta su uso. Ampliar información