stm1024 发表于 2024-4-27 17:49:02

【树莓派5测评】 19.使用.net驱动的GPIO库

本帖最后由 stm1024 于 2024-4-27 19:51 编辑

上一篇提到了在树莓派下部署.net开发环境以及一个很基础的hello world程序,今天继续使用.net下提供的GPIO库,测试GPIO的输出和输入。

1. 创建项目
在树莓派5中安装好VSCode,然后打开一个文件夹,例如~/dnApp1,接下来在VSCode中打开终端,输入如下命令,创建一个dotnet的project:
dotnet new console可以创建一个基于Console的控制台程序,并且创建了项目文件,以及一个名为Program.cs的源文件,如下图所示:

如果使用如下命令,立马可以验证这个基本的hello world程序:
dotnet run

当然,这和我们今天操作GPIO几乎没有一毛钱关系,但是不急,至少说明环境和编译方法都是OK的。

2. 使用GPIO库输出
由于需要操作GPIO,因此我们需要添加相应的类库,这个方式在很多编程语言中都是类似的,只是语法会有点不同,.NET下操作GPIO的库是System.Device.Gpio,我们继续在VSCode的命令行中输入如下命令,添加该库:
dotnet add package System.Device.Gpio
或者你想要指定特定版本的库时,使用--version选项:
dotnet add package System.Device.Gpio --version 2.2.0-*注意这个操作需要联网,运行后效果如下:

首先是硬线的连接,我们将GPIO18口接上LED的正极,而LED的负极接地,如下图所示:


修改Program.cs源码内容如下:
using System;
using System.Device.Gpio;
using System.Threading;

Console.WriteLine("GPIO output Test.");
int pin = 18;
GpioController controller = new GpioController();
controller.OpenPin(pin, PinMode.Output);
bool ledOn = true;
while (true)
{
    if (ledOn)
    {
      controller.Write(pin, PinValue.Low);
      Console.WriteLine("LED OFF");
    }
    else
    {
      controller.Write(pin, PinValue.High);
      Console.WriteLine("LED ON");
    }
    Thread.Sleep(1000);
    ledOn = !ledOn;
}
然后编译运行,效果如下:

LED正常闪烁,而且终端中输出正确的状态,测试两次的效果是,在LED熄灭和点亮的情况下,按Ctrl+C结束程序时,GPIO状态不会恢复到缺省状态,而是保持最后的状态。

3. 使用GPIO库输入
GPIO库的输入使用的库完全一样,但是配置上不相同,保持原来的GPIO点亮LED线束不变,增加的线束连接及代码如下:

即使用GPIO 21口,让它与地之间短接。程序修改如下:
using System;
using System.Device.Gpio;
using System.Threading.Tasks;

Console.WriteLine("GPIO input/output Test.");
int pinLed = 18;
int pinBtn = 21;
GpioController controller = new GpioController();
controller.OpenPin(pinLed, PinMode.Output);
controller.OpenPin(pinBtn, PinMode.InputPullUp);

controller.RegisterCallbackForPinValueChangedEvent(pinBtn,PinEventTypes.Falling | PinEventTypes.Rising,OnPinBtnEvent);

await Task.Delay(Timeout.Infinite);

void OnPinBtnEvent(object sender, PinValueChangedEventArgs args)
{   
    if(args.ChangeType is PinEventTypes.Falling)
    {
      controller.Write(pinLed, PinValue.High);
      Console.WriteLine(DateTime.Now+" LED ON");
    }
    else if(args.ChangeType is PinEventTypes.Rising)
    {
      controller.Write(pinLed, PinValue.Low);
      Console.WriteLine(DateTime.Now+" LED OFF");
    }
}程序的目的是GPIO 21接地,则LED点亮,而GPIO与地脱开,则LED熄灭,运行效果如下:


OK,今天的测试就到这里。


页: [1]
查看完整版本: 【树莓派5测评】 19.使用.net驱动的GPIO库

Baidu
map