blink_c.c

Raspberry Pi Model B Revision 2 (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 2 (BCM2835, 26-pin GPIO header, Ethernet/USB ports moved to the board edge). 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). On Raspbian, install gpiozero with sudo apt install python3-gpiozero. The full 26-pin pinout is in the official Raspberry Pi schematic.

Variants

Compile with -O2 for a daemon; gpiod_line_event_wait for event-driven C. Revision 2: a clean 5 V supply is required; brown-outs distort sensor readings.

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