Conectando un display LCD de 20×4 a Rasperrt PI mediante I2C – I2C III

Siguiendo con el uso del bus I2C para comunicarnos con diferentes dispositvos y nuestro microcontrolador, vamos a utilizar un display LCD retroiluminado de 20×4 para utilizarlo con nuestra Raspberry PI.

El utilizar I2C nos permite utilizar solamente dos cables para conectarnos con cualquier otro dispositivo, como en este caso un display manejado directamente desde Python, para poder hacer funcionar nuestro proyecto primero debemos configurar la Raspberry PI para utilizar el bus I2C, ya que por defecto esta desconectado.

Para hacerlo siga detenidamente el tutorial Utilizando I2C con Raspberry PI – Quick2Wire – I2C I

A continuación hay que hacer la conexión entre nuestro Raspberry PI y el LCD, pero es MUY IMPORTANTE comprobar el voltaje de funcionamiento de nuestro dispositivo, recuerda en Raspberry PI todas las entradas y salidas funcionan con 3.3V y la mayoría de los dispositivos lo hacen con 5V (Incluyendo Arduino).

La conexión entre ambos se puede hacer utilizando un divisor de tensión a base de resistencias (uno para SDA y otro para SCL) , pero realmente complica el experimento y además puede haber problemas de ruido, la forma limpia de hacerlo es utilizar un conversor de voltaje, que automáticamente se encarga de traducir los voltajes entre ambos buses.

Level Conversion translator Module 5-3v x 4 channels IIC I2C

 

La parte izquierda se conecta a 5V y los sensores y la derecha irá conectada a los pines correspondientes del Raspberry PI

Una vez realizada la conexión entre el PI y el conversión de tensión, conectamos este al display LCD, se debe de conectar SDA con SDA del PI y SCL con SCL del PI.

Conector I2C del display 20×4, 20×2 y 16×2

En Raspberry PI el PIN#3 corresponde a SDA y el PIN#5 a SCL, los 5V se conectan al PIN#2 y los 3,3V al PIN #1

Una vez realizada la conexión es muy importante entrar al PI por SSH y ejecutar:

sudo i2cdetect -y 1

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

En esa pantalla veremos la dirección asignada al dispositivo I2C, en este caso el 27, debemos guardarla para utilizarla en la configuración de la librería lcd_display.py

# LCD Address
ADDRESS = 0x27

El siguiente paso es instalar las librerías raspi-gpio podemos descargarlas desde github.

Una vez descargadas las librerías, para este ejemplo utilizaremos  lcd_display.py y i2c_lib.py

En lcd_display.py debemos configurar :

# LCD Address
ADDRESS = 0x27 <- la dirección del dispositivo.

Para utilizar un display de 20×4 es necesario hacer algunas modificaciones adicionales,

Buscar las líneas (sobre la linea 90):

    """display a string on the given line of the display, 1 or 2, string is truncated to 16 chars and centred"""
    centered_string = string.center(16)
    if line == 1:
      self.write(0x80)
    if line == 2:
      self.write(0xC0)

y cambiarlas por:

    """display a string on the given line of the display, 1 or 2, string is truncated to 16 chars and centred"""
    centered_string = string.center(20)
    if line == 1:
      self.write(0x80)
    if line == 2:
      self.write(0xC0)
    if line == 3:
      self.write(0x94)
    if line == 4:
      self.write(0xD4)

Con esto añadimos las dos líneas adicionales necesarias para que el display funcione correctamente.

Hay que tener en cuenta que es una librería MUY BASICA y necesita que se le implemente correctamente el manejo de la impresión bien forrajeada, pero de momento no sirve como punto de partida.

Y por fin el programa de prueba, uno sencillo que nos imprime la fecha y hora, el IP asignado a nuestro PI y la temperatura del procesador.

clock.py

from lcd_display import lcd
from subprocess import * 
from time import sleep, strftime
from datetime import datetime

lcd = lcd()

cmd = "ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1"
temp_cpu = '/usr/bin/vcgencmd measure_temp' # mide la temperatura de la CPU

count = 0

def run_cmd(cmd):
    p = Popen(cmd, shell=True, stdout=PIPE)
    output = p.communicate()[0]
    return output

while 1:
    lcd.clear()
    ipaddr = run_cmd(cmd)
    temp = run_cmd(temp_cpu)

    lcd.display_string(datetime.now().strftime('%b %d  %H:%M:%S'),1)
    lcd.display_string('IP %s' % ( ipaddr ),2 )
    lcd.display_string('%s' % ( temp ),3 )
    sleep(2)

i2c_lcd_20x4

Con esto tenemos funcionando nuestra PI con un display LED de 20 caracteres y 4 líneas que nos independiza de monitores y puertos externos en nuestros proyectos, en los próximos capitulos iremos añadiendo nuevos dispositivos y aprendiendo a utilizar el potencial que ofrece el tener un bus completo totalmente a nuestra disposición para que nuestra PI acceda a cualquier entorno.

Si necesitas más información los comentarios están abiertos.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.