在树莓派4(Bullseye)上使用Golang操作GPIO的实践指南

在树莓派4(Bullseye)上使用Golang操作GPIO的实践指南 我似乎找不到一个合适的库(我已经尝试了好几个),但都无法安装并正常工作。有人有可用的简单示例吗?

2 回复

pkg.go.dev

rpio 包 - github.com/stianeikeland/go-rpio/v4 - Go Packages

rpio 包提供了在树莓派上访问 GPIO 的功能,无需任何外部 C 库(例如。

pkg.go.dev

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/v3periph.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)
    }
}

注意事项:

  1. 需要root权限运行:sudo go run main.go
  2. Bullseye系统默认启用新的GPIO驱动,periph.io库兼容性较好
  3. 引脚名称使用BCM编号(GPIOxx格式)
  4. 输入引脚支持上拉/下拉电阻配置

这个库在Bullseye上测试通过,提供了完整的GPIO、I2C、SPI等外设操作接口。

回到顶部