[评测分享]
【树莓派5测评】 19.使用.net驱动的GPIO库
#板卡评测
 
1514 人阅读
|
0 人回复
|
2024-04-27 
 
 
 
 
TA的每日心情  | 慵懒 2025-8-6 21:07 | 
|---|
 
  签到天数: 313 天 连续签到: 1 天 [LV.8]以坛为家I 
状元 
 
 
	- 积分
 - 5300
 
 
 
 
 | 
 
 
 本帖最后由 stm1024 于 2024-4-27 19:51 编辑  
 
上一篇提到了在树莓派下部署.net开发环境以及一个很基础的hello world程序,今天继续使用.net下提供的GPIO库,测试GPIO的输出和输入。 
 
1. 创建项目 
在树莓派5中安装好VSCode,然后打开一个文件夹,例如~/dnApp1,接下来在VSCode中打开终端,输入如下命令,创建一个dotnet的project: 
可以创建一个基于Console的控制台程序,并且创建了项目文件,以及一个名为Program.cs的源文件,如下图所示: 
 
如果使用如下命令,立马可以验证这个基本的hello world程序: 
 
 
当然,这和我们今天操作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,今天的测试就到这里。 
 
 
 |   
 
  
  
  
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |