Pines y GPIO de la Raspberry
El capítulo anterior de este tutorial trataba sobre el Sense HAT, un dispositivo que se relacionaba con tu Raspberry a través de los GPIO, sin embargo, ni siquiera hablamos sobre ellos. Particularmente, estos pines me tienen particularmente enamorado, porque me permiten interactuar con otros dispositivos y sobre todo con sensores con relativa sencillez. Esta facilidad que tienes a tu alcance, unida con unas pequeñas pinceladas de programación abren todo un mundo de posibilidades.
Así, este capítulo del tutorial trata sobre los GPIO de las Raspberry, que son los GPIO, y que posibilidades te ofrecen. Por supuesto, también como puedes interactuar con ellos, para sacarles el máximo provecho posible.
Pines y GPIO de la Raspberry
¿Que son los GPIO de la Rasbperry?
Los GPIO son esa fila de pines que encontrarás en un uno de los lados de tu Raspberry, que en el caso de la Raspberry Pi 400, se encuentran en el lado mas elevado del propio teclado. Se trata de entradas y salidas de propósito general (General-Purpose Input/Output). En general, se trata de 40 pines, pero esta cantidad puede variar en función del modelo.
El esquema de GPIO en la Raspberry
Antes de seguir, abre un terminal y conectate a la Raspberry vía SSH, para ejecutar las siguientes instrucciones e instalar una herramienta que te será de gran utilidad.
El primer paso es instalar pip3
un gestor de paquetes de Python, que seguro que exprimes al máximo. Para instalar esta herramienta ejecuta,
sudo apt install python3-pip
Ahora, de nuevo en el terminal, ya puedes instalar gpiozero
, un interfaz muy sencillo para relacionarte con los GPIO de la Raspberry. Para esto, ejecuta,
pip3 install --user gpiozero
El hecho de instalarlo utilizando --user
hace que solo se instale para tu usuario. Si quieres instalarlo para todos los usuarios de la Raspberry, puedes hacerlo con sudo pip3 install gpiozero
. En este caso, necesitas utilizar sudo
, porque necesitas derechos de administrador para hacerlo.
Una vez instalado, lo puedes ejecutar con pinout
, si te da un error, esto es porque ~/.local/bin
no se encuentra en el PATH
. Para añadirlo al PATH
, de nuevo ejecuta las siguientes instrucciones,
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc
source ~/.bashrc
Ahora ya tienes pinout
en el PATH
, y lo puedes ejecutar desde donde quieras. Al hacerlo te mostrará el siguiente esquema,
Con la siguiente información,
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
POE:
TR01 (1) (2) TR00
TR03 (3) (4) TR02
Fíjate que tienes dos numeraciones distintas. Por un lado la que ves entre paréntesis que es correlativa, y por otro la que acompaña a cada uno de los pines. Así por ejemplo en la posición (3)
tienes el GPIO2
, por mencionarte alguno.
Te recomiendo que le des un vistazo a la página de Raspberry Pi Pinout, donde encontrarás información exhaustiva sobre cada uno de los pines.
Además en esta página podrás encontrar como puedes combinar diferentes hat para tu Raspberry.
Tensiones
En la Raspberry encontrarás dos tensiones o voltajes. Dos pines de 5 voltios (el 2 y el y 4) y 2 de 3,3 voltios (el 1 y el 17), así como 8 de tierra (todos los que están marcados como GND
en el esquema anterior).
El resto de pines son pines de 3,3 voltios de propósito general. Es decir, entrada o salida, con el voltaje indicado. Es decir que los puedes poner a 3,3 o a 0V.
Por otro lado, además tienes los pines GPIO2
y GPIO3
que están diseñados como pines de entra, son embargo, como te he indicado anteriormente, cualquier pin salvo los de salida y tierra, los puedes utilizar tanto de entrada como de salida, de forma completamente indiferente.
Funciones alternativas
Además de lo indicado anteriormente, existen algunos pines que tienen una funcionalidad alternativa:
PWM
modulación por pulsos. Vía hardware puedes utilizar GPIO12, GPIO13, GPIO18 y GPIO19. Mientras que vía software puedes utilizar cualquiera de los GPIO, salvo los que tienen una funcionalidad específica.- Buses
SPI
. Los busesSPI
los puedes utilizar para conectar a diferentes periféricos- SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)
- SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)
I2C
, Inter Itegrated Circuit. Permiten comunicación por 2c cables con una gran variedad de sensores externos y dispositivos. En general estos dispositivos no deberías de utilizarlos como de propósito general.- Data: (GPIO2); Clock (GPIO3)
- EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)
UART
, Universal Asynchronous Receiver/Transmitter, es un protocolo de comunicación serie. Este protocolo te puede ser de utilidad para controlar la Raspberry de forma remota.- TX (GPIO14); RX (GPIO15)
Programando los GPIO
Y por fin llegamos al momento interesante, el momento de programar los GPO. Existen diferentes lenguajes, empezando por Scratch, continuando con Python, y continuando con C y C++, sin olvidarme de Rust. Al final de este capítulo, puedes encontrar algunos enlaces de interés.
En mi caso, para lo que te voy a contar a continuación, me voy a decantar por Python. Se trata de un lenguaje de programación realmente amigable, y que aunque no tengas conocimientos de programación es verdaderamente sencillo de comprender.
Antes de lanzarte a programar es necesario que te des permisos para poder utilizar los GPIO
. Para esto, tienes que ejecutar la siguiente instrucción en un terminal,
sudo usermode -aG gpio <username>
sustituyendo <username>
por tu nombre de usuario como ya te habías imaginado
gpiozero
Para poder empezar a utilizar los GPIO
con Python, lo tienes fácil, porque anteriormente en este capítulo, ya instalaste la librería que necesitas utilizar.
Algunas recetas para utilizar la librería que seguro te resultarán tremendamente interesantes lo puedes encontrar en las recetas con gpiozero. Aquí puedes desde lo mas sencillo que es iluminar un LED hasta recetas mas complejas donde conttrolar un robot.
Así, por ejemplo el del LED
es tan sencillo como el que te muestro a continuación,
from gpiozero import LED
from time import sleep
red = LED(17)
while True:
rend.on()
sleep(1)
red.off()
sleep(1)
Una cuestión interesante es que a los GPIO los puedes llamar por su número como por su nombre GPIO. Es decir, cualquiera de las opciones que indicio a continuación es totalmente equivalente,
>>> led = LED(17)
>>> led = LED("GPIO17")
>>> led = LED("BCM17")
>>> led = LED("BOARD11")
>>> led = LED("WPI0")
>>> led = LED("J8:11")
Además de la clase LED, tienes otras clases interesantes como Button
, LightSensor
, RotaryEncoder
, solo por citarte algunas.
Adafruit
Pero no es la única librería Python que tienes a tu disposición. También puedes utilizar un módulo de Python implementado por Adafruit, con el que puedes medir tanto temperatura como humedad relativa. Algo tan sencillo como,
#!/usr/bin/python
import sys
import Adafruit_DHT as dht
sensor = dht.DHT22
pin = 4
humidity, temperature = dht.read_retry(sensor, pin)
print('Temp={0:0.1f} *C, Hum={1:0.1f} %'.format(temperature, humidity))
sys.exit(0)
En este caso, te recomiendo que le des una escucha al episodio número 98 del podcast en el que hablo sobre medir humedad y temperatura con la Raspberry.
Conclusión
Como ves, las posibilidades que te ofrece la Rasbperry y los GPIO son brutales. Solo tienes que investigar un poco y dar rienda suelta a tu imaginación para disfrutar al máximo de la Rasbperry.
Más información,
Imagen de portada de Hector Bermudez
La entrada Pines y GPIO de la Raspberry aparece primero en Atareao.