¿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.

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.

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) | Sí | Sí | Principiantes, todos los modelos |
| lgpio | Sí | Sí | Sí | Usuarios avanzados, Pi 5 |
| RPi.GPIO | No | Sí | Sí | 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:

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:

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:
sudo apt update
sudo apt install python3-gpiozero python3-lgpio -y
Para RPi.GPIO (solo Pi 2 a 4):
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:
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:
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:
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.
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.
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):
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.
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.
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.
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
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.
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 | Sí | Sí | No |
| Raspberry Pi 4 / 3 | Sí | Sí | Sí |
| 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) | Sí | Sí | 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:
sudo nano /etc/systemd/system/mein-gpio-script.service
Y dentro pones esto (ajusta la ruta y el usuario a los tuyos):
[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:
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_timeal crear el objeto, por ejemploButton(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
Buttonen 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
- Tutorial original (alemán): GPIO mit Python am Raspberry Pi: gpiozero, lgpio und RPi.GPIO im Vergleich (2026) por Philipp Schweizer en raspberry.tips
- Documentación gpiozero: gpiozero.readthedocs.io
- Documentación lgpio (abyz): abyz.me.uk/lg/py_lgpio.html
- Pinout oficial Raspberry Pi: pinout.xyz
Versión chilena con componentes en stock local en MechatronicStore. Inspirado en el trabajo de Philipp Schweizer (raspberry.tips).



