在树莓派4(Bullseye)上使用Golang操作GPIO的实践指南
在树莓派4(Bullseye)上使用Golang操作GPIO的实践指南 我似乎找不到一个合适的库(我已经尝试了好几个),但都无法安装并正常工作。有人有可用的简单示例吗?
2 回复
rpio 包 - github.com/stianeikeland/go-rpio/v4 - Go Packages
rpio 包提供了在树莓派上访问 GPIO 的功能,无需任何外部 C 库(例如。
gpio 包 - github.com/warthog618/gpio - Go Packages
gpio 包提供了在树莓派(rev 2 及后续版本)上访问 GPIO 的功能。
然而,要使程序正常工作,您的可执行文件可能需要 root 权限。
更多关于在树莓派4(Bullseye)上使用Golang操作GPIO的实践指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在树莓派4 Bullseye系统上操作GPIO,推荐使用periph.io/x/host/v3和periph.io/x/conn/v3库。以下是完整的实践示例:
package main
import (
"fmt"
"log"
"time"
"periph.io/x/conn/v3/gpio"
"periph.io/x/conn/v3/gpio/gpioreg"
"periph.io/x/host/v3"
)
func main() {
// 初始化主机驱动
if _, err := host.Init(); err != nil {
log.Fatal(err)
}
// 获取GPIO4引脚(物理引脚7)
pin := gpioreg.ByName("GPIO4")
if pin == nil {
log.Fatal("无法找到GPIO4引脚")
}
// 设置为输出模式
if err := pin.Out(gpio.Low); err != nil {
log.Fatal(err)
}
// 闪烁LED示例
for i := 0; i < 5; i++ {
fmt.Println("LED亮")
pin.Out(gpio.High)
time.Sleep(500 * time.Millisecond)
fmt.Println("LED灭")
pin.Out(gpio.Low)
time.Sleep(500 * time.Millisecond)
}
// 读取输入引脚示例
inputPin := gpioreg.ByName("GPIO17")
if inputPin != nil {
if err := inputPin.In(gpio.PullUp, gpio.BothEdges); err != nil {
log.Fatal(err)
}
// 等待按钮按下
fmt.Println("等待按钮按下...")
inputPin.WaitForEdge(-1)
fmt.Println("检测到边缘触发")
}
}
安装步骤:
# 设置Go模块
go mod init gpio_example
# 安装依赖
go get periph.io/x/host/v3
go get periph.io/x/conn/v3
# 构建并运行(需要root权限)
sudo go run main.go
引脚映射示例:
// 常用引脚映射(BCM编号)
var pinMap = map[string]string{
"GPIO2": "物理引脚3",
"GPIO3": "物理引脚5",
"GPIO4": "物理引脚7",
"GPIO17": "物理引脚11",
"GPIO27": "物理引脚13",
"GPIO22": "物理引脚15",
// 更多引脚...
}
// PWM示例
func pwmExample() {
pin := gpioreg.ByName("GPIO18")
if pin == nil {
return
}
// 简单软件PWM
for i := 0; i < 100; i++ {
pin.Out(gpio.High)
time.Sleep(time.Duration(i) * time.Microsecond)
pin.Out(gpio.Low)
time.Sleep(time.Duration(100-i) * time.Microsecond)
}
}
注意事项:
- 需要root权限运行:
sudo go run main.go - Bullseye系统默认启用新的GPIO驱动,periph.io库兼容性较好
- 引脚名称使用BCM编号(GPIOxx格式)
- 输入引脚支持上拉/下拉电阻配置
这个库在Bullseye上测试通过,提供了完整的GPIO、I2C、SPI等外设操作接口。

