blink_c.c

Raspberry Pi 5 (model-5) · Archivo : blink_c.c · Lenguaje : C · Uso : Commander une LED en C natif (libgpiod) pour un service système réactif et sans interpréteur

Version en C con libgpiod: el programa pide GPIO17 como salida en gpiochip0, la alterna 20 veces a 1 Hz y lo libera todo limpiamente. Util para servicios systemd sin Python y para el modelo gpiochip del kernel. Verifique el pin en el esquema J8 (40 pines).

Hardware

Una Raspberry Pi 5 (BCM2712 quad-core a 2,4 GHz, chip de E/S RP1, GPIO de 40 pines, alimentación USB-C de 5 V/5 A recomendada, dos puertos CSI de cámara). Un LED, resistencia de 330 ohmios, gcc y libgpiod-dev en la placa.

Cableado

LED + resistencia entre GPIO17 (pin 11) y GND; nunca 5 V a una linea GPIO.

Funcionamiento

gpiod_chip_open_by_name abre el controlador, gpiohandle_request_lines reclama la linea como salida, gpiohandle_set_values escribe el nivel; la liberacion devuelve el pin.

Ejecución

Copia el script en la placa (scp) y ejecútalo con python3. En Bookworm, gpiozero 2.x controla los pines mediante el chip RP1; mantén gpiozero y python3-rpi.gpio actualizados (sudo apt full-upgrade). Se recomienda fuente de 5 V/5 A.

Variantes

Compile con -O2 para un daemon; gpiod_line_event_wait para C orientado a eventos. Se recomienda una fuente de 27 W (5 V/5 A); sin ella, USB se limita a 600 mA en total.

blink_c.c

/* blink_c.c — clignotement LED en C avec libgpiod (API v1 gpiohandle). */
/* Deps: sudo apt install libgpiod-dev ; gcc blink_c.c -lgpiod -o blink_c */
#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    struct gpiod_chip *chip = gpiod_chip_open_by_name("gpiochip0");
    if (!chip) { perror("gpiochip0"); return 1; }
    struct gpiohandle_data data = { .values[0] = 0 };
    struct gpiohandle_request req = {
        .lineoffsets = { 17 },   /* GPIO17, broche 11 */
        .flags = GPIOHANDLE_REQUEST_OUTPUT,
        .lines = 1, .default_values = { 0 },
        .consumer_label = "blink-c",
    };
    if (gpiohandle_request_lines(gpiod_chip_get_line(chip, 17), &req))
        { perror("request"); return 1; }
    for (int i = 0; i < 20; i++) {
        data.values[0] = !data.values[0];
        gpiohandle_set_values(&req, &data);
        usleep(500000);
    }
    gpiohandle_release(&req); gpiod_chip_close(chip);
    return 0;
}

← Volver a la ficha