🛠 GPIO en C avec libgpiod : l'API caractère moderne
Objetivo
Controlar los GPIO de la Zero desde C con la API de dispositivo de carácter libgpiod —el reemplazo mantenido para los enfoques obsoletos sysfs y wiringPi— y ver qué expone el BCM2835 como un único chip GPIO.
Componentes
- Zero con cabecera de 40 pines soldada; LED + resistencia de 330 Ohm desde GPIO17 (pin físico 11) a GND
sudo apt install libgpiod-dev
Código
/* Build: gcc blink.c -o blink -lgpiod */
#include <gpiod.h>
#include <unistd.h>
int main(void) {
struct gpiod_chip *chip = gpiod_chip_open_by_name("gpiochip0");
if (!chip) return 1; /* the BCM2835 exposes one chip */
struct gpiod_line *led = gpiod_chip_get_line(chip, 17); /* GPIO17 */
gpiod_line_request_output(led, "blink", 0);
for (int i = 0; i < 10; i++) { /* 10 blinks, ~0.2 W each */
gpiod_line_set_value(led, i & 1);
usleep(250000);
}
gpiod_line_release(led);
gpiod_chip_close(chip);
return 0;
}
Recorrido por la CLI: gpiodetect, gpioinfo gpiochip0, gpioset gpiochip0 17=1.
Verificación
El LED parpadea 5 veces a 2 Hz. Mientras el programa se ejecuta, gpioinfo gpiochip0 muestra la línea 17 solicitada por 'blink' — y liberada al salir, por lo que no hay misterios de 'pin atascado en alto'.
Advertencia sobre bare-metal
La documentación oficial indica que la especificación de periféricos del BCM2835 'contiene una serie de errores': consulte la lista de erratas de la comunidad (elinux.org BCM2835 datasheet errata) antes de confiar en cualquier descripción de registro en trabajo de controladores o bare-metal.
Trampas comunes
- Mezclar libgpiod y gpiozero en una misma línea sin liberarla: la segunda solicitud falla con EBUSY.
- La numeración BCM otra vez: la línea 17 de libgpiod = pin físico 11, no el pin 17 (¡ese es 3.3 V!).
- 16 mA por pin / 50 mA en total siguen aplicándose en C.
Otros tutoriales para esta placa
- Premier démarrage de la Zero avec écran (mini-HDMI)
- Installation headless : la Zero en carte réseau USB (g_ether)
- Alimentation et consommation : le point faible de la Zero
- GPIO en Python : LED et bouton avec gpiozero
- Console série sur USB : la Zero en port série (CDC-ACM)
- Camera CSI sur Zero v1.3 : le nappe 22 broches
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash