本文是一篇适合初学者的 .NET nanoFramework 保姆级入门教程,并提供了基本的入门程序并介绍了微雪的 ESP32-S2-Pico 使用 .NET nanoFramework 开发过程的基础知识。
.NET 支持物联网(IoT) 应用的开发,其提供的.NET IoT 库可以让我们在运行 Windwos 和 Linux 系统的 IoT 设备上运行应用,并利用 GPIO、SPI、I2C、PWM 和串行端口等接口使用数百个传感器、显示器、输入设备。但是这并不适用于受约束的嵌入式设备,比如 ESP32、M5Stack、STM32 等。对于这些受约束的嵌入式设备,.NET nanoFramework 提供了一个很好的方案,适用于这些微控制器,能够为受限嵌入式设备编写托管代码。开发者可以利用熟悉的 IDE Visual Studio 和 .NET(C#) 知识快速编写应用程序,而无需担心微控制器的低层硬件复杂性。更方便的是,使用 Visual Studio 可以直接在真实硬件上编写、部署、调试代码。
使用微控制器的好处显而易见,毕竟20 ~ 50 元左右的价格,对于许多应用来说是非常实惠的,尤其是对于那些需要大量生产的应用。另外,兼具小巧体积的同时,微控制器具有较强的可编程性和可扩展性,可以通过编程来定义其功能。这使得微控制器能够应用于许多不同的领域,并且在需要更改功能时也非常方便。
Pico & ESP32
注:上图左三为 Raspberry Pi Pico 系列,最右边为 ESP32-S2-Pico,蓝色板子均为微雪产品。
.NET nanoFramework 对于 Raspberry Pi Pico 系列的支持正在计划中,虽然已经有一些爱好者的非官方的尝试,但是其项目似乎已经不再更新,还是等待官方的正式支持吧,我也会一直关注。不过 .NET nanoFramework 对于 ESP32 是支持的,所以近期又买了 ESP32 的板子来做一些尝试。
ESP32-S2-Pico 体积小巧,外设接口丰富,集成了低功耗 Wi-Fi 系统级芯片(SoC)和大容量存储器,支持 Raspberry Pi Pico 扩展板生态的开发板。具有硬件加密加速器、RNG、HMAC 和数字签名 (Digital Signature) 模块,满足物联网的安全要求。另外还有多种低功耗工作状态满足在物联网 (IoT)、移动设备、可穿戴电子设备、智能家居等应用场景的功耗需求。
.NET nanoFramework 开发环境搭建首先需要安装好 Visual Studio 2022(也支持VS 2019),然后安装扩展和工具。另外,SDK 需要必须安装 .NET 6.0 运行时(或 .NET 6.0 SDK)。
打开 Visual Studio ,随便打开/新建一个任意的项目或直接选择“继续但无需代码”进入主界面,通过选择菜单“扩展”>“管理扩展”来打开“管理扩展”对话框。选择左侧的“联机”类别,然后在搜索框中输入“nano”。
安装扩展
选择“.NET nanoFramework Extension” 下载安装,系统将提示重新启动 Visual Studio 以完成扩展的安装,此时关闭 Visual Studio 来进行继续的操作即可。
确认安装
接下来我们需要安装 .NET nanoFramework firmware 工具库,这个工具后面会使用到,这是一个 .NET Core Tool 工具,可以刷写固件(nanoBooter和nanoCLR) 到NET nanoFramework 目标,也可以进行应用程序部署(运行 .NET 应用程序所需的所有程序集)和恢复以前保存的部署映像。关于这个工具箱的更多的介绍可以前往官方仓库阅读:https://github.com/nanoframework/nanoFirmwareFlasher/blob/main/README.zh-cn.md
打开控制台,使用以下.NET Core CLI 命令即可安装 .NET nanoFramework Firmware flash 工具:
dotnet tool install -g nanoff
成功安装后,将显示调用说明和安装的工具版本。
nanoff
在这一部分,我们需要向电路板刷入 .NET nanoFramework 的固件。
首先我们要进入 ESP32 的下载模式,不同的板子有不同的方式,这里我们可以查阅购买产品的说明书。针对这款 ESP32-S2-Pico 下载更新程序需要先按住 BOOT 按键不放再按下 RESET 按键后释放或断开 USB 按住 BOOT 键上电,此时 ESP32-S2 的 UART0(GPIO43,GPIO44)、USB 均可烧录程序。
接入设备
这里我采用按住 BOOT 按键然后与电脑的 USB 口连接上电,此时我们就可以在设备管理器看到新插入的 USB 串行设备。
COM
如果电脑存在多个已有的 COM 设备,记得注意接入设备后的变化,需要记好 COM 口的编号,后面会用到。
当然你也可以使用之前安装的 nanoff,使用下面命令列出可用的串行端口:
nanoff --listports
nanoff listports
这里我们可以看到,新接入的 ESP32-S2-Pico 的串行端口为 COM5。
在刷写固件时,我们需要提供正确的目标名称来执行固件刷写,否则板子可能无法工作。除了从平台来看,.NET nanoFramework 支持 esp32, stm32, cc13x2, gg11,在固件刷写时需要指定外。不同的板子虽然都是用 ESP32 但是其在设计时也会或多或少存在一些差异,ESP32 板子的构建列表 Target 可以查看这里:https://github.com/nanoframework/nf-interpreter#esp32-modules-and-boards。
针对这块板子,如果我们使用官方的入门教程,你会发现这样的错误:
For ESP32-S2 series nanoff isn't able to make an educated guess on the best target to use.
Please provide a valid target name using this option '--target MY_ESP32_S2_TARGET' instead of '--platform esp32'.
Error E9000: Invalid or missing arguments.
Error E9000
出错也不奇怪,毕竟这块板子不在官方的列表当中,猜不出来是正常的。虽然根据其设计是属于 Pico 系列的,但是使用 ESP32_PICO 是无效的,刷写后设备无法启动。我们可以直接使用下面的命令,刷写同为 ESP32-S2 系列的 FEATHER_S2 ,将连接到 COM5 的 ESP32 板子的固件更新到最新的可用版本:
nanoff --target FEATHER_S2 --serialport COM5 --update
等待 30 秒左右即可刷写成功。
刷写成功
对了,上面刷写前,打印了板子的基本信息,如果你想直接查看板子信息,可以使用下面的命令:
nanoff --platform esp32 --serialport COM5 --devicedetails
devicedetails
固件刷写完成后,设备是仍处于固件刷新状态,我们需要按 RESET 键使设备恢复正常状态或直接重新插拔 USB,此时如果电脑没有任何响应则需要检查是否刷写失败。
刷新成功后,我们是可以在 Visual Studio 的设备管理器中看到该设备的。设备管理器 Device Explore 可以通过 “视图”>“其他窗口”>“Device Explore” 来打开。
device explore
有时可能最新固件存在适配或某些问题,我们需要安装其他的稳定版本,使用下面的命令我们可以列出所有稳定版本的情况:
nanoff --listboards --platform esp32
如果想刷写指定的版本如 FEATHER_S2 1.8.0.741
,可以使用下面的命令:
nanoff --target FEATHER_S2 --fwversion 1.8.0.741 --serialport COM5 --update
为什么介绍指定版本的安装,是因为不同版本之间引用的 Nuget 包需要和刷写的固定保持一致。若不一致,则会出现下面的报错:
Couldn't find a valid assembly required by mscorlib...
此时我们需要调整安装的 Nuget 包的版本和所刷写固定的需求改为一致即可。在设备管理器中点击“Device Capabilities”即可查看程序集版本和校验信息:
Device Capabilities
如下图已经标出了一个红色的不一致的包信息,根据组件包的介绍说明,改为一致即可:
包信息
前面我们已经做好了必要的准备,下面就可以开始愉快的编码时间。需要注意的一点是:创建 .NET nanoFramework 项目时,不要进行任何下拉框的筛选限制,你可以搜索 “nano” 即可看到项目模板。首次创建项目时若出现报错可忽略,关闭窗口前往文件夹打开生成的 sln 即可。
创建项目
首次创建 .NET nanoFramework 项目,其模板因为是新增的,所以会排在第一位,直接选择 “Blank Application” 模板创建项目即可。
创建项目
该模板即是一个简单的 Hello World 应用,如果项目出现报错,则可能需要你手动安装缺失的 Nuget 包,可以通过包管理器搜索 “nano” 安装核心包 “nanoFramework.CoreLibrary” 并安装。
安装 Nuget 包
安装缺失的 Nuget 包即可点击运行,记得在“Device Explore” 中选择你要运行的设备,以下便是成功运行后的信息:
运行情况
当前的代码只是在调试的信息中打印了 Hello World ,但这似乎并没有板子什么事情,接下来我们使用其串口来输出 Hello World 信息。
使用串口我们只需要稍微改造一下代码即可,这里需要通过 Nuget 安装 nanoFramework.System.IO.Ports
包:
static SerialPort _serialDevice;
public static void Main()
{
Debug.WriteLine("Hello from nanoFramework!");
// 获取可用串口
var ports = SerialPort.GetPortNames();
Debug.WriteLine("Available ports: ");
foreach (string port in ports)
{
Debug.WriteLine($" {port}");
}
_serialDevice = new SerialPort("COM1");
// 设置参数
_serialDevice.BaudRate = 9600;
_serialDevice.Parity = Parity.None;
_serialDevice.StopBits = StopBits.One;
_serialDevice.Handshake = Handshake.None;
_serialDevice.DataBits = 8;
// 设置缓冲区大小
_serialDevice.ReadBufferSize = 2048;
// 使用以上设置打开串口
_serialDevice.Open();
_serialDevice.WriteTimeout = 500;
for (; ; )
{
_serialDevice.WriteLine(DateTime.UtcNow + " hello from nanoFramework!");
Thread.Sleep(2000);
}
}
编译并部署上面的代码到 ESP32 板子,点击 RESET 按钮程序就会启动。此时我们连接串口即可看到打印的 Hello World 信息。
串口输出
这一节主要介绍如何连接 ESP32 设备的串口,上一节我们在串口输出信息前打印了设备的串口情况,根据打印信息,我们可以看到 SerialPort.GetPortNames()
设备有2个串口可用:COM1 和 COM2 这里使用了 COM1,在硬件接口上通过下图可查得 UART0 的 TX 和 RX 分别为 GP43 和 GP44。
ESP32-S2-Pico 硬件接口
这里使用 USB 转 TTL 设备进行接线,TX 接 GP44,RX 接 GP43,GND 随便接一个ESP32 的 GND 口,比如 3 号物理针脚,USB 转 TTL 短接帽的电压记得选到 3V3。
USB 转 TTL
接好这三根线将串口连接电脑,即可使用串口工具(比如:MobaXterm)打开该串口查看 ESP32 打印的信息了。
注意:串口波特率 9600 ,其他均为默认,可查看下图:
MobaXterm
总体来说 .NET nanoFramework 的开发体验对 .NET 熟悉的同学还是非常友好的。它提供了一个熟悉的开发环境,可以让你使用 Visual Studio 和 C# 语言进行开发。此外,.NET nanoFramework 还支持与 .NET Framework 相同的语言特性和 API,因此你可以很容易地将代码迁移到 .NET nanoFramework 上。
后续我会继续进行 .NET nanoFramework 相关的研究,感兴趣的同学可以点一波关注哦,感谢!