viernes, 27 de noviembre de 2020

Librería LCD 16×2 con Python


Librería LCD 16×2 con Python



Librería LCD 16×2 con Python

Las entradas y salidas digitales de Raspberry Pi nos permiten interactuar con dispositivos físicos como botones, leds o sensores, sin embargo es posible que en algún punto necesitemos mostrar información de procesos en nuestro proyecto, con eso en mente en este post vamos a utilizar una pantalla LCD 16×2 con Python y Raspberry Pi, además vamos a hacer nuestra propia librería para poder usarla en cualquier proyecto que necesitemos.

PANTALLA  LCD 16×2

La mayoría de las pantallas LCD 16×2 comerciales son compatible con el controlador Hitachi HD44780, por lo que es muy seguro que la pantalla que utilice funcione bien.

Aunque la pantalla LCD tiene 8 pines de datos (D0 – D7), es posible utilizar los pines (D4 – D7) para transmitir información en paquetes de 4 bits, lo cual nos ayuda a reducir el número de pines de conexión con nuestra Raspberry

Imagen 1. Pines LCD 16x2
Imagen 1. Pines LCD 16×2

CONEXIÓN

Estos son los pines de conexión de la pantalla con nuestra Raspberry Pi y más abajo el diagrama para tener una representación física la conexión.

Pin LCDFunciónPin PiFunción
1GND6GND
2+5V45V
3Contraste6GND
4RS8GPIO 14
5RW6GND
6EN10GPIO 15
7D0
8D1
9D2
10D3
11D412GPIO 18
12D516GPIO 23
13D618GPIO 24
14D722GPIO 25
15+5V – 330 ohm
16GND6GND
Imagen 2 Diagrama de conexión.
Imagen 2 Diagrama de conexión.

PROGRAMACIÓN

Si bien es posible manejar en un solo proyecto de Python la programación para configurar la pantalla LCD y poder usarla en nuestra aplicación de usuario, es preferible organizar todo en módulos para que nuestro código este mejor estructurado y sea fácil de modificar y probar. Es por eso que vamos a crear una librería que maneje el funcionamiento de nuestra pantalla y la vamos a integrar en nuestra aplicación principal.

Este es un diagrama para mostrar el funcionamiento de nuestro proyecto.

Librerias diagrama

Librería en Python.

Este es el código de la librería que va a controlar nuestra pantalla LCD 16×2, el autor es Matt Hawkins de la página de Raspberry-Spy.

Vamos a iniciar ejecutando desde terminal el comando sudo idle3 para abrir el entorno de programación de Python. Creamos un archivo nuevo copiamos el código y lo guardamos como LCDLIB16x2.py.

Es posible probar el funcionamiento de nuestra librería antes de usarla en nuestro programa principal, si presionamos F5 veremos un texto de prueba en la pantalla.

LCDLIB16x2.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#import
import RPi.GPIO as GPIO
import time
 
# Define GPIO to LCD mapping
LCD_RS = 14
LCD_E = 15
LCD_D4 = 18
LCD_D5 = 23
LCD_D6 = 24
LCD_D7 = 25
 
# Define some device constants
LCD_WIDTH = 16 # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
 
LINE_1 = 0x80 # LCD RAM address for the 1st line
LINE_2 = 0xC0 # LCD RAM address for the 2nd line
 
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
 
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
 
def main():
 lcd_init()
 lcd_string(" Test Libreria ",LINE_1)
 lcd_string(" LCD 16x2 ",LINE_2)
 time.sleep(5)
 
def lcd_init():
 # Initialise display
 lcd_byte(0x33,LCD_CMD) # 110011 Initialise
 lcd_byte(0x32,LCD_CMD) # 110010 Initialise
 lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
 lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
 lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
 lcd_byte(0x01,LCD_CMD) # 000001 Clear display
 time.sleep(E_DELAY)
 
def lcd_byte(bits, mode):
 # Send byte to data pins
 # bits = data
 # mode = True for character
 # False for command
 
 GPIO.output(LCD_RS, mode) # RS
 
 # High bits
 GPIO.output(LCD_D4, False)
 GPIO.output(LCD_D5, False)
 GPIO.output(LCD_D6, False)
 GPIO.output(LCD_D7, False)
 if bits&0x10==0x10:
   GPIO.output(LCD_D4, True)
 if bits&0x20==0x20:
   GPIO.output(LCD_D5, True)
 if bits&0x40==0x40:
   GPIO.output(LCD_D6, True)
 if bits&0x80==0x80:
   GPIO.output(LCD_D7, True)
 
 # Toggle 'Enable' pin
 lcd_toggle_enable()
 
 # Low bits
 GPIO.output(LCD_D4, False)
 GPIO.output(LCD_D5, False)
 GPIO.output(LCD_D6, False)
 GPIO.output(LCD_D7, False)
 if bits&0x01==0x01:
   GPIO.output(LCD_D4, True)
 if bits&0x02==0x02:
   GPIO.output(LCD_D5, True)
 if bits&0x04==0x04:
   GPIO.output(LCD_D6, True)
 if bits&0x08==0x08:
   GPIO.output(LCD_D7, True)
 
 # Toggle 'Enable' pin
 lcd_toggle_enable()
 
def lcd_toggle_enable():
 # Toggle enable
 time.sleep(E_DELAY)
 GPIO.output(LCD_E, True)
 time.sleep(E_PULSE)
 GPIO.output(LCD_E, False)
 time.sleep(E_DELAY)
 
def lcd_string(message,line):
 # Send string to display
 
 
 message = message.ljust(LCD_WIDTH," ")
 
 lcd_byte(line, LCD_CMD)
 
 for i in range(LCD_WIDTH):
   lcd_byte(ord(message[i]),LCD_CHR)
 
if __name__ == '__main__':
 
 try:
   main()
 except KeyboardInterrupt:
   pass
 finally:
   lcd_byte(0x01, LCD_CMD)
   lcd_string("Goodbye!",LINE_1)
   GPIO.cleanup()

Programa principal.

Ahora vamos a usar las funciones de nuestra librería en nuestra aplicación principal.

Creamos un archivo nuevo, copiamos el siguiente código y guardamos el archivo en la misma ubicación que se encuentra nuestra librería de LCDLIB16x2.py.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import
import time
import LCDLIB16x2 as LCD
  
# Initialise display
LCD.lcd_init()
 
while True:
 
 # Send some test
 LCD.lcd_string(" Rasbperry Pi ",LCD.LINE_1)
 LCD.lcd_string(" 16x2 LCD Test ",LCD.LINE_2)
 
 time.sleep(3) # 3 second delay
 
 # Send some text
 LCD.lcd_string("1234567890123456",LCD.LINE_1)
 LCD.lcd_string("abcdefghijklmnop",LCD.LINE_2)
 
 time.sleep(3) # 3 second delay
 
 # Send some text
 LCD.lcd_string(" Visita ",LCD.LINE_1)
 LCD.lcd_string(" bot-boss.com ",LCD.LINE_2)
 
 time.sleep(3)
GPIO.cleanup()

Ejecutamos nuestro código y el texto debería mostrarse correctamente en pantalla. Como ves es muy fácil crear nuestras librerías en Python, solo debes tomar en cuenta lo siguiente:

1.- Nuestras librerías deben estar siempre en la misma ruta que nuestro código principal.

2.- Debemos importar nuestra librería usando el mismo nombre con el que la guardamos

import LCDLIB16x2 as LCD

3.- Para usar las funciones de la librería debemos hacer referencia a ellas con el nombre de la librería seguido de un punto y el nombre de la función o variable que vamos a utilizar.

LCD.lcd_string(”  Rasbperry Pi  “,LCD.LINE_1)

Si necesita usar diferentes GPIO de la Raspberry para controlar el LCD debe definir esos pines en la librería LCDLIB16x2.py y listo. Espero le haya servido este post.

No hay comentarios:

Publicar un comentario