Raspberry Pi y GPIO
¿Cómo funcionan los GPIO?
GPIO significa General Purpose Input Output y representa el rango de clavijas ubicadas en la tarjeta de la Raspberry Pi y que se pueden conectar a periféricos externos. Este aspecto es uno de los más interesantes de la programación embebida, es decir, conectar un periférico y comunicarse con él aumenta de esta manera las capacidades y posibilidades de la Raspberry Pi. 26 conectores forman el conjunto principal de clavijas GPIO. Están alineadas en dos franjas de 13 clavijas y se sitúan entre el conector DSI y la salida de vídeo RCA:
![images/11RI01.png images/11RI01.png](https://www.eni-training.com/download/76293ea1-ab1a-4da6-b137-f0d5ea22ba48/images/11RI01.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Desde un punto de vista electrónico, las clavijas GPIO son entradas y salidas digitales capaces de generar y recibir señales digitales 0 y 1. En cada transmisión se emite una tensión comprendida entre 0 y 3.3 V. El siguiente esquema explica con detalle la conexión del GPIO en esta versión de la Raspberry Pi:
![images/57.png images/57.png](https://www.eni-training.com/download/76293ea1-ab1a-4da6-b137-f0d5ea22ba48/images/57.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Conectar una pantalla LCD 16x2 a la Raspberry Pi
El objetivo de este proyecto es controlar una pantalla LCD (Liquid Cristal Display), capaz de mostrar 16 caracteres de ancho y dos caracteres de alto. Los modelos disponibles en venta por Internet integran, prácticamente todos, un microcontrolador Hitachi HD44780, componente esencial y necesario para comunicarse con la pantalla. Hitachi HD44780
Para llevar a buen puerto este proyecto, será necesario equiparse con las siguientes herramientas:
-
un soldador;
-
estaño;
-
un circuito impreso de 400 pines, también llamado breadboard;
-
ocho cables de conexión macho-hembra;
-
seis cables de conexión macho-macho;
-
una resistencia de 650 Ω (ohm).
El modelo elegido es el que vende la empresa Adafruit y forma una conexión de 18 conectores:
![images/11RI03.png images/11RI03.png](https://www.eni-training.com/download/76293ea1-ab1a-4da6-b137-f0d5ea22ba48/images/11RI03.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
En este modelo, la conexión de la pantalla LCD se muestra en su reverso. Para evitar cualquier confusión, el procedimiento explicado en este libro ignora la conexión de los conectores 17 y 18 a las clavijas GPIO de la Raspberry Pi, porque las pantallas de 16 conectores son los modelos más habituales en el mercado. La diferencia principal entre los modelos de 16 y de 18 conectores está a nivel del color del fondo de pantalla del LCD: los modelos de 16 clavijas muestran los caracteres en negro sobre fondo opaco, mientras que los modelos de 18 clavijas muestran un fondo en color.
Siguiente etapa: soldar las 16 clavijas...
Proyecto #1: comunicarse con la pantalla LCD
Normalmente, la librería que se utiliza para enviar información a las clavijas GPIO se entrega junto a Raspbian: RPi.GPIO. Su uso es muy similar a la del sistema y requiere manipular bytes para indicar a la pantalla LCD los caracteres a enviar. Afortunadamente, existe otra librería que simplifica mucho toda esta parte. Se trata de RPLCD y cuya página de bienvenida del proyecto se encuentra en Github, en la siguiente dirección: https://github.com/dbrgn/RPLCD/. Como es habitual, será necesario utilizar pip3 para instalar esta librería externa en la Raspberry Pi:
pi@raspberrypi:~ $ sudo su -
root@raspberrypi:~# pip3 install RPLCD
La librería se articula en torno a la clase CharLCD. Esta clase se compone de tres funciones esenciales que son:
-
clear() para limpiar los caracteres que quedan en pantalla;
-
write_string() que recibe como argumento la cadena a enviar a la pantalla;
-
close() para cerrar la comunicación con la pantalla. Esta función acepta un buleano, clear, que cuando se ajusta a True limpia la pantalla antes de cerrar la comunicación.
Para simplificar la elaboración de los tres programas de este capítulo, la clase LCD16x2 se ha escrito heredando de CharLCD (Capitulo_11/lcd16x2.py):
1 import RPi.GPIO as GPIO
2 from RPLCD import CharLCD
3 import time
4
5 class LCD16x2(CharLCD):
6 def __init__(self):
7 CharLCD.__init__(
8 self, ...
Proyecto #2: crear un tubo FIFO dedicado a la pantalla LCD
Los scripts detallados hasta ahora implican tener que escribir código en Python para poder generar un mensaje y enviarlo a la pantalla. Eliminar esta etapa permitiría reducir la complejidad del envío de mensajes. Para hacerlo, la solución se basa en el estándar tradicional IPC (Inter-Process Communication), a través del uso de un archivo especial, también llamado tubo FIFO (First In First Out) y ubicado en la carpeta /dev del sistema de archivos de la Raspberry Pi. En teoría, un tubo FIFO es un vaso comunicante, en el que dos procesos intercambian mensajes. De esta manera, Proceso 1 escribe en el tubo mientras que Proceso 2 escucha y lee los datos enviados por el tubo:
![images/59.png images/59.png](https://www.eni-training.com/download/76293ea1-ab1a-4da6-b137-f0d5ea22ba48/images/59.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
La manipulación de un tubo FIFO puede llevarse a cabo directamente desde la shell, a través del comando mkfifo:
pi@rasberrypi:~$ mkfifo fifo
pi@rasberrypi:~$ ls -l fifo
prw-rw-r-- 1 pi pi 0 mai 9 09:49 fifo
pi@rasberrypi:~$ cat fifo
Como resultado del comando cat, se encuentra en suspensión a la espera de que se envíen los datos en el tubo. Para hacerlo, basta con abrir una segunda shell y escribir en el tubo:
pi@raspberrypi:~$ echo 'Esto es una prueba' > fifo
pi@raspberrypi:~$
Cuando se ejecuta el comando, un simple vistazo a la primera shell muestra que el comando cat ya no está en suspensión y que el resultado del comando echo se ha transmitido a este proceso:
pi@raspberrypi:~$ cat fifo ...
Proyecto #3: controlar la pantalla LCD desde una interfaz gráfica tkinter
Para el último ejemplo de esta serie de aplicaciones, qué mejor que crear una enésima interfaz gráfica para los menos entusiastas de la línea de comandos. Este ejemplo recopila las funcionalidades disponibles para la pantalla LCD, explicadas hasta ahora, que son escribir y enviar mensajes a la pantalla o eliminarlos. La librería que se utiliza para ofrecer una interfaz ligera y fluida en la Raspberry Pi sigue siendo tkinter. El contenido de este programa es el siguiente (Capitulo_11/lcditor.py):
1 #!/usr/bin/env python3
2 from tkinter.messagebox import *
3 from lcd16x2 import LCD16x2
4 from tkinter import *
5
6 class LCDitor(Frame):
7 def __init__(self, parent=None):
8 Frame.__init__(self, parent)
9 self.pack(expand=YES, fill=BOTH)
10 self.nombre_editor = self.__class__.__name__
11 self.crear_componentes()
12 self.lcd = LCD16x2()
La arquitectura del script sigue siendo muy clásica. Como siempre, hay una clase que agrupa la lógica. Cuatro funciones completan este programa. crear_componentes() gestiona los dos botones y la zona de texto en el Frame principal:...
Conclusión
Este capítulo explica con detalle la conexión de una pantalla LCD 16x2 en la Raspberry Pi. Se puede considerar como uno de los capítulos del libro más arduos, porque necesita que el lector esté familiarizado con las clavijas GPIO de la Raspberry Pi, la soldadura, la comprensión de un circuito eléctrico y la programación.