🛠 GPIO avec libgpiod : faire clignoter une LED et lire un bouton
Objetivos
Aprender los GPIO de la ZERO 3W como en 2026: sin sysfs (obsoleto), sino libgpiod, la vía recomendada por la documentación de Radxa. El conector de 40 pines es eléctricamente compatible con Raspberry Pi (3,3 V en lógica, ¡nunca 5 V en los pines!), con sus trampas específicas: los pines 3, 5, 27 y 28 no se pueden usar como GPIO debido a las resistencias de pull-up I2C, y los pines 8/10 = consola serie U-Boot. Escribirás un blink en C y un botón con interrupción en Python.
Material
- 1 Radxa ZERO 3W (el conector de 40 pines está sin soldar en los SKUs básicos — ten a mano el soldador o elige SKUs superiores donde ya está soldado)
- 1 LED + resistencia de 330 Ω; 1 botón pulsador
- Cables para breadboard; fuente de alimentación estable de 5 V/2 A
sudo apt install gcc libgpiod-dev gpiod python3-libgpiod
Reglas de cableado (fuente: hardware-interface oficial)
- Toda la lógica GPIO es de 3,3 V (máximo absoluto 3,63 V) — nunca inyectes 5 V en un pin.
- Pines 3, 5, 27, 28: tienen pull-ups I2C adicionales, «se comportan anormalmente como GPIO» — no los uses en modo digital.
- Pines 8/10 (TX/RX): es UART2_M0, la consola U-Boot — consulta el tutorial de serie dedicado.
- Pin 35 = GPIO3_A4; pin 11 = GPIO3_A1. Regla Rockchip: banco 3 →
gpiochip3, letra A=0/B=8 + offset → línea 4 para A4.
Blink en C (pin 35, GPIO3_A4)
/* blink.c — compile : gcc blink.c -o blink -lgpiod */
#include <gpiod.h>
#include <stdio.h>
int main(void) {
struct gpiod_chip *chip = gpiod_chip_open_by_name("gpiochip3");
if (!chip) { perror("gpiochip3"); return 1; }
struct gpiod_line *line = gpiod_chip_get_line(chip, 4); /* A4 = ligne 4 */
if (gpiod_line_request_output(line, "blink", 0) < 0) { perror("request"); return 1; }
for (int i = 0; i < 10; i++) { /* 5 cycles ON/OFF */
gpiod_line_set_value(line, 1); sleep(1);
gpiod_line_set_value(line, 0); sleep(1);
}
gpiod_line_release(line); gpiod_chip_close(chip);
return 0;
}
Sin compilar: gpioset -m signal $(gpiofind GPIO3_A4)=1 — gpiofind evita codificar chip/línea a mano.
Botón por evento (pin 11, GPIO3_A1)
#!/usr/bin/env python3 # apt install python3-libgpiod gpiod
# Bouton : broche 11 -> 3V3 ; pull-down (flag gpiod ou résistance externe vers GND)
import gpiod
chip = gpiod.Chip("gpiochip3")
line = chip.get_line(1) # A1 = ligne 1
line.request(consumer="bouton", type=gpiod.LINE_REQ_EV_RISING_EDGE)
while True:
if line.event_wait(sec=None): line.event_read; print("appui")
Verificación esperada
gcc blink.c -o blink -lgpiod && ./blink hace parpadear el LED 5 veces. El script de Python muestra «pulso» en cada pulsación, sin polling (bloqueo del kernel). gpioinfo gpiochip3 muestra tus líneas solicitadas.
Errores frecuentes
- Usar los pines 3/5/27/28 como GPIO: los pull-ups I2C de la placa distorsionan todo — la documentación oficial es explícita.
- Contar como en un Pi (GPIO BCM): aquí razonamos en chip/línea (gpiochip3, línea 4) o en nombre del kernel mediante
gpiofind GPIO3_A4. - Olvidar que el conector no está soldado en los SKUs de gama de entrada: ¡verifica tu pedido antes de comprar los cables!
- 5 V en un pin: el máximo absoluto es 3,63 V — un 5 V directo puede destruir el pin.
- Solicitar una línea ya ocupada por un overlay:
requestfalla — lista los overlays activos (sudo rsetup) y elgpioinfode cada chip. - Conectar en los pines 8/10 pensando en hacer GPIO tranquilamente: interrumpes la consola U-Boot (consulta el tutorial de UART).
Otros tutoriales para esta placa
- Premiers pas avec la Radxa ZERO 3W : flasher Radxa OS et démarrer
- Wi-Fi 6 et Bluetooth 5.4 : se connecter, choisir l'antenne, connaître sa révision
- Installer le système sur l'eMMC : rkdeveloptool, MaskROM et gain de fiabilité
- Caméra MIPI CSI : brancher une Raspberry Pi Camera (OV5647/IMX219) sur la ZERO 3W
- Noyau mainline avec Armbian : vérifier le device tree, ajouter un overlay, lire le SARADC
- NPU 0,8 TOPS : inférence RKNN (YOLO, Whisper) sur la ZERO 3W
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash