¿Quieres que un LED parpadee, leer un pulsador o disparar un sensor desde tu Raspberry Pi con un par de líneas de Python? Esa es la puerta de entrada al mundo del hardware, y todo pasa por los pines GPIO. La trampa es que hoy existen tres librerías distintas para hablar con esos pines, y elegir la equivocada te hace perder una tarde entera con errores raros. Especialmente desde que llegó la Raspberry Pi 5, donde la librería clásica simplemente dejó de funcionar.

En esta guía comparamos las tres opciones que de verdad importan en 2026: gpiozero (la más amistosa para empezar), lgpio (la opción moderna y la única recomendada para la Pi 5) y RPi.GPIO (el clásico que todavía manda en los modelos antiguos). Al terminar vas a saber cuál usar según tu placa, vas a tener ejemplos listos para copiar de LED, pulsador y PWM, y vas a entender por qué la Pi 5 cambió las reglas del juego.

Raspberry Pi sobre protoboard con un LED conectado y código de gpiozero en el editor

Por qué la Raspberry Pi 5 cambió todo

Antes de tocar código conviene entender el quiebre, porque es el origen del 90% de los dolores de cabeza. La Raspberry Pi 5 no conecta sus pines GPIO directamente al SoC como las generaciones anteriores: ahora hay un chip intermedio, el RP1, que actúa como puente de entrada y salida. Ese chip necesita drivers de kernel distintos, y por eso RPi.GPIO ya no corre en la Pi 5. En los demás modelos (Pi 2, 3, 4 y la Zero) sigue funcionando sin problemas.

Raspberry Pi 5 mostrando su cabezal de 40 pines GPIO y el chip RP1

Para no equivocarte, esta es la compatibilidad real de cada librería según tu modelo:

Librería Pi 5 Pi 4 / 3 / 2 Zero 2 W Recomendación
gpiozero Sí (usa lgpio por debajo) Principiantes, todos los modelos
lgpio Usuarios avanzados, Pi 5
RPi.GPIO No Proyectos legacy en Pi 2 a 4

La regla corta: si estás partiendo o quieres código que funcione en cualquier placa, usa gpiozero. Tiene una sintaxis muy limpia y elige el backend correcto por sí sola. Si necesitas más control fino (timing preciso, PWM por hardware), baja un nivel a lgpio. Y si vas a mantener un proyecto viejo en una Pi 3 o 4, RPi.GPIO sigue siendo válido.

Lo que necesitas antes de empezar

Para todos los ejemplos de esta guía vas a usar:

  • Una Raspberry Pi (cualquier modelo) con Raspberry Pi OS Bookworm o más nuevo
  • Python 3 (desde Bookworm viene Python 3.11 preinstalado)
  • 1 o 2 LEDs, resistencias de 330 ohm, una protoboard y cables de conexión
  • Opcional: un pulsador (botón momentáneo)

Un detalle de seguridad que te puede salvar la placa: los pines GPIO de la Raspberry Pi trabajan a 3,3 V, no a 5 V. Si conectas un sensor o módulo de 5 V directo a un pin de entrada, lo más probable es que dañes la Pi de forma irreversible. Para esos casos necesitas un conversor de nivel (level shifter) en el medio. Tenelo presente desde el primer cable.

Cómo leer el cabezal de pines: BCM vs BOARD

Acá hay otra fuente clásica de confusión. Un mismo pin tiene dos nombres según cómo lo numeres:

  • BOARD: la posición física del pin, del 1 al 40, contando en el conector.
  • BCM: el número interno de GPIO que usa el procesador Broadcom.

Por ejemplo, el pin físico 11 es el GPIO17 en BCM. Tanto gpiozero como lgpio usan numeración BCM por defecto, así que cuando el código diga LED(17), se refiere al GPIO17, que está en el pin físico 11. Este diagrama oficial te muestra el mapeo completo:

Diagrama oficial del cabezal GPIO de 40 pines de la Raspberry Pi con numeración BCM y física

Si prefieres una vista rápida del conector con los colores por función (GPIO, tierra, 3,3 V y 5 V), esta referencia ayuda a ubicarte de un vistazo:

Referencia visual de los pines del cabezal de 40 pines por función

Instalación de las librerías

En un Raspberry Pi OS Bookworm actual, gpiozero y lgpio ya vienen instaladas. Por si acaso, este comando las instala o actualiza de una:

Bash
sudo apt update
sudo apt install python3-gpiozero python3-lgpio -y

Para RPi.GPIO (solo Pi 2 a 4):

Bash
sudo apt install python3-rpi.gpio -y

Un aviso importante si trabajas con entornos virtuales: cuando creas un venv, hazlo con --system-site-packages para que Python pueda ver los paquetes GPIO del sistema, que no se instalan con pip:

Bash
python3 -m venv --system-site-packages meinenv

gpiozero: el camino más fácil

gpiozero fue diseñada justamente para que partir sea simple. En lugar de manejar pines como números crudos, trabajas con objetos que se leen solos, como LED, Button o MotionSensor. Eso hace el código casi autoexplicativo.

Hacer parpadear un LED

Conecta un LED con una resistencia de 330 ohm entre GPIO17 (pin 11) y GND (pin 9). Luego:

Python
from gpiozero import LED
from time import sleep

led = LED(17)   # BCM-Nummer, also GPIO17

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

Con led.blink() el mismo efecto te queda aún más corto, porque gpiozero lanza el parpadeo en su propio hilo en segundo plano:

Python
from gpiozero import LED
from signal import pause

led = LED(17)
led.blink(on_time=0.5, off_time=0.5)
pause()   # Script läuft weiter, bis du Ctrl+C drückst

Leer un pulsador

Conecta un botón entre GPIO27 (pin 13) y GND. Lo bueno: gpiozero activa la resistencia pull up interna por sí sola, así que no necesitas una externa.

Python
from gpiozero import Button
from signal import pause

button = Button(27)

button.when_pressed  = lambda: print("Gedrückt!")
button.when_released = lambda: print("Losgelassen!")

pause()

Encender un LED con el pulsador

Acá se nota la elegancia de la librería: puedes asignar los eventos directamente a los métodos del LED, sin escribir lógica intermedia.

Python
from gpiozero import LED, Button
from signal import pause

led    = LED(17)
button = Button(27)

button.when_pressed  = led.on
button.when_released = led.off

pause()

Atenuar un LED con PWM

Para controlar el brillo usas PWMLED. El valor va de 0 (apagado) a 1 (brillo máximo):

Python
from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)

# Langsam heller werden
for i in range(0, 101, 5):
    led.value = i / 100
    sleep(0.05)

# Pulsieren (automatisch, non-blocking)
led.pulse(fade_in_time=1, fade_out_time=1)

lgpio: la opción moderna de bajo nivel

lgpio es la librería que conversa directamente con el hardware GPIO en la Raspberry Pi 5. Su API es un poco más técnica que la de gpiozero, pero a cambio te da más control, por ejemplo para timing exacto o PWM por hardware.

Estructura base

Con lgpio primero tienes que abrir un handle (algo parecido a abrir un archivo) y cerrarlo siempre al final. Si lo dejas abierto, el pin queda ocupado para otros procesos.

Python
import lgpio
import time

# GPIO-Chip öffnen (0 = /dev/gpiochip0, auf Pi 5 auch gpiochip4 möglich)
h = lgpio.gpiochip_open(0)

try:
    lgpio.gpio_claim_output(h, 17)   # GPIO17 als Ausgang

    for _ in range(5):
        lgpio.gpio_write(h, 17, 1)   # HIGH
        time.sleep(0.5)
        lgpio.gpio_write(h, 17, 0)   # LOW
        time.sleep(0.5)

finally:
    lgpio.gpiochip_close(h)          # Immer schließen!

Un detalle propio de la Pi 5: hay dos chips GPIO. El gpiochip0 es el del RP1, donde están los pines del cabezal de 40 que de verdad te interesan. Para los pines normales del conector siempre usas gpiochip0.

Interrupción de pulsador con lgpio

Acá lgpio brilla: soporta callbacks por hardware. El código solo se ejecuta cuando el estado de un pin cambia de verdad, sin gastar CPU haciendo polling en un bucle. Para proyectos que tienen que estar atentos a un botón mientras hacen otra cosa, esto es mucho más eficiente.

Python
import lgpio
from signal import pause

def button_callback(chip, gpio, level, timestamp):
    if level == 0:      # Fallende Flanke = Button gedrückt
        print(f"Button auf GPIO{gpio} gedrückt!")

h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_input(h, 27, lgpio.SET_PULL_UP)

# Callback bei fallender Flanke registrieren
lgpio.callback(h, 27, lgpio.FALLING_EDGE, button_callback)

print("Warte auf Tastendruck (Ctrl+C zum Beenden)...")
pause()

lgpio.gpiochip_close(h)

PWM por hardware con lgpio

Este es el punto donde lgpio se diferencia de gpiozero y RPi.GPIO: el PWM sale del hardware, no se simula por software, así que es más estable para controlar brillo de LEDs, velocidad de motores o servos.

Python
import lgpio
import time

h = lgpio.gpiochip_open(0)

# Hardware-PWM auf GPIO18 (Pin 12) – muss PWM-fähig sein
# Frequenz: 1000 Hz, Duty-Cycle: 50%
lgpio.tx_pwm(h, 18, 1000, 50)
time.sleep(2)

# Duty-Cycle auf 20% reduzieren
lgpio.tx_pwm(h, 18, 1000, 20)
time.sleep(2)

lgpio.tx_pwm(h, 18, 0, 0)   # PWM stoppen
lgpio.gpiochip_close(h)

RPi.GPIO: para proyectos antiguos en Pi 2 a 4

RPi.GPIO es la librería más vieja y conocida. Muchísimos tutoriales y libros todavía se basan en ella, así que te la vas a topar seguido. Recuerda: en la Pi 5 no funciona, ahí usa gpiozero o lgpio.

Parpadeo de LED con RPi.GPIO

Python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)      # BCM-Nummerierung verwenden
GPIO.setup(17, GPIO.OUT)    # GPIO17 als Ausgang

try:
    for _ in range(5):
        GPIO.output(17, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17, GPIO.LOW)
        time.sleep(0.5)
finally:
    GPIO.cleanup()           # Pins zurücksetzen – immer ausführen!

Leer un pulsador con RPi.GPIO

Fíjate en el GPIO.cleanup() del bloque finally: dejar los pines en su estado por defecto al terminar es una buena costumbre que evita el típico error de "pin ocupado" la próxima vez que corras el script.

Python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Pull-Up aktivieren

try:
    while True:
        if GPIO.input(27) == GPIO.LOW:   # LOW = Button gedrückt
            print("Button gedrückt!")
            time.sleep(0.3)              # Entprellung
        time.sleep(0.05)
finally:
    GPIO.cleanup()

Tabla comparativa rápida

Si tuvieras que decidir de un vistazo, esta es la foto completa de las tres librerías:

Criterio gpiozero lgpio RPi.GPIO
Facilidad para principiantes Muy alta Media Media
Raspberry Pi 5 No
Raspberry Pi 4 / 3
PWM por hardware PWM por software PWM por hardware PWM por software
Interrupciones / callbacks Por eventos Callbacks de hardware add_event_detect
Cantidad de código Muy poca Media Media
Preinstalada (Bookworm) Manual
Desarrollo activo Activo Activo Detenido

Ejecutar tu script GPIO al arrancar la Pi

Cuando ya tengas tu proyecto andando, lo normal es que quieras que se inicie solo al encender la Raspberry Pi, sin tener que entrar por SSH a lanzarlo a mano. La forma recomendada es con systemd. Primero creas un archivo de servicio:

Bash
sudo nano /etc/systemd/system/mein-gpio-script.service

Y dentro pones esto (ajusta la ruta y el usuario a los tuyos):

Ini
[Unit]
Description=Mein GPIO Python Script
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/mein_script.py
WorkingDirectory=/home/pi
StandardOutput=journal
StandardError=journal
Restart=on-failure
User=pi

[Install]
WantedBy=multi-user.target

Después lo habilitas y lo arrancas:

Bash
sudo systemctl daemon-reload
sudo systemctl enable mein-gpio-script.service
sudo systemctl start mein-gpio-script.service

# Status prüfen
sudo systemctl status mein-gpio-script.service

A partir de ahí, tu script vuelve a la vida cada vez que la Pi se enciende, y el flag Restart=on-failure lo reinicia solo si llegara a caerse.

Errores comunes y cómo resolverlos

Estos son los tropiezos que más se repiten cuando recién partes con GPIO:

Mensaje de error Causa Solución
RuntimeError: Not running on a RPi RPi.GPIO en una Pi 5 o hardware incorrecto Cambia a gpiozero o lgpio
lgpio.error: GPIO busy El pin todavía lo usa otro proceso Asegura el lgpio.gpiochip_close(h); si persiste, reinicia la Pi
PermissionError: [Errno 13] El usuario no tiene permisos GPIO Ejecuta sudo usermod -aG gpio $USER y vuelve a iniciar sesión
ModuleNotFoundError: No module named 'gpiozero' venv creado sin acceso a paquetes del sistema Recrea el venv con --system-site-packages
El LED no enciende Falta la resistencia o el LED está al revés Revisa el circuito: la pata más corta es el cátodo y va a GND

Variantes y mejoras

Una vez que dominas el parpadeo y el pulsador, estas son extensiones concretas para llevar tus proyectos más lejos, todas pensadas para crecer desde lo que ya armaste:

  • Anti rebote (debounce) por software con gpiozero: si tu pulsador "registra" varias pulsaciones por un solo toque, agrega el parámetro bounce_time al crear el objeto, por ejemplo Button(27, bounce_time=0.05). Eso filtra los rebotes eléctricos del contacto sin que tengas que escribir lógica extra.
  • Sumar sensores I2C: combina lo aprendido con un sensor ambiental como el BME280 (temperatura, humedad y presión) usando la librería smbus2. Con eso pasas de "encender un LED" a una mini estación meteorológica que registra datos.
  • Pantalla OLED por I2C o SPI: en vez de imprimir en la consola con print, muestra el estado de tus pines o las lecturas de un sensor en una pantalla OLED SSD1306. Es el paso natural para que el proyecto funcione sin estar conectado al computador.
  • Control de motores y servos: usando el PWM por hardware de lgpio puedes manejar la velocidad de un motor o la posición de un servo con mucha más precisión que con PWM por software.

Personalización para Chile

En Chile puedes conseguir todo lo necesario para estos ejemplos en MechatronicStore. La placa es lo central: la Raspberry Pi 5 corre gpiozero y lgpio sin problema, y si buscas una opción más económica y siempre disponible, la Raspberry Pi Zero 2 W también soporta las tres librerías (es el modelo "Zero 2 W" de la tabla de compatibilidad). Para el circuito de prueba:

  • Cables macho hembra 30 cm (SKU 9284) por $1.990: justo los DuPont que necesitas para llevar las señales del cabezal de 40 pines a la protoboard, sin soldar nada.
  • Botón Pulsador 2 pines 6x6x10mm (SKU 711269) por $390: el pulsador momentáneo ideal para los ejemplos de Button en protoboard.
  • Protoboard base robusta 2900 puntos (SKU 24587) por $9.990: amplia y con borneras, te sobra espacio para todos los circuitos de esta guía.

Para los pasivos, las resistencias de 1/4 W variedad de valores del catálogo incluyen el valor de 330 ohm que pide cada LED, y los LEDs de 5 mm vienen en pack de colores surtidos. Si el tutorial original que viste menciona un kit de marca extranjera, cualquiera de estos componentes sueltos cumple la misma función a precio local.

Recursos

Versión chilena con componentes en stock local en MechatronicStore. Inspirado en el trabajo de Philipp Schweizer (raspberry.tips).