Los GPIO son pines de entrada/salida de propósito general que permiten a la Raspberry Pi interactuar con dispositivos externos.
Estos pines pueden configurarse como entradas (para leer datos) o como salidas (para enviar señales).
Los GPIO permiten a la Raspberry Pi interactuar con el mundo físico, ya sea para leer datos de sensores o para controlar dispositivos externos como LEDs, motores o relés.
Características principales de los GPIO
- Voltaje: 3.3V (nunca exceder este voltaje).
- Corriente máxima por pin: 16mA.
- Corriente total máxima para todos los pines: 50mA.
- Pines disponibles: Depende del modelo de Raspberry Pi, pero la mayoría tiene 40 pines GPIO.
Los GPIO en Raspberry Pi son más “delicados” que los de un Arduino o un ESP32. Tratadlos con cuidado, o podéis convertir vuestra Raspberry en un pisapapeles.
Los GPIO funcionan a 3.3V. No excedáis esta tensión, o dañaréis la Raspberry Pi.
Salida digital con GPIO
Para utilizar los GPIO en la Raspberry Pi, es necesario configurar los pines como entradas o salidas. Esto se puede hacer utilizando lenguajes de programación como Python (que es el más comúnmente utilizado para aprender).
Para poder usarlos, tenemos la biblioteca RPi.GPIO
es una de las más populares para interactuar con los GPIO en Python. Podemos instalarla ejecutando el siguiente comando en la terminal de tu Raspberry Pi:
sudo apt-get update
sudo apt-get install python3-rpi.gpio
Ahora, podemos configurar un pin GPIO como salida y encender un LED:
import RPi.GPIO as GPIO
import time
# Configura el modo de los pines
GPIO.setmode(GPIO.BCM) # Usa la numeración BCM (Broadcom)
# Define el pin GPIO como salida
LED_PIN = 18
GPIO.setup(LED_PIN, GPIO.OUT)
try:
while True:
# Enciende el LED
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1) # Espera 1 segundo
# Apaga el LED
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(1) # Espera 1 segundo
except KeyboardInterrupt:
# Limpia los pines GPIO al salir
GPIO.cleanup()
En este ejemplo, el LED conectado al pin GPIO 18 se enciende y apaga cada segundo.
Entrada digital con GPIO
Además de controlar dispositivos de salida, los GPIO también pueden utilizarse para leer datos de dispositivos de entrada (como sensores o señales proporcionadas por otros dispositivos).
Por ejemplo, así podríamos configurar un pin GPIO como entrada y leer un nivel de tensión proporcionado por otro dispositivo:
import RPi.GPIO as GPIO
import time
# Configura el modo de los pines
GPIO.setmode(GPIO.BCM)
# Define el pin GPIO como entrada
INPUT_PIN = 17
GPIO.setup(INPUT_PIN, GPIO.IN)
try:
while True:
# Lee el nivel de tensión en el pin
input_state = GPIO.input(INPUT_PIN)
if input_state == GPIO.HIGH:
print("Nivel de tensión ALTO detectado")
else:
print("Nivel de tensión BAJO detectado")
time.sleep(0.1) # Espera 100ms para evitar lecturas rápidas
except KeyboardInterrupt:
# Limpia los pines GPIO al salir
GPIO.cleanup()
En este ejemplo,
- El programa lee el nivel de tensión en el pin GPIO 17, que podría estar conectado a otro dispositivo que proporciona una señal de 3.3V (ALTO) o 0V (BAJO).
- Dependiendo del nivel de tensión, se imprime un mensaje en la consola.
Uso de resistencias pull-up y pull-down
Cuando se utilizan entradas GPIO, es común utilizar resistencias pull-up o pull-down para asegurar que el pin tenga un estado definido cuando no está siendo activado por un dispositivo externo.
La Raspberry Pi tiene resistencias pull-up y pull-down internas (de entre 50k-60k) que pueden ser activadas mediante software.
Si deseas utilizar una resistencia pull-down, puedes hacerlo de la siguiente manera:
GPIO.setup(INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Resistencia pull-up
# o
GPIO.setup(INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Resistencia pull-down
En la siguiente entrada, veremos cómo leer un pulsador utilizando un GPIO.
Ejemplos prácticos
Control de un LED con un botón
Este ejemplo muestra cómo controlar un LED utilizando un botón. El LED se enciende cuando el botón es presionado y se apaga cuando se suelta.
import RPi.GPIO as GPIO
import time
# Configura el modo de los pines
GPIO.setmode(GPIO.BCM)
# Define los pines GPIO
LED_PIN = 18
BUTTON_PIN = 17
# Configura los pines
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
# Lee el estado del botón
button_state = GPIO.input(BUTTON_PIN)
if button_state == GPIO.LOW:
GPIO.output(LED_PIN, GPIO.HIGH) # Enciende el LED
else:
GPIO.output(LED_PIN, GPIO.LOW) # Apaga el LED
time.sleep(0.1) # Espera 100ms para evitar rebotes
except KeyboardInterrupt:
# Limpia los pines GPIO al salir
GPIO.cleanup()
Detector de movimiento con sensor PIR
Este ejemplo muestra cómo utilizar un sensor PIR (Passive Infrared) para detectar movimiento y encender un LED cuando se detecta movimiento.
import RPi.GPIO as GPIO
import time
# Configura el modo de los pines
GPIO.setmode(GPIO.BCM)
# Define los pines GPIO
PIR_PIN = 17
LED_PIN = 18
# Configura los pines
GPIO.setup(PIR_PIN, GPIO.IN)
GPIO.setup(LED_PIN, GPIO.OUT)
try:
while True:
# Lee el estado del sensor PIR
pir_state = GPIO.input(PIR_PIN)
if pir_state == GPIO.HIGH:
GPIO.output(LED_PIN, GPIO.HIGH) # Enciende el LED
print("Movimiento detectado")
else:
GPIO.output(LED_PIN, GPIO.LOW) # Apaga el LED
print("No hay movimiento")
time.sleep(0.1) # Espera 100ms para evitar falsos positivos
except KeyboardInterrupt:
# Limpia los pines GPIO al salir
GPIO.cleanup()
Control de un motor paso a paso
import RPi.GPIO as GPIO
import time
# Configuración de los pines
STEP_PIN = 17
DIR_PIN = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(STEP_PIN, GPIO.OUT)
GPIO.setup(DIR_PIN, GPIO.OUT)
# Dirección del motor
GPIO.output(DIR_PIN, GPIO.HIGH) # Sentido horario
try:
while True:
GPIO.output(STEP_PIN, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(STEP_PIN, GPIO.LOW)
time.sleep(0.001)
except KeyboardInterrupt:
GPIO.cleanup()