TA的每日心情 | 慵懒 昨天 22:42 |
---|
签到天数: 196 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 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,今天的测试就到这里。
|
|