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

什么是 GPIO

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

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

简单的讲,每一个 GPIO 引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于一个电源,Raspberry Pi 可以控制这个电源是否向外供电,比如打开外部的 LED 小灯,当然最有用的还是向外部设备发送信号。输入模式相当于电源的阴极,还是以 LED 小灯为例,只不过这次 LED 小灯的阳极接着外部电源,一个电路只有产生电压差时才会有电流,因此要想让小灯亮需要让电流流入 Raspberry Pi 中。和输出模式相反,输入模式是接收外部设备发来的信号。

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

相关类(Class)

此处默认各位是面向对象的程序员,具有一定的 C# 基础,这里只介绍本人认为常用的方法,介绍将以代码注释的形式体现。

GPIO 操作主要依赖于两个类: GpioControllerGpioPin 。这两个类位于 System.Devices.Gpio 名称空间下。

GpioController

// GpioController 即 GPIO 控制器
// GPIO 引脚依靠 GpioController 初始化
public class GpioController : IDisposable
{
    // 构造函数
    /* PinNumberingScheme 即引脚编号方案,是一个枚举类型,包含 Board 和 Gpio 两个值。
     * 可以看上方的 Raspberry Pi 引脚图,以 GPIO 17 为例,如果实例化时选 Gpio ,那么打开引脚时需要填写 17。
     * 如果实例化时选 Board ,那么打开引脚时需要填写右侧灰色方框内的值,即 11 。
    */
    public GpioController(PinNumberingScheme numbering = PinNumberingScheme.Gpio);
    // 第二个构造函数中的 GpioDriver 应该是用于扩展的,一般还是用 Raspberry Pi 默认的 GPIO 驱动。
    public GpioController(GpioDriver driver, PinNumberingScheme numbering = PinNumberingScheme.Gpio);

    // 属性
    // 获取已打开的所有 GPIO 引脚
    public IEnumerable<GpioPin> OpenPins { get; }

    // 方法
    // 打开 GPIO 引脚,pinNumber 需要填写和 PinNumberingScheme 相对应的值。
    public GpioPin OpenPin(int pinNumber);
    // 关闭 GPIO 引脚
    public void ClosePin(int pinNumber);
    public void ClosePin(GpioPin pin);
    // 判断某个引脚是否打开
    // 注意:引脚连续打开会抛出异常
    public bool IsPinOpen(int pinNumber);
}

GpioPin

// GpioPin 表示单个的引脚实体
// 需要通过 GpioController.OpenPin() 获取
public class GpioPin : IDisposable
{
    // 属性
    // 一个去抖时间,即在此时间间隔引脚电平变化,不触发 ValueChanged 事件
    public TimeSpan DebounceTimeout { get; set; }

    // 事件
    // 引脚电平变化时触发
    public event EventHandler<PinValueChangedEventArgs> ValueChanged;

    // 方法
    // 读取当前引脚电平
    public PinValue Read();
    // 向引脚写入指定电平
    public void Write(PinValue value);
}

人体红外传感器实验

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

人体红外传感器是基于周围区域的红外热来检测运动的,也称被动红外传感器(Passive Infra-Red, PIR)。

这里使用的是 HC-SR501 。当传感器检测到人体时,LED 小灯亮,当传感器未检测到人体时,LED 小灯灭。

传感器图像

HC-SR501

硬件

名称 数量
HC-SR501 x1
LED 小灯 x1
220 Ω 电阻 x1
杜邦线 若干

电路

HC-SR501

  • VCC - 5V
  • GND - GND
  • OUT - GPIO 17

LED

  • VCC & 220 Ω resistor - GPIO 27
  • GND - GND

代码

  1. 打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“PIR”。
  2. 引入 System.Devices.Gpio NuGet 包。
  3. 新建类 HCSR501,替换如下代码(此处略有精简,只为必要的代码,不包含自定义事件,详细可查看提供的示例):
    public class HCSR501 : IDisposable
    {
        private GpioPin sensor;
        private readonly int pinOut;
    
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="pin">OUT Pin</param>
        public HCSR501(int pin)
        {
            pinOut = pin;
        }
    
        /// <summary>
        /// 初始化
        /// </summary>
        public void Initialize()
        {
            // 实例化 GpioController
            GpioController controller = new GpioController(PinNumberingScheme.Gpio);
            // 打开引脚,设置模式为输入模式
            sensor = controller.OpenPin(pinOut, PinMode.Input);
        }
    
        /// <summary>
        /// 读取
        /// </summary>
        /// <returns>是否检测到人体</returns>
        public bool Read()
        {
            // 当电平为高时,认为检测到人体
            if (sensor.Read() == PinValue.High)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
  4. Program.cs 中,将主函数代码替换如下:
    static void Main(string[] args)
    {
        // get the GPIO controller
        // 获取 GPIO 控制器
        GpioController controller = new GpioController(PinNumberingScheme.Gpio);
        // open PIN 27 for led
        // 为 led 打开引脚 27
        GpioPin led = controller.OpenPin(27, PinMode.Output);
    
        // initialize PIR sensor
        // 初始化传感器
        HCSR501 sensor = new HCSR501(17);
        sensor.Initialize();
    
        // loop
        // 循环
        while (true)
        {
            if (sensor.Read() == true)
            {
                // turn the led on when the sensor detected infrared heat
                // 当传感器检测到热量时打开 led
                led.Write(PinValue.High);
                Console.WriteLine("Detected! Turn the LED on.");
            }
            else
            {
                // turn the led off when the sensor undetected infrared heat
                // 当传感器未检测到热量时关闭 led
                led.Write(PinValue.Low);
                Console.WriteLine("Undetected! Turn the LED off.");
            }
    
            // wait for a second
            // 等待 1s
            Thread.Sleep(1000);
        }
    }
  5. 发布、拷贝、更改权限、运行

效果图

  如何改进?

剔除主函数循环,尝试在自定义事件中进行检测,即 GpioPin 的 ValueChanged 事件。


  备注

下一篇文章将谈谈 IIC 总线的使用。

原文地址:https://www.cnblogs.com/zhanggaoxing/p/10327917.html

时间: 2024-09-30 06:14:47

张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用的相关文章

Quartz.NET简介及入门指南

Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植. 入门指南 本入门指南包括以下内容: 下载 Quartz.NET 安装 Quartz.NET 根据你的特定项目配置 Quartz 启动一个样例程序 下载和安装 你可以下载 zip 文件或使用 Nuget 程序包.Nuget 程序包只包含 Quartz.NET 运

【翻译Autofac的帮助文档】1.入门指南

[写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规划你的应用程序 在你的Porject中添加Autofac引用 按照如下步骤设计应用程序的启动环节 创建一个ContainerBuilder 向ContainerBuilder注册组件 通过ContainerBuilder的Build()方法获得Container(后续需用到) 在应用程序运行环节时,

STM32F10X入门指南---AD转换

首先,点击下面的链接下载我们需要使用的代码.链接 1.添加必要的文件: 之前我们说过,有三个文件是必须添加的,这三个文件分别是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c.其中,前面的xd是根据你的芯片的容量来选择的.这三个文件都可以在千帆提供的代码中找到.文件路径:Core.rar\Core\STM32\Source\Must . 另外,如果想操作IO口,必须添加千帆的一个库文件DeviceBase.cpp.文件路径:

张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

原文:张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器 BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 包含 BH1750FVI 的传感器,这里选择的是淘宝上最多的 GY-30:Raspberry Pi 2/3 一块,环境为 Windows 10 IoT Core:公母头杜邦线 4-

Web API 入门指南 - 闲话安全

参考页面: http://www.yuanjiaocheng.net/Spring/first.html http://www.yuanjiaocheng.net/entity/modelbrowser.html http://www.yuanjiaocheng.net/entity/dbcontext.html http://www.yuanjiaocheng.net/mvc/first.html http://www.yuanjiaocheng.net/webapi/first.html W

Webpack 入门指南 - 3. Hello, Angular2!

Webpack 入门指南 - 1.安装 Webpack 入门指南 - 2.模块 这一次,我们使用 Webpack 来打包 Angular 2 的应用. 与官方的 Hello, Angular 2 项目相比,我们不使用 System.js,而是使用 TypeScript 直接编译,然后使用 Webpack 打包生成代码. 1. 下载 Angular 2 以及依赖包 修改我们的 package.json 文件,添加 Angular 2 涉及的包,和 Angular 2 所依赖的包,以后,我们可以慢慢

Core Data入门

Core Data入门 标签: Core DataiosiOSIOS数据存取数据库数据持久化 简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里

3D图形学理论入门指南(转)

原文地址:http://blog.sina.com.cn/s/blog_e7779a160102wpt1.html 3D图形学理论入门指南 介绍 当我还小的时候,我曾以为计算机图形学是最酷的玩意儿.但是随即我认识到,学习图形学--创建那些超级闪亮的计算机程序--比我想象的要难上许多.我四处出击,阅读OpenGL渲染管线详解之类的文章,浏览关于图形工作原理的博客.网站等,对照着教程学习,试图搞懂一切.结果呢,一无所获.当我按照NeHe的教程设置好一切,却因为错误的调用了某个glXXX()函数,导致

转 猫都能学会的Unity3D Shader入门指南(二)

猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果您在Shader开发上有所心得,很欢迎并恳请您指出文中纰漏,我会尽快改正.在之前的开篇中介绍了一些Shader的基本知识,包括ShaderLab的基本结构和语法,以及简单逐句地讲解了一个基本的shader.在具有这些基础知识后,阅读简单的sha