🛠 Faire clignoter une LED avec libgpiod (numérotation GPIO du A64 : PB0 = 32)
Objetivos
Primeros pasos con GPIO en la PINE A64 bajo kernel mainline (Armbian). Hay dos especificidades que debes integrar de inmediato: (1) la numeración GPIO de Allwinner sigue la fórmula offset = (banco − A) × 32 + pin, por lo que PB0 = 1×32 + 0 = 32, PD16 = 112, PH2 = 226 — olvida la numeración BCM de Raspberry Pi; (2) el conector de 40 pines «Pi-2» no tiene el pinout del RPi: su UART está en PB0/PB1 (offsets 32/33, comentado como «On Pi-2 connector» en el device tree). Vas a cablear un LED, hacerlo parpadear en shell con gpioset, y luego en C con libgpiod.
Material
- 1 × PINE A64/A64+ bajo Armbian (kernel mainline
currentoedge) - 1 × LED + resistencia de 330 Ω a 1 kΩ
- Cables para breadboard — lógica de 3,3 V en el conector Pi-2 (estándar I/O Allwinner, no tolera 5 V)
sudo apt install gpiod libgpiod-dev
Código completo
# 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;
}
Verificación esperada
El LED parpadea a 1 Hz (script shell: 0,5 s). gpioinfo gpiochip0 lista los pines del A64 con sus nombres (PB0 en offset 32): es la herramienta que ajusta tu numeración antes de cualquier cableado. Dado que PB0/PB1 son originalmente los pines UART2 del conector Pi-2, el device tree los deja con status = "disabled" por defecto — mientras no actives uart2, puedes usarlos como salida GPIO sin conflictos.
Errores frecuentes
- Usar números «Raspberry Pi» (BCM): la numeración mainline del A64 es banco×32+pin (PB0 = 32, PH2 = 226); los bancos expuestos son PB, PC, PD, PE, PF, PG, PH — no hay ningún pin «GPIO 17» aquí.
- Creer que un shield/HAT de RPi es compatible: el conector Pi-2 es solo mecánico — la UART está en PB0/PB1 (pines físicos 11/12), I2C1 en PH2/PH3, SPI0 en PC0–PC3. >
- Inyectar 5 V en un pin: toda la lógica del conector es de 3,3 V (estándar I/O Allwinner).
- Olvidar la resistencia limitadora: un LED conectado directamente a 3,3 V consume demasiada corriente del pin.
- Buscar un ADC o un PWM de hardware en el conector Pi-2: el A64 expone un TPADC/LRADC (usado por la batería del Pinebook) pero no está enrutado hacia el conector de 40 pines; tampoco se afirma aquí que haya ningún PWM enrutado — no se ha verificado la hoja de datos PDF.
- En C, olvidar verificar el nombre del chip (
gpiochip0asume un solo controlador): en un sistema con otros drivers GPIO, ejecuta primerogpioinfo.
Otros tutoriales para esta placa
- 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)
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash