19 de septiembre de 2014

I2C Character LCD con Raspberry Pi


Basados en la entra anterior Character LCD con Raspberry Pi, vemos que se han usados muchos GPIO para realizar la conexión, asi que para reducir el uso uso de GPIO usaremos el bus I2C para la conexión. Pero el Character  LCD no tiene I2C, entonces agregamos un chip expansor que tiene este soporte, como el MCP23017, es un chip I2C que tiene 16 pins de múltiple propósito (Input/Output).

Materiales:

*Este demo esta construido con los productos que venden directamente Adafruit o sus distribuidores, ver nota al final de la pagina.



Armado (Cableado)


Comenzaremos colocando los dispositivos en la protoboard como se muestra en la siguiente imagen:


Para realizar las conexiones hay que tener en cuenta el nombre/numero de los pines del chip MCP23017:



Y procedemos a conectar:

  • Conecte el RPi 3.3V a la linea (Vcc) de la protoboard, y de este conecte:
    • Un cable al pin   9 del MCP (VDD).
    • Un cable al pin 18 del MCP (RESET).
  • Conecte el RPi GND a linea de tierra de la protoboard, y de este conecte:
    • Un cable al pin 10 del MCP (VSS).
    • Un cable al pin 15 del MCP (A0).
    • Un cable al pin 16 del MCP (A1).
    • Un cable al pin 17 del MCP (A2).
    • Un cable al lado izquierdo del potenciometro.
    • Un cable al pin 1 del LCD (VSS).
    • Un cable al pin 5 del LCD (R/W).
  • Conecte el RPi 5.0V a lado derecho del potenciometro, y:
    • Un cable al pin   2 del LCD (VDD).
    • Un cable al pin 15 del LCD (LED+).
  • Conecte el pin del medio del potenciometro al pin 3 del LCD (V0/Contrast).
  • Conecte el RPi I2C SCL al pin 12 del MCP (SCL).
  • Conecte el RPi I2C SDA al pin 13 del MCP (SDA).
  • Conecte el pin 21 del MCP (GPIOA0) al pin 4 del LCD (RS).
  • Conecte el pin 22 del MCP (GPIOA1) al pin 6 del LCD (E/clock enable).
  • Conecte el pin 23 del MCP (GPIOA2) al pin 11 del LCD (DB4).
  • Conecte el pin 24 del MCP (GPIOA3) al pin 12 del LCD (DB5).
  • Conecte el pin 25 del MCP (GPIOA4) al pin 13 del LCD (DB6).
  • Conecte el pin 26 del MCP (GPIOA5) al pin 14 del LCD (DB7).
  • Conecte el pin 27 del MCP (GPIOA6) al pin 16 del LCD (-R/red).
  • Conecte el pin 28 del MCP (GPIOA7) al pin 17 del LCD (-G/green).
  • Conecte el pin   1 del MCP (GPIOB0) al pin 18 del LCD (-B/blue).
La conexión solo usa 4 bits para la transferencia de datos DB4 a DB7. Por tal motivo queda 4 pines del LCD sin conectar. Y de esta forma podemos usar los otros GPIO del MCP para otros usos. Poner mucho cuidado, algunos pasos usan 5.0V y otros 3.3V no confundir.


En el prototipo se ve así:

 



En la realidad se ve así:








Nota: Cuando este realizando la prueba de funcionamiento no olvide ajustar el potenciometro para ajustar el contraste del LCD, de lo contrario es posible que la luz de fondo se encienda y no vean caracteres en la pantalla.

Antes de probar, hay que habilitar el I2C en el Raspberry Pi ver: Configurando I2C en Raspberry Pi


Controlador (Software JMEE)


Instalación

Se necesita tener instalado el ambiente de desarrollo para Java Micro Edition Embedded; para saber como se instala ver este entrada: Instalación Java ME Embedded


Luego de la instalación del ambiente podemos descargar el código del repositorio:

git clone https://github.com/andresvelezperez/raspberry-pi.git


Uso

Cuando se ha descargado el código, se procede a abrir el proyecto con Netbeans, procedemos a abrir la clase rpi.main.Main, en esta clase observaremos los ejemplos que podemos correr, pero este ejemplo solo podemos usar la clase char_lcd_mcp. Asi que solo habilitaremos ese ejemplo cuando usamos el MCP23017.

//exampleCharLCD = new char_lcd();
//exampleCharLCD = new char_lcd_rgb();
//exampleCharLCD = new char_lcd_rgb_pwm();
exampleCharLCD = new char_lcd_mcp();

Recuerde que antes de probar, hay que habilitar el I2C en el Raspberry Pi ver: Configurando I2C en Raspberry Pi

Si se ha seguido el manual al pie de la letra, los ejemplos han de funcionar bien, en caso de no usar los GPIO del MCP23017 como se indico anteriormente, se debe abrir la clase del  ejemplo y cambiar los parámetros, es decir indicar cuales GPIO fueron usados. Se debe reemplazar los usados.

Archivo: char_lcd_mcp.java
//# Raspberry Pi configuration:
int lcd_rs = 0; //# Pin MCP GPIOA0  
int lcd_en = 1; //# Pin MCP GPIOA1  
int lcd_d4 = 2; //# Pin MCP GPIOA2
int lcd_d5 = 3; //# Pin MCP GPIOA3
int lcd_d6 = 4; //# Pin MCP GPIOA4
int lcd_d7 = 5; //# Pin MCP GPIOA5
int lcd_red = 6; //# Pin MCP GPIOA6
int lcd_green = 7; //# Pin MCP GPIOA7
int lcd_blue = 8; //# Pin MCP GPIOB0


Esta clase usa un controlador para que el I2C se comporte como una extensión del Raspberry Pi, entonces solo es cambiar el uso de GPIO, es decir, que el aplicativo ya no use los GPIO del Raspberry Pi sino que uso los GPIO del chip conectado por I2C. La clase encargada para esto es: MCP23017.java


Archivo: char_lcd_mcp.java
baseGPIO = new MCP23017();
//# Se inicializa el constructor con los GPIO a usar.
lcd = new Adafruit_RGBCharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
lcd_columns, lcd_rows, lcd_red, lcd_green, lcd_blue,baseGPIO);


Para configurar la cantidad de lineas que soporta el LCD se debe de cambiar los parámetros por uno de estas opciones:  16x1, 16x2 y 16x4

Archivo: char_lcd_mcp.java
//# Define LCD column and row size for 16x2 LCD.
int lcd_columns = 16;
int lcd_rows = 2;

Para visualizar un mensaje con luz de fondo rojo seria de la siguiente forma:

//# El color esta en RGB, pero debido a la falta de PWM, solo funciona 1.0f o 0.0f en cada color.
lcd.set_color(1.0f, 0.0f, 0.0f);
lcd.clear();
lcd.message("Linea 1\nLinea 2");

*PWM: modulación por ancho de pulsos (pulse-width modulation).


La clase que hace de controlador es Adafruit_RGBCharLCD (hereda de Adafruit_CharLCD), en esta clase están los métodos con los cuales es posible realizar la comunicación entre el Raspberry Pi y el Character LCD, el LCD debe ser compatible con Hitachi HD44780 LCD controller, en caso de que no sea compatible hay que escribir un nuevo controlador.

La clase principal proporciona los siguientes métodos:
  • home(): posiciona el cursor al inicio.
  • clear(): limpia el LCD
  • set_cursos(col,row): posiciona el cursor en la columna y linea indicada.
  • show_cursos(show): muestra el cursor en pantalla.
  • move_left() y move_right(): mueve el texto en el LCD, a la izquierda o a la derecha.
  • message(text): el mensaje a mostrar.
  • set_backlight(backlight) para el caso de la clase Adafruit_CharLCD.java activa o desactiva la luz de fondo, para mostrar un color particular usar la clase Adafruit_RGBCharLCD.java y usar el método set_color(R,G,B).
Nota: Esta es una implementación en Java ME Embedded del código que esta disponible por parte de Adfruit, el código original esta escrito en Python. Para ver el tutorial y código en Python dirigirse a la pagina de Adafruit.
El código es Open Source.




Raspberry Pi is a trademark of the Raspberry Pi Foundation, http://www.raspberrypi.org

Adafruit, http://www.adafruit.com

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners. http://www.oracle.com

No hay comentarios:

Publicar un comentario