🛠 GPIO avec libgpiod : faire clignoter une LED et lire un bouton
Objectifs
Apprendre les GPIO de la ZERO 3W comme en 2026 : pas de sysfs (déprécié), mais libgpiod, la voie recommandée par la doc Radxa. Le connecteur 40 broches est électriquement compatible Raspberry Pi (3,3 V en logique, jamais 5 V sur les broches !), avec ses pièges spécifiques : broches 3, 5, 27, 28 inutilisables en GPIO à cause de résistances de pull-up I2C, et broches 8/10 = console série U-Boot. Vous écrirez un blink en C et un bouton à interruption en Python.
Matériel
- 1 Radxa ZERO 3W (le connecteur 40 broches est non soudé sur les SKUs de base — prévoyez le fer à souder ou des SKUs supérieurs où il est soudé)
- 1 LED + résistance 330 Ω ; 1 bouton poussoir
- Filles de breadboard ; alimentation stable 5 V/2 A
sudo apt install gcc libgpiod-dev gpiod python3-libgpiod
Règles de brochage (source : hardware-interface officiel)
- Toute la logique GPIO est en 3,3 V (max absolu 3,63 V) — ne jamais injecter 5 V sur une broche.
- Broches 3, 5, 27, 28 : pull-up I2C supplémentaires, « se comportent anormalement en GPIO » — ne pas les utiliser en numérique.
- Broches 8/10 (TX/RX) : c'est UART2_M0, la console U-Boot — voir le tuto série dédié.
- Broche 35 = GPIO3_A4 ; broche 11 = GPIO3_A1. Règle Rockchip : banque 3 →
gpiochip3, lettre A=0/B=8 + offset → ligne 4 pour A4.
Blink en C (broche 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;
}
Sans compiler : gpioset -m signal $(gpiofind GPIO3_A4)=1 — gpiofind évite de coder en dur chip/ligne.
Bouton à évènement (broche 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")
Vérification attendue
gcc blink.c -o blink -lgpiod && ./blink fait clignoter la LED 5 fois. Le script Python affiche « appui » sur chaque pression, sans polling (blocage noyau). gpioinfo gpiochip3 montre vos lignes demandées.
Erreurs fréquentes
- Utiliser les broches 3/5/27/28 en GPIO : les pull-up I2C de la carte faussent tout — la doc officielle est explicite.
- Compter comme sur un Pi (GPIO BCM) : ici on raisonne en chip/ligne (gpiochip3, ligne 4) ou en nom noyau via
gpiofind GPIO3_A4. - Oublier que le connecteur n'est pas soudé sur les SKUs d'entrée de gamme : vérifier sa commande avant d'acheter les fils !
- 5 V sur une broche : le max absolu est 3,63 V — un 5 V direct peut détruire la broche.
- Demander une ligne déjà occupée par un overlay :
requestéchoue — listez les overlays actifs (sudo rsetup) et legpioinfode chaque chip. - Brancher sur les broches 8/10 en pensant faire du GPIO tranquille : vous coupez court à la console U-Boot (voir le tuto UART).
Autres tutoriels pour cette carte
- 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
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash