回答

收藏

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

#板卡评测 #板卡评测 1515 人阅读 | 0 人回复 | 2024-04-27

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

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

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

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


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

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

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


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

  4. Console.WriteLine("GPIO output Test.");
  5. int pin = 18;
  6. GpioController controller = new GpioController();
  7. controller.OpenPin(pin, PinMode.Output);
  8. bool ledOn = true;
  9. while (true)
  10. {
  11.     if (ledOn)
  12.     {
  13.         controller.Write(pin, PinValue.Low);
  14.         Console.WriteLine("LED OFF");
  15.     }
  16.     else
  17.     {
  18.         controller.Write(pin, PinValue.High);
  19.         Console.WriteLine("LED ON");
  20.     }
  21.     Thread.Sleep(1000);
  22.     ledOn = !ledOn;
  23. }
复制代码
然后编译运行,效果如下:

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

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

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

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

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

  11. await Task.Delay(Timeout.Infinite);

  12. void OnPinBtnEvent(object sender, PinValueChangedEventArgs args)
  13. {     
  14.     if(args.ChangeType is PinEventTypes.Falling)
  15.     {
  16.         controller.Write(pinLed, PinValue.High);
  17.         Console.WriteLine(DateTime.Now+" LED ON");
  18.     }
  19.     else if(args.ChangeType is PinEventTypes.Rising)
  20.     {
  21.         controller.Write(pinLed, PinValue.Low);
  22.         Console.WriteLine(DateTime.Now+" LED OFF");
  23.     }
  24. }
复制代码
程序的目的是GPIO 21接地,则LED点亮,而GPIO与地脱开,则LED熄灭,运行效果如下:


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


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条