Nokia LCD 3310 + Arduino

A mi parecer, no hay elemento que le de un mejor aspecto e interacción a nuestros proyectos DIY que una pantalla. Podemos elegir entre muchos tipos de pantallas distintas: LCD de caracteres, LCD gráficos a color, monocromáticos, TFT, TFT táctil, etc.

Hoy vamos a ver como conectar y utilizar con Arduino, un LCD gráfico de 84×48 pixels monocromático, muy barato y muy sencillo de utilizar, el LCD Nokia 3310/5110 que utilizaban los antiguos teléfonos de la compañía finlandesa.

Podemos obtener estas pantallitas o bien desmontando un teléfono Nokia 3310/5110 o bien comprarla en multitud de tiendas online de electrónica.

En mi caso la compré por eBay, pero podemos comprarla por muy pocos euros en casi todas las tiendas de la lista del post anterior a este: ¿Donde comprar electrónica?

Esta pequeña pantalla trabaja con el controlador CMOS PCD8544, diseñado para el manejo de LCD gráficos de 48 filas x 84 columnas. Es de muy bajo consumo y la forma de conectarlo con μControladores se realiza mediante el bus SPI.

Funciona con tan solo 3,3V y posee retroiluminación led.

En una de las tiendas online donde venden la pantalla, encontré esta tabla de especificaciones muy concisa y breve que explica las características más importantes de esta pantalla:


Como se puede ver, es realmente de muy bajo consumo, por lo que la convierte en una pantalla ideal para proyectos alimentados a baterías o pilas.

Con esta pequeña introducción, pasemos a la acción: ¿Cómo se conecta?

Sigue leyendo!

Antes de conectar la pantalla, tendremos que ver cuales son sus pines:

La pantalla se comunica mediante el bus SPI, que en un Arduino UNO está compuesto por los pines 10, 11, 12 y 13 si utilizaramos la librería original de Arduino, pero en este caso, utilizaremos una librería externa a Arduino, por lo que la selección de pines a conectar queda a nuestra elección, ya que podremos configurarlos mediante software.

Veamos un poco como funciona la pantalla, para poder entender las funciones de la librería que utilizaremos para controlar la pantalla.

Sabemos que la pantalla es de 84 pixels de ancho por 48 pixels de alto, o lo que es lo mismo en el momento de hacerla funcionar, 84 bits de ancho por 48 bits de alto. Los bits del alto están agrupados en bytes, de forma que el direccionamiento de la pantalla se realiza de la siguiente manera: 84 bits de ancho por 6 bytes de alto, por tanto, irá de la siguiente manera: Eje X = 0 a 83 / Eje Y = 0 a 5.
Como se puede ver en la siguiente imagen:

Esto así visto no nos sirve demasiado si nuestra idea es simplemente añadir la pantalla a nuestro proyecto y utilizarla, pero es necesario saberlo, puesto que los caracteres a la hora de imprimir un texto por pantalla, ocupan cada uno un espacio de 5 bits de ancho por 8 de alto,  por lo que solo tendremos un máximo de 6 líneas para escribir en el LCD.

Conociendo como funciona la pantalla, en mi caso elegí el primer sketch de esta página de Arduino y lo convertí en librería para poder utilizar la pantalla y tener un sketch limpio y fácil de leer y entender.

Podemos descargar la librería de aquí: Librería NokiaLCD

Con esta librería podemos manejar el LCD de forma cómoda mediante las distintas funciones que dispone, como son configurar los pines de conexión,  inicializar el  LCD, borrar el LCD, situar el cursor, escribir caracteres o cadenas de caracteres, leer el puerto serie para cargar una imagen de mapa de bits, dibujar sobre la pantalla a partir de un array de bytes, etc.

Entonces, procedemos a conectar el LCD y a probar la librería, en mi caso, utilizo los pines 3, 4, 5, 6 y 7 digitales para conectar la pantalla, de la siguiente manera:

Cargamos el ejemplo que viene con la librería y analizamos un poco:

#include <NokiaLCD.h>

NokiaLCD NokiaLCD(3,4,5,6,7); // (SCK, MOSI, DC, RST, CS)

void setup() {
NokiaLCD.init(); // Init screen.
 NokiaLCD.clear(); // Clear screen.
}

void loop() {
 NokiaLCD.setCursor(1,1);
 NokiaLCD.print("Hello World!");
}

Instanciamos un LCD y asignamos los pines de conexión, inicializamos el LCD y lo borramos entero, situamos el cursor y escribimos en pantalla. Destaca la simplicidad de manejo :)
La librería consta de las siguientes funciones:

- NokiaLCD NokiaLCD (SCK, MOSI, DC, RST, CS); // Instancia un LCD y asigna los pines.
- NokiaLCD.init(); // Inicializa el LCD.
- NokiaLCD.clear(); // Borra la pantalla  y sitúa el cursor en la posición (0,0).
- NokiaLCD.setCursor(x,y); // Sitúa el cursor en la posición indicada.
- NokiaLCD.print(“Cadena”); // Escribe en pantalla una cadena de caracteres.
- NokiaLCD.character(‘A’); // Escribe en pantalla un carácter.
- NokiaLCD.bitmap(array); // Dibuja en pantalla un array de bytes de una imagen BMP.
- NokiaLCD.sBitmap(); // Escucha el puerto serie por un array de bytes de una imagen BMP y lo dibuja en pantalla.

De lo más interesante de la pantalla, es que al ser una pantalla gráfica, podemos dibujar en ella con la función NokiaLCD.bitmap(array);  que recibe un array de bytes y lo dibuja en pantalla, por lo que era necesario conseguir dicho array de bytes a partir de un mapa de bits.

Para ello, junto con Dani (@Cuningan - Simplificate 2.0), desarrollamos un software en C# para poder cargar imágenes BMP en la pantalla desde el PC, bien enviándolas por el puerto serie o convertirlas en array de bytes y almacenar dicho array en la memoria del μControlador o una memoria EEPROM.


Como podemos ver en la imagen anterior, el software es muy sencillo de utilizar, simplemente elegimos el puerto serie al que esté conectado nuestro Arduino, conectamos, y procedemos a elegir una imagen de archivo.

Una vez cargada la imagen en el programa, al pulsar en el botón “Cargar imagen en LCD” enviaremos por el puerto serie el array de bytes de la imagen, y a la vez, lo veremos en la caja de texto, para poder copiarlo y pegarlo en el código de nuestro sketch de Arduino.

Si vamos a cargar una imagen desde el PC por el puerto serie, el sketch de nuestro Arduino, debe tener la llamada a la función NokiaLCD.sBitmap(); en el bucle “void loop()”, de modo que esté constantemente recibiendo por el puerto serie, a la espera de que le llegue la imagen desde el PC.

El software es instalable, aunque solo para Windows.
Aquí el link de descarga: Software Nokia BMP Loader

Y eso es todo!

Realmente es una pantalla a tener en cuenta para pequeños proyectos, barata, muy sencilla de utilizar, y de muy bajo consumo.

Veamos unas imágenes y un vídeo de funcionamiento! :)  

      


Agradecer a Dani toda la ayuda, que no fue poca. 

:D

 

 

About these ads

30 pensamientos en “Nokia LCD 3310 + Arduino

  1. Hola! He estado probando la lcd y bueno tengo problemas al meter más de dos imágenes en el sketch, es decir, con dos solamente metidas en un array cada una me funciona perfectamente, pero al meter tres o más ya no se ve nada en la pantalla. ¿A ti te pasa lo mismo?

  2. Regata, efectivamente, también me sucede, y ahora mismo no se el porqué.

    Estaré revisando la librería estos días intentando solucionarlo y ya cuento los avances.

    Gracias por avisar!!

  3. Hola, lo primero es agradecerte tu tiempo y trabajo para desarrollar esta librería y por supuesto darte las gracias por compartirla con todos.
    Me gustaría comentarte que me la ha descargado, y que después de compilarla en el entorno de Arduino me tira un error, lo he solucionado, en el fichero de cabeceras sustituyes #include por #include .
    Por lo visto es debido a la última versión del entorno, la 1.0.
    Un saludo

    • Antonio, Gracias a ti!

      Si, salvo que especifique que la librería funciona en la versión 1.0, todas las librerías que ponga por aquí serán para versiones anteriores (0023, 0022) ya que la versión 1.0 de Arduino hace muchos cambios sobre librerías que ya existían y por tanto no es compatible con la gran mayoría de estas. Por tanto, yo personalmente sigo utilizando la versión 0023.

      Saludos!!

  4. hola muy buenas que tal,enhorabuena por el tutorial y muy bien explicado,mira soy novato en esto y lo e montado y lo conecto al pc y me pone en el programa de arduino,not matching function for call to NokiaLCD::NokiaLCD(int,int,int,int) aver si sabeis de que puede ser,gracias y un saludo

    • Ar uno, es posible que el fallo te lo dé por estar utilizando la versión 1.0 de Arduino.

      Inténtalo alguna versión anterior, 0022 o 0023, y ya nos cuentas! Saludos!!

  5. wenas ipadnano,mira aora se me ilumina mas la pantalla pero no me salen las letras ni el texto,la resistencia de cuanto es?tiene mucho que ver?gracias de nuevo y un saaludo

  6. Ar Uno, la resistencia es de limitación de corriente de los leds, son 4 leds, por lo que la resistencia para no reducir mucho la iluminación, es pequeña, 220 ohmios.

    ¿Estás alimentándola con 3.3V no?

    Sobre lo de no ver nada en la pantalla, pueden ser varias causas:
    - Que el código que estés utilizando esté mal.
    - Que el contraste no esté bien.
    - Que la pantalla no funcione.

    Mi primera opción a modificar, sería el contraste, debes ir a la librería, al archivo NokiaLCD.h y buscar en la lista de #define, verás una linea que pone esto:

    #define LCDCONTRAST 0xB4

    Cambiando el “0xB4″, cambias el contraste de la pantalla.
    - 0xB1: Si la pantalla está muy clara, que es tu caso, por lo que puedes probar con este código.
    - 0xBF: Si la pantalla está muy oscura.

    Variando entre entre 0xB1, 0xB2, 0xB3, 0xB4…0xB9, 0xBA, 0xBB…0xBF, puedes modificar el contraste.

    Cada vez que lo cambies ese valor, debes guardar el archivo, y reiniciar el entorno del Arduino.

    Saludos!!

    • Meu lcd não funcionava, depois de muitos testes descobri que a linha:

      LcdWrite(LCD_CMD, 0×07); // Set Temp coefficent. //0×04

      melhora o contraste, aumenta a temperatura = + contraste.

  7. SE PUEDEN LEER DATOS SOLO DESDE EL PUERTO SERIE E IMPRIMIRLOS A LA PANTALLA CON ALGUNA FUNCIÓN DE LA LIBRERIA

  8. Adriana, no, con la librería esta no tiene esa función de leer el puerto serie e imprimir los datos en la pantalla. Habría que crearla.

    Saludos!!

  9. hola como le hago para ke me muestre en pantalla un dato variable como un conteo usando un For y usando por ejemplo la variable y asignandola al ” NokiaLCD.print(“%i”,variable); ” porke lo probe y no puedo imprimirle datos variables en pantalla y ante todo gracias

    • Rafael, el lenguaje de Arduino no es C como tal, por tanto, no es válido ese código que estás poniendo.

      Leete la guía rápida que hay en la web de Arduino sobre el lenguaje.

      En tu caso, debería valer simplemente con imprimir la variable dentro del bucle: NokiaLCD.print(variable);

      Saludos!!

      • //hola muchas gracias amigo iPadnano por tu ayuda pero e tartado de compilar el siguiente //codigo como ejemplo para asi realizar un reloj o un termometro o algun otro artilugio ke me //muestre datos variables en pantalla estoy usando la vercion 0.22 del IDE del arduino

        #include

        NokiaLCD NokiaLCD(3,4,5,6,7); // (SCK, MOSI, DC, RST, CS)

        void setup()
        {

        Serial.begin(9600);
        NokiaLCD.init();
        NokiaLCD.clear();
        }

        void loop()
        {

        NokiaLCD.setCursor(1,1);
        NokiaLCD.print(“Hello World!”);

        //tomando el mismo codigo de ejemplo y la idea es agregarle un for para un contador
        // y realizar un reloj o ke me pueda leer variables de sensores pero lo trato de compilar //pero no funciona

        for( int i=0;i<10;i++)
        {
        NokiaLCD.print(i);
        delay(100);
        NokiaLCD.clear();
        }
        }

        • Rafael, debes especificar más sobre el problema que tienes, ya que sino no puedo ayudarte.

          Copia aquí el problema que te da, cual es el resultado en caso de que compilara, algo más de información para yo poder guiarme y ayudarte.

          Saludos!

  10. Hola, primero que todo, excelente articulo, pero me quedo una duda, he leido en otros articulos que el pin 8 es el reset del controlador, sin embargo, despues lo usan para conectar leds…se puede usar de las 2 formas??
    Saludos

    • Francirius, el pin 8 del LCD es el ánodo de los leds de iluminación que trae a los lados, 4 leds SMD. Solo es la iluminación.

      El pin de reset de la pantalla es el 4, que se identifica como RST.

      Saludos!

  11. Pingback: Toma de contacto con Arduino « Ideas y proyectos

  12. Hola! Podria ayudarme a crear o mostrarme un ejemplo de libreria, para que lo que se recibe por el puerto serial se imprima?? Saludos en verdad necesito su ayuda

    • Davis nuñez, lo que estás buscando está en el post. La librería que te puedes descargar tiene una función para imprimir por pantalla lo que se recibe por el puerto serie.

      Saludos!

      • Hola Si entiendo, Pero me refiero si me puedes ayudar a imprimir en la lcd como si fuese una terminal o asi, En verdad necesito tu ayuda Gracias! =)

        • Davis Nuñez, ahora el que no entiende soy yo. ¿Qué es exactamente lo que buscas?

          La librería tiene para poder imprimir directamente en la LCD como si fuese un terminal, no sé exactamente cuál es tu objetivo.

          Si puedes explicarlo paso a paso lo que deseas que se vea en el LCD.

          Saludos!

  13. Hola, Acabo de ver tu mensaje, Tratare de explicarme, Necesito crear una terminal, Entendiendo que si atraves de otro Micro se le envia unos caracteres los imprima en ella por ejemplo, Si en la terminal de arduino, Enviara Hola Mundo!, En la pantalla eso se imprima, Y al recibir el Codigo ASCII 08 borre letra por letra lo que ah recibido o al recibir el Codigo ASCII 10 pase a una nueva linea para seguir escribiendo, No se si me explique bien, Espero tu ayuda Gracias por todo!

    • Davis Nuñez, en primer lugar debes realizar un código que lea carácter a carácter lo escrito en el terminal serie del Arduino y
      lo meta en un array de caracteres, ya luego revisas dicho array, caracter a caracter y lo vas comparando con los
      caracteres ASCII que realizan determinada acción, como puede ser el salto de linea.

      Una vez terminado de revisar, simplemente pasas el array de caracteres a la pantalla con la función de escribir normalmente sobre
      esta misma.

      De este modo tendrás lo que deseas hacer. Un saludo!

      • Hola, Gracias pero la verdad es que no manejo mucho el Lenguaje arduino, Podrias ayudarme con la libreria, Por favor, Saludos espero tu ayuda

        • Davis Nuñez, si no manejas el lenguaje Arduino, lo que deseas hacer es un proyecto bastante complicado, que requiere de bastante código y manejo de un nivel alto de programación, ya que toca muchos aspectos desde lectura de puerto serie, escritura, bucles, manejo de arrays de caracteres, etc.

          Te recomiendo antes de meterte a realizar semejante proyecto, realizar otros proyectos de menor calado, lectura de sensores, escritura en un LCD de caracteres 16×2 por ejemplo, practicar el lenguaje y estudiarlo bastante ya que no será fácil realizar algo así, deberás escribir código, probar, re-escribir el código, volver a probar, hacer muchas pruebas hasta que consigas la versión de código que funcione bien y haga lo que quieras.

          Ahora mismo no dispongo del LCD ya que fue un proyecto de clases y el LCD pertenecía al instituto.

          Aquí puedes ver todos los comandos y opciones que ofrece el lenguaje de Arduino: http://arduino.cc/es/Tutorial/HomePage

          Siento no poder ayudarte más. Un saludo!

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s