sábado, 4 de septiembre de 2021

Pantalla LCD grafica de 84x48 pixeles.

 Hemos vuelto!!! Despues de años sin publicar nada retomo este blog donde ire compartiendo cosas chulas sobre arduino, processing, raspberry pi, etc.


Uno de los LCDs gráficos más populares por sus prestaciones y bajo precio, tiene una resolución de 84x48 píxeles que dan para representar gráficos y hasta 5 filas de caracteres alfanuméricos, tiene iluminación por leds y comunicación por SPI. Es la misma pantalla que montaban modelos de Nokia como el 5110 y el 3310.




Cuando pensamos en una pantalla LCD para nuestro proyecto siempre nos fijamos primero en las pantallas LCD a color y con bastante resolución, pero estas requerir un montón de pines para su control. Otra opción son las pantallas LCD controladas por serie o I2C (me viene a la cabeza las pantallas Nextion con conexión Serial), pero en estas el precio aumenta sensiblemente. La opción mas barata y más sencilla de utilizar es esta pantalla gráfica LCD que se controla con 4 pines.

Esta mini-board incluye un controlador PCD8544 que es el que se encarga de toda la gestión de los 84x48 píxeles de la pantalla. La comunicación con el controlador se hace por SPI, así que los más valientes pueden buscar el datasheet del PCD8544 y comunicarse con el directamente, el resto de seres humanos recurriremos a las librerías que en su día desarrollaron en Adafruit para controlar esta pantalla.

Lo primero que hay que tener en cuenta para conectar la pantalla a nuestro Arduino es que esta pantalla trabaja 3.3v aunque es tolerante a 5v que es nuestro voltaje de trabajo con la mayoría de placas.

Conexiones del LCD

Vamos con las conexiones:

El pin VCC es el de alimentación, lo conectaremos al pin de 3.3v de Arduino.

GND de la pantalla al GND de Arduino.

SCE ó CS (Chip Select), también conocido como SS (Slave Select) en comunicación SPI, debe activarse para indicarle al dispositivo que se le van a enviar datos.

RST (reset), no es necesario, podemos conectarlo al pin de reset de nuestro Arduino y nos ahorramos un pin.

D/C (Data / Command select).

DN (MOSI) o DIN es la entrada de datos de la pantalla (MOSI = Master Out Slave IN).

SCLK, pin por el que Arduino manda la señal de reloj que rige la comunicación.

LED, el pin de Backlight, lo que viene a ser la iluminación de la pantalla, a la que no le podemos meter 5v para no dañar los ledes, pero vamos a ser muy pillos y este pin lo vamos a conectar a un pin con salida analógica de nuestro arduino y le mandaremos un voltaje analógico de entre 0 y 168 (3,3v), yo lo suelo dejar a 120, así se ve bien.

Para este ejemplo estoy utilizando mi montaje Micro-micro, como se puede ver en las fotos. Ya podemos pasar al IDE de Arduino, primero nos bajamos la librería PCD8544  y la  Librería GFX, ambas de Adafruit (lo podemos hacer desde el gestor de librerias). Abrimos el Arduino IDE y en Ejemplos  ya nos aparece PCD8544LCD y dentro el sketch pcdtest.

En la línea 27 del Sketch aparecen las asignaciones de pines de Arduino a la comunicación SPI con la pantalla, tal cual están no funcionará por que yo he utilizado un orden diferente. Entonces en la línea que aparece:


Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);


La he cambiado para que quede así (comentario / chuleta incluida):
// Adafruit_PCD8544(SCLK, DIN, D/C, CS, RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

Y ya podemos subir el código de ejemplo y ver como en nuestra pantalla se despliega toda una demostración de sus capacidades gráficas y alfanuméricas.

Estudiando el código de ejemplo a fondo encontramos todos los métodos a emplear con la pantalla, que son:

begin() inicializa la pantalla.

setContrast(int contraste) establece el contraste, en el ejemplo está a 50.

display() si el buffer de memoria está vacío el logo de Adafruit, una vez empecemos a trabajar con ella y mandar contenido que se almacena en la memoria cuando llamemos a esta función hará que se muestre en pantalla lo que hayamos programado.

clearDisplay() borra la pantalla.

setPixel(int x,int y, color) dibuja un único pixel. El parámetro color nos lo encontraremos en más funciones y es muy simple, si ponemos un 1 se mostrará el texto o figura con pixeles negros sobre fondo transparente, en cambio si lo ponemos a 0 nuestro texto o dibujo aparecerá en pixeles blancos sobre fondo negro.

drawline(int x0, int y0, int x1, int y1, color) dibuja una línea de las coordenadas (x1, y1) a las coordenadas (x2, y2).

drawrect(int x, int y, int ancho, int alto, color) dibuja un rectángulo partiendo desde el punto (x, y) con el ancho y alto que le especifiquemos.

fillrect(int x, int y, int ancho, int alto, int color) dibuja un rectángulo sólido partiendo desde el punto (x, y) con el ancho y alto que le especifiquemos.

drawcircle(int x, int y, int radio, color) dibuja una circunferencia con el centro en (x, y) y del radio especificado.

fillcircle(int x, int y, int radio, color) dibuja una circunferencia solida con el centro en (x, y) y del radio especificado.

Los 6 métodos anteriores admiten el parámetro color, el cual puede ser 0 y 1, como he explicado antes pero también admite WHITE o BLACK, que quizá os sea más intuitivo.

setCursor(int x, int y) posiciona el cursor en la coordenada (x, y) para escribir texto a continuación, pero ATENCIÓN, las coordenadas corresponden a la esquina superior izquierda del cuadro de texto o gráfico, no os preocupéis, es fácil acostumbrarse.

print("Ardumania ") escribe el texto entre las comillas. El método print() admite los mismos parámetros de entrada que estamos acostumbrados a utilizar con el método print() de la clase Serial

println("mola") igual que el print() pero añadiendo un retorno de carro al final... vaya, igual que el println() que conocemos de la clase Serial.

drawbitmap(int x, int y, bitmap, int ancho, int alto, color) a partir de la coordenada (x, y) dibuja un mapa de bits guardado en formato binario en el array bitmap del ancho y alto especificados. En el código de ejemplo, tras los defines hay podéis ver como son los arrays binarios que he utilizado para los símbolos del estado de la batería.

El código de ejemplo está en GitHub, en la carpeta Micro_micro_main-batterie_status.

Nota: si he cometido algún error agradecería que me lo dejéis en los comentarios.

No hay comentarios: