树莓派使用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次。

浙公网安备 33010602011771号