如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序?你可能会回答使用 C++ 或 Python 去访问 Raspberry Pi 的引脚。现在,C# 程序员可以使用 .NET Core 在 Linux 上构建 IoT 应用程序。只需要引入 System.Device.Gpio NuGet 包即可。

  提示

因为 .NET Core JIT 依赖于 ARMv7 指令集,因此处理器架构新于 ARMv7 的 Linux 开发板都可以使用此包进行硬件操作。当然,一些特殊的硬件操作除外,比如对 GPIO 引脚进行上拉,这需要对处理器的寄存器进行访问,而 System.Device.Gpio 对不支持的硬件仅实现了通用操作。

若要继续阅读下面的内容,你需要准备:

  1. 安装有 Linux 的 Raspberry Pi 2B/3B/3A+/3B+
  2. Visual Studio 2019
  3. 用于构建程序的 .NET Core SDK (版本大于 2.1)

环境配置

  1. 首先获取 Raspberry Pi 的硬件接口的访问权限。

  提示

远程访问 Raspbian 可以使用 putty 通过 SSH 进行访问,也可以使用 apt 安装 xrdp ,通过 Windows 远程桌面进行访问。对于没有桌面环境的 Raspbian Lite,可以通过执行 sudo raspi-config 进行配置。

  1. 使用二进制文件安装 .NET Core 运行时

    1. 下载
      wget https://download.visualstudio.microsoft.com/download/pr/4f9988da-8a62-4e01-9978-d9f1dd4fc386/3acb243f96e8e20b6774c64694d478ce/dotnet-runtime-2.1.13-linux-arm.tar.gz
    2. 解压
      mkdir ~/dotnet21 && tar -xvf dotnet-runtime-2.1.13-linux-arm.tar.gz -C ~/dotnet21
    3. 创建链接
      sudo ln -s ~/dotnet21/dotnet /usr/bin/dotnet

Blink

熟悉 Arduino 的朋友都知道,Blink 是默认烧写进 Arduino 的初始程序,控制板载连接 13 号引脚的 LED 闪烁,是一种类似于“Hello World”的存在。这里我们将 LED 小灯连接至 Raspberry Pi 的 GPIO 17 引脚。

硬件需求

名称 数量
LED 小灯 x1
220 Ω 电阻 x1
杜邦线 若干
  • LED 正极 - GPIO 17 (Pin 11)
  • LED 负极 - GND

电路

使用 Docker 运行示例

示例地址:https://github.com/ZhangGaoxing/dotnet-core-iot-demo/tree/master/src/Blink

docker build -t iot-blink -f Dockerfile .
docker run --rm -it --device /dev/gpiomem iot-blink

代码

  1. 打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“Blink”。

  2. 打开 “工具”——“NuGet包管理器”——“程序包管理器控制台”,运行如下命令,以获取程序包。

    PM> Install-Package System.Device.Gpio
  3. 在 Program.cs 中,替换如下代码:

    using System;
    using System.Device.Gpio;
    using System.Threading; namespace Blink
    {
    class Program
    {
    static void Main(string[] args)
    {
    // 定义引脚
    int pinNumber = 17;
    // 定义延迟时间
    int delayTime = 1000; // 获取 GPIO 控制器
    using (GpioController controller = new GpioController(PinNumberingScheme.Logical))
    {
    // 打开引脚 17
    controller.OpenPin(pinNumber, PinMode.Output); // 循环
    while (true)
    {
    Console.WriteLine($"Light for {delayTime}ms");
    // 打开 LED
    controller.Write(pinNumber, PinValue.High);
    // 等待 1s
    Thread.Sleep(delayTime); Console.WriteLine($"Dim for {delayTime}ms");
    // 关闭 LED
    controller.Write(pinNumber, PinValue.Low);
    // 等待 1s
    Thread.Sleep(delayTime);
    }
    }
    }
    }
    }

部署

  1. 在“程序包管理器控制台”运行发布命令:

    dotnet publish -c release -r linux-arm

  提示

默认的发布路径是在 “\Blink\bin\Release\netcoreappXXX\win10-arm\publish”。你也可以使用 -o 来指定发布路径,如:-o D:\BlinkPublish ,这将会发布在 D 盘的 BlinkPublish 文件夹下。

  1. 使用 FTP 工具将生成的发布文件夹复制到 Raspberry Pi 上,这里使用的是 WinSCP 。

  提示

Raspbian 使用 FTP 服务,请使用 apt 安装 vsftpd 。

  1. 更改程序权限。使用 cd 命令切换到发布的文件夹,运行:

    chmod 755 ./Blink

    或使用 FTP 工具进行变更

  2. 执行 ./Blink 运行程序,此时 LED 小灯应该一闪一闪的了。

供参考

  1. dotnet/iot Documentation:https://github.com/dotnet/iot/blob/master/Documentation/README.md
  2. .NET Core on Raspberry Pi:https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md

张高兴的 .NET Core IoT 入门指南:(一)环境配置、Blink、部署的更多相关文章

  1. 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用

    什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即"通用输入输出". Raspberry Pi 有两行 GPIO 引脚, Rasp ...

  2. 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信

    什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设接口)也是设备与设备间通信方式的一种.SPI 是一种全双工(数据可以两个方向同 ...

  3. 张高兴的 .NET Core IoT 入门指南:(三)使用 I2C 进行通信

    什么是 I2C 总线 I2C 总线(Inter-Integrated Circuit Bus)是设备与设备间通信方式的一种.它是一种串行通信总线,由飞利浦公司在1980年代为了让主板.嵌入式系统或手机 ...

  4. 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

    什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...

  5. 张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  6. 张高兴的 .NET IoT 入门指南:(七)制作一个气象站

    距离上一篇<张高兴的 .NET Core IoT 入门指南>系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系 ...

  7. PHP入门及服务环境配置(Nginx+PHP)

    PHP入门及服务环境配置(Nginx+PHP) PHP入门 PHP维基百科: PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一 ...

  8. 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器

    时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...

  9. Asp.Net Core轻松入门之WebHost的配置

    在本篇文章中,我来讲一讲如何利用WebHost来加载配置文件和设置启动的Url 在前面的文章中讲过,ASP.Net Core应用程序会自动加载appsettings.json中的配置文件,那么如果配置 ...

随机推荐

  1. C#Redis 事务操作

    一.理论 还是抄前辈的理论知识. 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基 ...

  2. 自定义MVC的Helper扩展方法

    记得在开发ASP.NET时候,也经常性使用C#可以写自己义的扩展方法,如:http://www.cnblogs.com/insus/p/3154363.html 或http://www.cnblogs ...

  3. java的锁机制——synchronized

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  4. Redis哨兵(sentinel)模式搭建

    一.Sentinel介绍 之前骚了一波Redis的简介及应用场景,今天试了下他的哨兵模式: Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentine ...

  5. Java开发中常用的设计模式(一)---工厂模式

    一. 准备工作 1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...

  6. linux系统编程:open常用参数详解

    open用于打开一个文件,通过设置不同的flag,可以让进程只读,只写,可读/可写等操作 一.对一个不存在或者存在的文件(test.txt),进行写入操作 /*==================== ...

  7. python3.8 新特性

    https://docs.python.org/3.8/whatsnew/3.8.html python 3.8的新功能本文解释了与3.7相比,python 3.8中的新特性. 有关完整的详细信息,请 ...

  8. 撩课-Web大前端每天5道面试题-Day1

    1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量: 2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到 ...

  9. linux 新建用户和权限分配

    1.创建新用户:testuser 命令:#useradd 选项 用户名 选项: -c comment 指定一段注释性描述. -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主 ...

  10. 【代码笔记】iOS-Transition动画

    一,工程图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...