树莓派使用libgpiod控制硬件

libgpiod是一个用于访问 Linux 内核 GPIO 子系统的 C 语言库,替代了旧的 sysfs 接口。它提供了命令行工具和 C API,也有 Python 绑定,主要用于GPIO的控制,也可以通过模拟输出控制一些低速接口设备,如模拟i2c接口控制i2c设备。

pigpio于2021年停止更新,wiringPi于2023年停止更新,目前,libgpiod (C/C++) 和 gpiozero (Python) 是替代品。
此处使用raspios-bookworm-arm64 (raspbian)在树莓派上进行libgpiod测试。

1. 安装环境

$ sudo apt update
$ sudo apt install build-essential python3 gpiod libgpiod-dev python3-libgpiod

2. 命令行工具

  • gpiodetect : 列出所有gpio芯片;
  • gpioinfo : 列出某个gpio芯片的所有行(pins);
  • gpioget : 读取gpio输入;
  • gpioset : 设置gpio输出;
  • gpiomon : 监听gpio事件;

使用示例(gpio3):

$ gpiodetect
$ gpioinfo gpiochip0
$ gpioget gpiochip0 3
$ gpioset gpiochip0 3=1
$ gpiomon gpiochip0 3

3. 树莓派引脚图

树莓派 3b, 3b+, 4b, 5的pinout布局一致,下面的pinout适合这些开发板:

4. C语言示例

blink.c, 使用gpio3:

/**
 * License - MIT.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gpiod.h>

#define GPIO_CHIP       "/dev/gpiochip0"
#define GPIO_LED        3

int main()
{
    int ret = 0;
    struct gpiod_chip *gpiochip;
    struct gpiod_line *gpioline;

    // Open driver.
    gpiochip = gpiod_chip_open(GPIO_CHIP);

    if (NULL == gpiochip) {
        printf("Error in gpiod_chip_open.\n");
        ret = -1;
        goto out1;
    }

    // Get gpio.
    gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED);

    if (NULL == gpioline) {
        printf("Error in gpiod_chip_get_line.\n");
        ret = -1;
        goto out2;
    }

    // Set gpio direction.
    ret = gpiod_line_request_output(gpioline, "gpio", 0);

    if (ret != 0) {
        printf("Error in gpiod_line_request_output.\n");
        ret = -1;
        goto out2;
    }

    // Blink.
    for (int i = 0; i < 10; i++) {
        printf("%d times.\n", i);

        gpiod_line_set_value(gpioline, 1);
        sleep(1);

        gpiod_line_set_value(gpioline, 0);
        sleep(1);
    }

    // Release.
    gpiod_line_release(gpioline);

out2:
    gpiod_chip_close(gpiochip);

out1:
    return ret;
}

编译和使用:

$ gcc blink.c -o blink -lgpiod
$ ./blink

在GPIO3(树莓派开发板上的5号引脚)接上LED,它会亮1秒,灭1秒,循环10次。

5. Python语言示例

blink.py,使用gpio3:

# License - MIT.
import time
import gpiod


GPIO_CHIP = 'gpiochip0'
LED_LINE  = 3

chip = gpiod.Chip(GPIO_CHIP)

led_line = chip.get_line(LED_LINE)
led_line.request(consumer = 'blink', type = gpiod.LINE_REQ_DIR_OUT, default_val = 0)

for i in range(10):
    print(f'{i} times.')

    led_line.set_value(1)
    time.sleep(1)
    led_line.set_value(0)
    time.sleep(1)

led_line.release()
chip.close()

使用:

$ python blink.py

在GPIO3(树莓派开发板上的5号引脚)接上LED,它会亮1秒,灭1秒,循环10次。

posted @ 2025-05-06 19:03  this毛豆  阅读(731)  评论(0)    收藏  举报