🛠 Faire clignoter une LED avec libgpiod (numérotation GPIO du A64 : PB0 = 32)
Objectifs
Premier pas GPIO sur la PINE A64 sous noyau mainline (Armbian). Deux spécificités à intégrer tout de suite : (1) la numérotation GPIO d'Allwinner suit la formule offset = (banque − A) × 32 + broche, donc PB0 = 1×32 + 0 = 32, PD16 = 112, PH2 = 226 — oublie la numérotation BCM du Raspberry Pi ; (2) le connecteur 40 broches « Pi-2 » n'a pas le pinnage du RPi : son UART est sur PB0/PB1 (offsets 32/33, commenté « On Pi-2 connector » dans le device tree). Tu vas câbler une LED, la faire clignoter en shell avec gpioset, puis en C avec libgpiod.
Matériel
- 1 × PINE A64/A64+ sous Armbian (noyau mainline
currentouedge) - 1 × LED + résistance de 330 Ω à 1 kΩ
- Câbles breadboard — logique 3,3 V sur le connecteur Pi-2 (standard I/O Allwinner, non tolérant 5 V)
sudo apt install gpiod libgpiod-dev
Code complet
# Repérer la puce GPIO (le pilote pinctrl-sun50i-a64 est gpiochip0) :
gpioinfo gpiochip0 | head
# Clignoter en shell — PB0 => offset 32 :
while true; do gpioset gpiochip0 32=1; sleep 0.5; gpioset gpiochip0 32=0; sleep 0.5; done
/* blink.c — gcc blink.c -o blink -lgpiod */
#include <gpiod.h>
#include <unistd.h>
int main(void) {
/* PB0 : (B-A)*32 + 0 = 32 (pilote pinctrl sun50i-a64 = gpiochip0) */
struct gpiod_chip *chip = gpiod_chip_open_by_name("gpiochip0");
if (!chip) { perror("gpiochip0"); return 1; }
struct gpiod_line *led = gpiod_chip_get_line(chip, 32); /* PB0 */
if (gpiod_line_request_output(led, "blink", 0)) { perror("request PB0"); return 1; }
for (int i = 0; i < 10; i++) {
gpiod_line_set_value(led, i & 1);
sleep(1);
}
return 0;
}
Vérification attendue
La LED clignote à 1 Hz (script shell : 0,5 s). gpioinfo gpiochip0 liste les broches du A64 avec leurs noms (PB0 en offset 32) : c'est l'outil qui recale ta numérotation avant tout câblage. PB0/PB1 étant à l'origine les broches UART2 du connecteur Pi-2, le device tree les laisse status = "disabled" par défaut — tant que tu n'actives pas uart2, tu peux les utiliser en sortie GPIO sans conflit.
Erreurs fréquentes
- Utiliser des numéros « Raspberry Pi » (BCM) : la numérotation mainline du A64 est bank×32+pin (PB0 = 32, PH2 = 226) ; les banques exposées sont PB, PC, PD, PE, PF, PG, PH — pas de broche « GPIO 17 » ici.
- Croire un shield/HAT RPi compatible : le connecteur Pi-2 est mécanique seulement — l'UART est sur PB0/PB1 (broches physiques 11/12), I2C1 sur PH2/PH3, SPI0 sur PC0–PC3. >
- Injecter du 5 V sur une broche : toute la logique du connecteur est en 3,3 V (standard I/O Allwinner).
- Oublier la résistance de limitation : une LED directe sur 3,3 V tire trop sur la broche.
- Chercher un ADC ou un PWM matériel sur le connecteur Pi-2 : le A64 expose un TPADC/LRADC (utilisé par la batterie du Pinebook) mais il n'est pas routé vers le connecteur 40 broches ; aucun PWM routé n'est revendiqué ici non plus — la datasheet PDF n'a pas été vérifiée machine.
- En C, oublier de vérifier le nom de la puce (
gpiochip0suppose un seul contrôleur) : sur un système avec d'autres pilotes GPIO,gpioinfod'abord.
Autres tutoriels pour cette carte
- Premier boot d'Armbian sur la PINE A64 (microSD, console série, rootfs)
- PINE A64 ou PINE A64+ ? Le pièg du réseau gigabit dès le premier regard
- Benchmark Ethernet iperf3 : mesurer le piège 10/100 vs gigabit
- Lire un capteur I²C (BME280) sur le bus i2c-1 du connecteur Pi-2
- Un serveur maison qui consomme 2,5 W : Docker léger sur la PINE A64
- Construire sa propre image Armbian pour la PINE A64 (armbian/build)
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash