querdenker engineering
Schnittstellen und Services

Digitale IOs

Digitale Eingänge und Ausgänge mit libgpiod aus C und Python verwenden.

Last updated: September 16, 2026

Digitale IOs werden über /dev/gpiochip* und libgpiod angesprochen. Die GPIO-sysfs-Schnittstelle wird dafür nicht verwendet.

Voraussetzungen

  • Der GPIO-Controller ist im Device Tree aktiviert.
  • Der passende Geräteknoten /dev/gpiochipX ist vorhanden.
  • GPIO-Chip, Line-Name oder Line-Offset sind für das System dokumentiert.
  • Das Programm besitzt die erforderlichen Zugriffsrechte.

Für die Beispiele sind außerdem folgende Versionen festzulegen:

  • libgpiod: [LIBGPIOD-VERSION]
  • Python-Bindings gpiod: [PYTHON-GPIOD-VERSION]
  • C-Compiler/Linker: [C-TOOLCHAIN-VERSION]
gpiodetect
gpioinfo gpiochip0
gpiofind "[LINE-NAME]"

Verwende bevorzugt einen Line-Namen. gpiofind löst den Namen in den zugehörigen GPIO-Chip und Offset auf. Das Ergebnis kann direkt an gpioget, gpioset oder gpiomon übergeben werden. Die Nummer von gpiochipX ist nicht fest und darf nicht aus dem Device-Tree-Controller abgeleitet werden.

GPIO-Leitungen über die Kommandozeile verwenden

Die folgenden Beispiele verwenden die libgpiod-1.x-Syntax. Der Platzhalter [LINE-NAME] wird durch den gewünschten Line-Namen ersetzt.

Wert lesen

gpioget $(gpiofind "[LINE-NAME]")

Die Option --active-low liest die logischen statt der elektrischen Zustände, wenn das für die Anwendung erforderlich ist.

Wert setzen

gpioset --mode=wait $(gpiofind "[LINE-NAME]")=1

--mode=wait hält die Leitung gesetzt, bis im Terminal die Eingabetaste gedrückt wird. Für einen zeitlich begrenzten Zugriff kann beispielsweise --mode=time --sec=1 verwendet werden. Ohne einen Modus wie wait, time oder signal endet gpioset unmittelbar; beim Ende des Prozesses wird die Leitung wieder freigegeben und ihr Zustand ist danach nicht garantiert.

Die Option --active-low kann auch bei gpioset verwendet werden, wenn die Anwendung mit logischen Aktivzuständen arbeiten soll. Ein n oder _N im Line-Namen setzt diese Option nicht automatisch.

Flanken beobachten

gpiomon --rising-edge $(gpiofind "[LINE-NAME]")

Mit --falling-edge wird ausschließlich die fallende Flanke gewählt. Ohne Flankenfilter werden beide Flanken verarbeitet. Vor dem Zugriff sind mit gpioinfo die Richtung, der Active-State und die Belegung durch Kernel-Treiber oder Systemdienste zu prüfen.

Ausgang schalten

Beim Request wird die Leitung exklusiv reserviert. Nach dem Ende des Requests gibt die Anwendung die Leitung wieder frei.

#include <gpiod.h>

int main(void)
{
    const unsigned int offset = [GPIO-OFFSET];
    struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0");
    struct gpiod_line_settings *settings = gpiod_line_settings_new();
    struct gpiod_line_config *line_config = gpiod_line_config_new();
    struct gpiod_request_config *request_config = gpiod_request_config_new();
    struct gpiod_line_request *request;
    int result = 1;

    if (!chip || !settings || !line_config || !request_config) {
        goto cleanup;
    }

    gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT);
    gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_INACTIVE);
    if (gpiod_line_config_add_line_settings(line_config, &offset, 1U, settings) < 0) {
        goto cleanup;
    }

    gpiod_request_config_set_consumer(request_config, "[PROGRAMMNAME]");
    request = gpiod_chip_request_lines(chip, request_config, line_config);
    if (!request) {
        goto cleanup;
    }

    result = gpiod_line_request_set_value(
        request, offset, GPIOD_LINE_VALUE_ACTIVE);
    gpiod_line_request_release(request);

cleanup:
    gpiod_request_config_free(request_config);
    gpiod_line_config_free(line_config);
    gpiod_line_settings_free(settings);
    gpiod_chip_close(chip);
    return result < 0 ? 1 : 0;
}

Eingang lesen

Ein Eingang wird ebenfalls exklusiv angefordert. Für Flankenerkennung werden zusätzlich RISING, FALLING oder BOTH als Edge-Detection konfiguriert.

/* Die Initialisierung entspricht dem Ausgangsbeispiel. */
gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT);
gpiod_line_config_add_line_settings(line_config, &offset, 1U, settings);

struct gpiod_line_request *request =
    gpiod_chip_request_lines(chip, request_config, line_config);
if (!request) {
    return 1;
}

const enum gpiod_line_value value =
    gpiod_line_request_get_value(request, offset);
gpiod_line_request_release(request);

Elektrische Eigenschaften

Active-Low, Pull-up/Pull-down, Open-Drain, Debounce und Flankenerkennung werden als LineSettings konfiguriert. Diese Werte müssen zur elektrischen Beschaltung passen und dürfen nicht aus einem Beispiel übernommen werden.

[PLATZHALTER: GPIO-Chips, Line-Namen, Offsets, Pegel, Pull-Widerstände, freigegebene Eingangs-/Ausgangsmodi und libgpiod-Paketnamen]