问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

将 GPIO 用于二进制输入

创作时间:
作者:
@小白创作中心

将 GPIO 用于二进制输入

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/dotnet/iot/tutorials/gpio-input

本教程将介绍如何使用.NET和Raspberry Pi的GPIO引脚进行二进制输入检测。通过本教程,你将学习如何使用GPIO引脚检测线路的断开和闭合状态,以及如何将其应用于实际项目中。

本文内容

通用I/O (GPIO) 引脚可配置为接收电信号作为输入。从根本上,这对于检测线路断开/闭合很有用。此类线路可能包括下压按钮、拨动开关、簧片开关、压力开关和其他通过接通线路来表示二进制(开/关)值的设备。

在本教程中,你将使用 .NET 和 Raspberry Pi 的 GPIO 引脚来检测线路的断开和闭合。

先决条件

  • 基于 ARM(ARMv7 或更高版本)的单板计算机 (SBC)
  • 跳线
  • 线路板(可选)
  • Raspberry Pi GPIO 分线板(可选)
  • .NET SDK7 或更高版本

注意:本教程编写时假设目标设备是 Raspberry Pi。但是,本教程可用于支持 .NET 的任何基于 Linux 的 SBC,例如 Orange Pi、ODROID 等。

确保已在设备上启用 SSH。对于 Raspberry Pi,请参阅 Raspberry Pi 文档中的“设置 SSH 服务器”。

准备硬件

使用硬件组件构建电路,如下图所示:

上图显示了接地引脚与引脚 21 之间的直接连接。

提示:出于说明目的,该图显示了线路板和 GPIO 分线,你可以随意将接地引脚和引脚 21 与 Raspberry Pi 上的跳线连接起来。

根据需要,请参阅以下引脚分配关系图:

图片由 Raspberry Pi 基金会提供。

创建应用

在首选开发环境中完成以下步骤:

  1. 使用.NET CLI或Visual Studio创建一个新 .Net 控制台应用。 将其命名为 InputTutorial。
dotnet new console -o InputTutorial
cd InputTutorial
  1. 将System.Device.Gpio包添加到项目中。 使用项目目录或Visual Studio中的任一.NET CLI。
dotnet add package System.Device.Gpio --version 2.2.0-*
  1. 将 Program.cs 的内容替换为以下代码:
using System.Device.Gpio;
using System.Threading.Tasks;

const int Pin = 21;
const string Alert = "ALERT 🚨";
const string Ready = "READY ✅";

using var controller = new GpioController();
controller.OpenPin(Pin, PinMode.InputPullUp);

Console.WriteLine(
    $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}");

controller.RegisterCallbackForPinValueChangedEvent(
    Pin,
    PinEventTypes.Falling | PinEventTypes.Rising,
    OnPinEvent);

await Task.Delay(Timeout.Infinite);

static void OnPinEvent(object sender, PinValueChangedEventArgs args)
{     
    Console.WriteLine(
        $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}");
}

在上述代码中:

  • using 声明创建 GpioController 实例。 using 声明可确保对象已处置,硬件资源已正确释放。
  • GpioController 不使用任何参数进行实例化,这表明它应检测它在哪个硬件平台上运行,并表明它应使用逻辑引脚编号方案。
  • 通过 PinMode.InputPullUp 打开 GPIO 引脚 21。
  • 这会打开引脚,同时接入 PullUp 电阻器。 在这种模式下,引脚接地时,它会返回 PinValue.Low。 引脚断开接地且线路开路时,引脚会返回 PinValue.High
  • 使用三元表达式将初始状态写入控制台。 使用 Read() 读取引脚的当前状态。 如果是 PinValue.High,它会将 Alert 字符串写入控制台。 否则,它会写入 Ready 字符串。
  • RegisterCallbackForPinValueChangedEvent() 为引脚上的 PinEventTypes.RisingPinEventTypes.Falling 事件注册回叫函数。 这些事件分别对应于引脚状态 PinValue.HighPinValue.Low
  • 回叫函数指向名为 OnPinEvent() 的方法。 OnPinEvent() 使用另一个三元表达式,该表达式也会写入相应的 AlertReady 字符串。
  • 主线程在等待引脚事件时无限期休眠。
  1. 构建应用程序。 如果使用的是 .NET CLI,请运行 dotnet build。 若要在 Visual Studio 中进行生成,请按Ctrl+Shift+B。

  2. 将该应用作为独立应用部署到 SBC。 有关说明,请参阅将 .NET 应用部署到 Raspberry Pi。 请确保使用 chmod +x 指定可执行的 execute 权限。

  3. 通过切换到部署目录并运行可执行文件,在 Raspberry Pi 上运行该应用。

./InputTutorial

控制台显示文本类似于以下内容:

Initial status (05/10/2022 15:59:25): READY ✅
  1. 断开引脚 21 与地的连接。 控制台显示文本类似于以下内容:
(05/10/2022 15:59:59) ALERT 🚨
  1. 重新建立引脚 21 与地的连接。 控制台显示文本类似于以下内容:
(05/10/2022 16:00:25) READY ✅
  1. 按Ctrl+C终止程序。

恭喜! 你已通过 GPIO 使用 System.Device.Gpio NuGet 包检测输入! 此类型的输入有很多种用途。 此示例适用于开关连接或断开线路的所有方案。 在下例中,将其与磁簧开关结合使用,后者常用于检测打开的门或窗。

激光绊线

进一步扩展上述示例概念,了解如何使用它来创建激光绊线。 生成激光绊线需要以下附加组件:

  • KY-008 激光发射器模块
  • 激光接收器传感器模块(见下方注释)
  • 2 个 10K Ω 电阻器

注意:激光接收器传感器模块是许多 Internet 零售商的通用模块的通用名称。 该设备的名称或制造商可能会有所不同,但应与此图类似。

连接激光绊线硬件

连接这些组件,详见下图。

密切注意 10K Ω 电阻器。 它们可实现分压器。 这是因为激光接收器模块输出 5V 来表示光束受损。 Raspberry Pi 仅支持最高 3.3V 的 GPIO 输入。 由于向引脚发送完整的 5V 电压可能会损坏 Raspberry Pi,因此接收器模块的电流会经分压器将电压减半至 2.5V 来进行传输。

应用源代码更新

几乎可以使用之前的代码,但有一个例外。 在其他示例中,我们使用了 PinMode.InputPullUp,因此引脚与地的连接断开且线路开路时,引脚返回 PinValue.High

但对于激光接收器模块,我们没有检测到线路开路。 相反,我们希望将该引脚用作接收器,以接收激光接收器模块的电流。 在这种情况下,我们将使用 PinMode.InputPullDown 打开引脚。 通过这种方式,引脚在未接收到电流时返回 PinValue.Low,接收到激光接收器模块的电流时返回 PinValue.High

controller.OpenPin(pin, PinMode.InputPullDown);

重要:测试激光绊线之前,确保 Raspberry Pi 上部署的代码包含此更改。 即使没有该代码,程序也可以正常运行,但使用错误的输入模式可能会损坏 Raspberry Pi!

获取源代码

GitHub上提供此教程的源。

后续步骤

了解如何从传感器读取环境条件

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号