0

0

使用Go语言在树莓派上操作通用输入输出(GPIO)引脚

DDD

DDD

发布时间:2025-10-25 10:48:36

|

634人浏览过

|

来源于php中文网

原创

使用Go语言在树莓派上操作通用输入输出(GPIO)引脚

本教程旨在指导读者如何利用go语言在树莓派设备上进行通用输入输出(gpio)引脚的读写操作。我们将重点介绍`davecheney/gpio`及其针对树莓派优化的`rpi`子包,通过示例代码演示如何初始化引脚、设置方向以及进行高低电平控制,帮助开发者快速掌握go语言在嵌入式硬件交互中的应用。

引言:Go语言与GPIO交互

通用输入输出(GPIO)引脚是嵌入式系统(如树莓派)与外部世界交互的基础接口。通过GPIO,我们可以控制LED、读取按钮状态、驱动传感器等。Go语言凭借其简洁的语法、优秀的并发支持和高效的执行性能,正逐渐成为物联网(IoT)和嵌入式领域开发者的青睐。然而,对于初学者来说,如何在Go语言中直接操作硬件GPIO引脚的文档可能不那么显而易见。

本教程将详细介绍如何使用Go语言在树莓派上进行GPIO的读写操作,主要依赖于davecheney维护的gpio及其针对树莓派的rpi子包。

davecheney/gpio 包简介

davecheney/gpio 是一个Go语言包,它提供了一个用户空间接口来操作GPIO引脚。这意味着开发者无需编写内核模块,即可在用户程序中直接控制硬件引脚。该包的设计目标是提供一个通用的GPIO抽象层。

对于树莓派设备,davecheney/gpio 包提供了一个专门优化的子包:davecheney/gpio/rpi。这个子包针对树莓派的特定硬件特性进行了定制,确保了GPIO操作的兼容性和效率。

立即学习go语言免费学习笔记(深入)”;

安装与准备

在使用davecheney/gpio包之前,需要将其安装到您的Go工作区。请确保您的树莓派上已安装Go语言环境。

  1. 安装Go语言环境: 如果尚未安装,可以通过以下命令安装(以Debian/Raspbian为例):

    sudo apt update
    sudo apt install golang-go

    或者从Go官方网站下载最新版本并手动安装。

  2. 获取davecheney/gpio包: 使用go get命令获取主包及其树莓派子包。

    Flowise
    Flowise

    一款开源的低代码/无代码AI应用开发工具

    下载
    go get github.com/davecheney/gpio
    go get github.com/davecheney/gpio/rpi

    这将把包及其依赖下载到您的GOPATH或GOMODCACHE中。

基本操作示例:控制LED(输出)

以下是一个简单的Go程序,演示如何通过GPIO引脚控制一个LED灯的亮灭。我们将使用树莓派的GPIO引脚17(BCM编码)来连接LED。

package main

import (
    "fmt"
    "time"

    "github.com/davecheney/gpio"
    "github.com/davecheney/gpio/rpi" // 导入树莓派特定的GPIO实现
)

func main() {
    // 初始化GPIO引脚17作为输出
    // rpi.GPIO17 是树莓派的BCM GPIO 17号引脚
    pin, err := rpi.OpenPin(rpi.GPIO17, gpio.ModeOutput)
    if err != nil {
        fmt.Printf("Error opening pin: %v\n", err)
        return
    }
    defer pin.Close() // 确保程序退出时关闭引脚

    fmt.Println("Controlling LED on GPIO 17. Press Ctrl+C to exit.")

    for i := 0; i < 5; i++ {
        // 设置引脚为高电平 (LED亮)
        pin.Set()
        fmt.Println("LED ON")
        time.Sleep(500 * time.Millisecond) // 亮0.5秒

        // 设置引脚为低电平 (LED灭)
        pin.Clear()
        fmt.Println("LED OFF")
        time.Sleep(500 * time.Millisecond) // 灭0.5秒
    }

    fmt.Println("LED blinking finished.")
}

硬件连接:

  • 将LED的长引脚(阳极)通过一个220欧姆的限流电阻连接到树莓派的GPIO 17引脚。
  • 将LED的短引脚(阴极)连接到树莓派的任何一个GND(地)引脚。

运行程序: 由于GPIO操作通常需要root权限,您可能需要使用sudo运行编译后的程序或Go脚本:

sudo go run your_led_control.go

或者先编译再运行:

go build -o led_control your_led_control.go
sudo ./led_control

读取输入示例:检测按钮(输入)

接下来,我们将演示如何读取GPIO引脚的输入状态,例如检测一个按钮是否被按下。我们将使用GPIO引脚27(BCM编码)来连接按钮。

package main

import (
    "fmt"
    "time"

    "github.com/davecheney/gpio"
    "github.com/davecheney/gpio/rpi" // 导入树莓派特定的GPIO实现
)

func main() {
    // 初始化GPIO引脚27作为输入,并启用内部上拉电阻
    // rpi.GPIO27 是树莓派的BCM GPIO 27号引脚
    // gpio.PullUp 启用内部上拉电阻,使得按钮未按下时引脚为高电平
    pin, err := rpi.OpenPin(rpi.GPIO27, gpio.ModeInput)
    if err != nil {
        fmt.Printf("Error opening pin: %v\n", err)
        return
    }
    defer pin.Close() // 确保程序退出时关闭引脚

    // 启用内部上拉电阻
    pin.SetPull(gpio.PullUp)

    fmt.Println("Waiting for button press on GPIO 27. Press Ctrl+C to exit.")

    for {
        // 读取引脚状态
        state := pin.Read()

        if state == gpio.Low { // 按钮按下时,引脚被拉低
            fmt.Println("Button Pressed!")
            // 简单的去抖动
            time.Sleep(200 * time.Millisecond)
            for pin.Read() == gpio.Low { // 等待按钮释放
                time.Sleep(50 * time.Millisecond)
            }
            fmt.Println("Button Released.")
        }
        time.Sleep(50 * time.Millisecond) // 短暂延迟,避免CPU占用过高
    }
}

硬件连接:

  • 将一个按钮的一端连接到树莓派的GPIO 27引脚。
  • 将按钮的另一端连接到树莓派的任何一个GND(地)引脚。
  • 由于代码中使用了gpio.PullUp启用内部上拉电阻,当按钮未按下时,GPIO 27引脚将保持高电平。当按钮按下时,它会将GPIO 27引脚拉低到GND。

运行程序:

sudo go run your_button_read.go

注意事项

  1. 权限问题: 直接操作GPIO通常需要root权限。在生产环境中,可以考虑配置udev规则,允许特定用户或用户组访问GPIO设备文件,以避免直接使用sudo运行程序。
  2. 引脚编号: 树莓派的GPIO引脚有多种编号方案(如BCM编码、BOARD编码)。davecheney/gpio/rpi包默认使用BCM(Broadcom SOC channel)编号,这与树莓派官方文档和许多库的约定一致。请务必查阅您的树莓派型号的引脚图,确保使用正确的GPIO编号。
  3. 错误处理: 在实际应用中,务必对OpenPin、SetDirection、Read、Write等操作的返回值进行错误检查,以确保程序的健壮性。
  4. 资源释放: 使用defer pin.Close()是一个好习惯,它确保在程序退出时正确关闭GPIO引脚,释放系统资源。
  5. 去抖动(Debouncing): 对于机械按钮等输入设备,按下或释放时可能会产生短暂的电平抖动,导致多次触发。在读取输入时,通常需要实现软件去抖动机制(如上述示例中的短暂延迟和循环等待释放)。
  6. 并发性: Go语言的Goroutines和Channels非常适合处理多个GPIO事件或同时控制多个引脚。在更复杂的应用中,可以利用Go的并发特性来构建响应式和高效的GPIO控制逻辑。

总结

通过davecheney/gpio及其rpi子包,Go语言开发者可以方便、高效地在树莓派上进行GPIO的读写操作。本教程提供了从环境准备到实际代码示例的完整指南,涵盖了LED控制(输出)和按钮检测(输入)两种基本场景,并强调了开发过程中需要注意的关键事项。掌握这些基础知识,将为Go语言在物联网和嵌入式领域的进一步应用打下坚实的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1126

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

192

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1606

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

448

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

700

2023.10.26

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号