当前位置:

首页 > 硬件相关 > 张高兴 .NET IoT 教程:GPIO 使用详解

张高兴 .NET IoT 教程:GPIO 使用详解

什么是GPIOGPIO是GeneralPurposeInputOutput的缩写,即“通用输入输出”。RaspberryPi有两列GPIO引脚,RaspberryPi通过这两行引脚进行一些硬件上的扩展,与传感器进行交互等等。RaspberryPiB+/2B/3B/3B+/Zero引脚图简单的讲,每一个GPIO引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于一个电源,RaspberryPi可以控制这个电源是否向外供电,比如打开外部的

什么是 GPIO

GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。Raspberry Pi 有两列 GPIO 引脚, Raspberry Pi 通过这两行引脚进行一些硬件上的扩展,与传感器进行交互等等。

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

Raspberry Pi B+/2B/3B/3B+/Zero 引脚图

简单的讲,每一个 GPIO 引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于一个电源,Raspberry Pi 可以控制这个电源是否向外供电,比如打开外部的 LED 小灯,当然最有用的还是向外部设备发送信号。和输出模式相反,输入模式是接收外部设备发来的信号。其中还包含两种特殊的输入模式:上拉输入(INPUT_PULLUP)和下拉输入(INPUT_PULLDOWN)。上拉输入就是内部的上拉电阻接 VCC ,将该引脚设置为高电平,下拉输入则相反。

GPIO 通常采用标准逻辑电平,即高电平和低电平,用二进制 0 和 1 表示。在这两值中间还有阈值电平,即高电平和低电平之间的界限。Arduino 会将 -0.5 ~ 1.5 V 读取为低电平,3 ~ 5.5 V 读取为高电平, Raspberry Pi 未查到相关资料。GPIO 还可用于中断请求,即设置 GPIO 为输入模式,值达到相应的要求时进行中断。

相关类

GPIO 操作主要依赖于 GpioController 类 。这个类位于 System.Device.Gpio 名称空间下。

GpioController代码语言:javascript代码运行次数:0运行复制
// GpioController 即 GPIO 控制器// GPIO 引脚依靠 GpioController 初始化public class GpioController : IGpioController, IDisposable{    // 构造函数    public GpioController();    // PinNumberingScheme 即引脚编号方案,是一个枚举类型,包含 Board 和 Logical 两个值。    // 可以看上方的 Raspberry Pi 引脚图,以 GPIO 17 为例,如果实例化时选 Logical ,那么打开引脚时需要填写 17。    // 如果实例化时选 Board ,那么打开引脚时需要填写右侧灰色方框内的值,即 11 。    public GpioController(PinNumberingScheme numbering);    // GpioDriver 用于指定要使用的 GPIO 驱动,比如 libgpiod 或 sysfs    public GpioController(PinNumberingScheme numberingScheme, GpioDriver driver);    // 方法    // 打开 GPIO 引脚    // pinNumber 需要填写和 PinNumberingScheme 相对应的值。    // PinMode 是设置 GPIO 的模式,如输入、输出、上拉、下拉    public void OpenPin(int pinNumber, PinMode mode);    // 关闭 GPIO 引脚    public void ClosePin(int pinNumber);    // 判断某个引脚是否打开    // 注意:引脚连续打开会抛出异常    public bool IsPinOpen(int pinNumber);     // 读取指定引脚的值    public PinValue Read(int pinNumber);    // 向指定的引脚写入值    public void Write(int pinNumber, PinValue value);    // 为指定引脚的值改变时注册回调(即上文中提到的 GPIO 中断)    // PinEventTypes 是值改变的类型,包括上升沿(Rising,0->1)和下降沿(Falling,1->0),注意当设置为 None 时不会触发    // PinChangeEventHandler 为回调事件    public void RegisterCallbackForPinValueChangedEvent(int pinNumber, PinEventTypes eventTypes, PinChangeEventHandler callback);    // 为指定引脚的值改变时注销回调    public void UnregisterCallbackForPinValueChangedEvent(int pinNumber, PinChangeEventHandler callback);}

人体红外传感器实验

人体红外传感器是基于周围区域的红外热来检测运动的,也称被动红外传感器(Passive Infra-Red, PIR)。这里使用的是 HC-SR501 。当传感器检测到人体时,LED 小灯亮,当传感器未检测到人体时,LED 小灯灭。

传感器图像
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

HC-SR501

硬件需求

名称

数量

HC-SR501

x1

LED 小灯

x1

220 Ω 电阻

x1

杜邦线

若干

电路

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

HC-SR501

VCC - 5VGND - GNDOUT - GPIO 17 (Pin 11)

LED

VCC & 220 Ω resistor - GPIO 27 (Pin 14)GND - GND

使用 Docker 运行示例

示例地址:https://github.com/ZhangGaoxing/dotnet-core-iot-demo/tree/master/src/Hcsr501

代码语言:javascript代码运行次数:0运行复制
docker build -t pir-sample -f Dockerfile .docker run --rm -it --device /dev/gpiomem pir-sample

代码

打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“PIR”。

引入 System.Device.Gpio NuGet 包。

新建类 Hcsr501,替换如下代码:

代码语言:javascript代码运行次数:0运行复制
public class Hcsr501 : IDisposable{    private GpioController _controller;    private readonly int _outPin;    ///     /// 构造函数    ///     /// OUT Pin    public HCSR501(int outPin, PinNumberingScheme pinNumberingScheme = PinNumberingScheme.Logical)    {        _outPin = outPin;        _controller = new GpioController(pinNumberingScheme);        _controller.OpenPin(outPin, PinMode.Input);    }    ///     /// 是否检测到人体    ///     public bool IsMotionDetected => _controller.Read(_outPin) == PinValue.High;    ///     /// Cleanup    ///     public void Dispose()    {        _controller?.Dispose();        _controller = null;    }}

在 Program.cs 中,将主函数代码替换如下:

代码语言:javascript代码运行次数:0运行复制
static void Main(string[] args){    // HC-SR501 OUT Pin    int hcsr501Pin = 17;    // LED Pin    int ledPin = 27;    // 获取 GPIO 控制器    using GpioController ledController = new GpioController(PinNumberingScheme.Logical);    // 初始化 PIR 传感器    using Hcsr501 sensor = new Hcsr501(hcsr501Pin, PinNumberingScheme.Logical);    // 打开 LED 引脚    ledController.OpenPin(ledPin, PinMode.Output);    while (true)    {        // 检测到了人体        if (sensor.IsMotionDetected == true)        {            ledController.Write(ledPin, PinValue.High);            Console.WriteLine("Detected! Turn the LED on.");        }        else        {            ledController.Write(ledPin, PinValue.Low);            Console.WriteLine("Undetected! Turn the LED off.");        }        Thread.Sleep(1000);    }}

发布、拷贝、更改权限、运行

效果图

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

? 如何改进?

剔除主函数循环,尝试使用 RegisterCallbackForPinValueChangedEvent() 注册一个回调进行检测。

参考General-purpose input/output - Wikipedia:https://en.wikipedia.org/wiki/General-purpose_input/outputGPIO - Raspberry Pi Documentation:https://www.raspberrypi.org/documentation/usage/gpio/GPIO source code:https://github.com/dotnet/iot/tree/master/src/System.Device.Gpio/System/Device/Gpio
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
硬件相关
相关文章 更多
C语言操作GPIO口方法详解
C语言操作GPIO口方法详解

C语言操作GPIO口的核心在于直接读写特定内存地址以控制硬件。1.通过芯片手册找到对应GPIO寄存器地址,如输出使能寄存器0x40021000和数据寄存器0x40021004;2.使用指针操作这些地址,结合volatile关键字确保编译器不优化访问;3.除直接操作寄存器外,可使用HAL库简化开发,例如STM32的HAL_GPIO_WritePin()函数;4.GPIO模式配置需通过专用寄存器设置,如使用STM32的GPIO_InitTypeDef结构体与HAL_GPIO_Init()函数完成;5.处理GP

CH579M开发指南:以太网例程及网络指示灯GPIO设置
CH579M开发指南:以太网例程及网络指示灯GPIO设置

本节作为以太网初始化的例程,是后续所有章节的基础。所有后续的操作都依赖于这部分的初始化步骤。以下是详细的测试和程序说明。测试步骤下载工程到开发板并连接网络设备:将本节的工程下载到开发板,并使用网线连接到路由器或交换机。查看串口日志:连接网线时,串口会打印数字2;断开网线时,串口会打印数字1。程序说明初始化部分独立提取:我将初始化部分单独提取出来,便于理解和使用。初始化代码来源:整个初始化代码直接采用了官方的代码。以太网轮询调用:以太网需要在定时器中断中轮询调用一个函数。CH57xNETTIMEP

在Linux平台上控制GPIO的指南
在Linux平台上控制GPIO的指南

在Linux系统中,有多种方法可以控制GPIO引脚,包括使用Sysfs接口、GPIO库、设备树以及直接访问寄存器。通过/sys/class/gpio目录下的文件,可以方便地访问和控制GPIO引脚。开源的GPIO库简化了GPIO的控制流程,使得在Linux系统上编程控制GPIO更加便捷。编辑设备树文件可以定义GPIO的属性和功能,并在系统启动时加载设备树,从而实现对GPIO的控制。这些方法为开发者提供了灵活且高效的方式来管理和操作GPIO引脚。Linux下,可以使用以下几种方法来控制GPIO(通用输入输出)

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。