blink_c.c

Raspberry Pi Model B (Rev 1, 2012) — Fiche carte · Fichier : blink_c.c · Langage : C · Usage : Commander une LED en C natif (libgpiod) pour un service système réactif et sans interpréteur

Version C avec libgpiod : le programme demande la ligne GPIO17 en sortie (gpiochip0), la bascule 20 fois à 1 Hz puis libère tout proprement. Utile en service systemd sans Python, et pédagogique sur le modèle gpiochip du noyau. Broche à vérifier sur le schéma P1 (26 broches).

Matériel requis

Une Raspberry Pi Model B révision 1 (BCM2835, connecteur GPIO 26 broches, ports traversants d'origine, pas de connecteur P1 standard 40 broches). Une LED, résistance 330 ohms, gcc et libgpiod-dev sur la carte.

Câblage

LED + résistance entre GPIO17 (broche 11) et GND ; pas de 5 V sur une ligne GPIO.

Fonctionnement

gpiod_chip_open_by_name ouvre le contrôleur, gpiohandle_request_lines réclame la ligne en sortie, gpiohandle_set_values écrit le niveau ; la libération rend la broche au système.

Exécution

Copiez le script sur la carte (scp ou clé USB), puis lancez-le avec python3 (ou bash). Ces cartes tournent souvent sous une ancienne Raspbian : gpiozero reste installable par apt. Les broches GPIO suivent le connecteur 26 broches du schéma officiel.

Variantes

Compilateur + -O2 pour un daemon ; gpiod_line_event_wait pour du C événementiel. Révision 1 très modeste (256 Mo) : restez léger côté périphériques et vérifiez la tension d'alimentation.

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

← Retour à la fiche