查看: 214|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 92 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2024-4-27 17:49:02 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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的源文件,如下图所示:
    111.jpg

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


    当然,这和我们今天操作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-*
    复制代码
    注意这个操作需要联网,运行后效果如下:
    333.jpg

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


    修改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. }
    复制代码
    然后编译运行,效果如下:
    555.jpg

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

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

    即使用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熄灭,运行效果如下:
    777.jpg


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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-17 16:09 , Processed in 0.137475 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.