blink_c.c

Raspberry Pi Model B (Rev 1, 2012) — Board Sheet · File : blink_c.c · Language : C · Use case : Commander une LED en C natif (libgpiod) pour un service système réactif et sans interpréteur

C version with libgpiod: the program requests GPIO17 as output on gpiochip0, toggles it 20 times at 1 Hz, then releases everything cleanly. Great for Python-free systemd services and for learning the kernel gpiochip model. Verify the pin on the P1 schematic (26 pins).

Hardware

A Raspberry Pi Model B revision 1 (BCM2835, 26-pin GPIO header, original through-hole ports, no standard 40-pin P1 connector). One LED, 330-ohm resistor, gcc and libgpiod-dev on the board.

Wiring

LED + resistor between GPIO17 (pin 11) and GND; never 5 V into a GPIO line.

How it works

gpiod_chip_open_by_name opens the controller, gpiohandle_request_lines claims the line as output, gpiohandle_set_values writes the level; release hands the pin back.

Running it

Copy the script to the board (scp or USB stick), then run it with python3 (or bash). These boards often run an old Raspbian: gpiozero is still apt-installable. GPIO pins follow the 26-pin header in the official schematic.

Variants

Compile with -O2 for a daemon; gpiod_line_event_wait for event-driven C. The revision 1 board (256 MB) is modest: keep peripherals light and check the supply voltage.

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;
}

← Back to the board