blink_c.c
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 P1 (26 pines).
Hardware
Una Raspberry Pi Model A (BCM2835, conector GPIO de 26 pines, un solo puerto USB en modo OTG, sin Ethernet: prevé un hub USB alimentado). 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 o memoria USB) y ejecútalo con python3 (o bash). En Raspbian antiguo, gpiozero se instala con sudo apt install python3-gpiozero. Alimenta la placa con 5 V/700 mA mínimo por el puerto OTG.
Variantes
Compile con -O2 para un daemon; gpiod_line_event_wait para C orientado a eventos. Alimente por el puerto OTG con 5 V/700 mA como mínimo; evite periféricos USB exigentes.
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;
}