快速入门 .NET nanoFramework 开发 ESP32-Pico 应用

news2024/11/15 8:45:49

本文是一篇适合初学者的 .NET nanoFramework 保姆级入门教程,并提供了基本的入门程序并介绍了微雪的 ESP32-S2-Pico 使用 .NET nanoFramework 开发过程的基础知识。

目录

1. 背景

1.1 .NET IOT 与 .NET nanoFramework

1.2 微控制器

1.3 实验板介绍

2. 搭建 .NET nanoFramework 开发环境

2.1 安装扩展

2.2 安装工具库

3. 固件安装

3.1 设备连接

3.2 刷写固件

3.3 设备固件检查

3.4 刷写指定版本

3.5 程序集的版本对齐

4. 编写程序

4.1 编写 “Hello World” 应用

4.2 串口输出 “Hello World”

4.3 串口连接

5. 最后


1. 背景

1.1 .NET IOT 与 .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 可以直接在真实硬件上编写、部署、调试代码。

1.2 微控制器

使用微控制器的好处显而易见,毕竟20 ~ 50 元左右的价格,对于许多应用来说是非常实惠的,尤其是对于那些需要大量生产的应用。另外,兼具小巧体积的同时,微控制器具有较强的可编程性和可扩展性,可以通过编程来定义其功能。这使得微控制器能够应用于许多不同的领域,并且在需要更改功能时也非常方便。

Pico & ESP32

注:上图左三为 Raspberry Pi Pico 系列,最右边为 ESP32-S2-Pico,蓝色板子均为微雪产品。

1.3 实验板介绍

.NET nanoFramework 对于 Raspberry Pi Pico 系列的支持正在计划中,虽然已经有一些爱好者的非官方的尝试,但是其项目似乎已经不再更新,还是等待官方的正式支持吧,我也会一直关注。不过 .NET nanoFramework 对于 ESP32 是支持的,所以近期又买了 ESP32 的板子来做一些尝试。

ESP32-S2-Pico 体积小巧,外设接口丰富,集成了低功耗 Wi-Fi 系统级芯片(SoC)和大容量存储器,支持 Raspberry Pi Pico 扩展板生态的开发板。具有硬件加密加速器、RNG、HMAC 和数字签名 (Digital Signature) 模块,满足物联网的安全要求。另外还有多种低功耗工作状态满足在物联网 (IoT)、移动设备、可穿戴电子设备、智能家居等应用场景的功耗需求。

2. 搭建 .NET nanoFramework 开发环境

.NET nanoFramework 开发环境搭建首先需要安装好 Visual Studio 2022(也支持VS 2019),然后安装扩展和工具。另外,SDK 需要必须安装 .NET 6.0 运行时(或 .NET 6.0 SDK)。

2.1 安装扩展

打开 Visual Studio ,随便打开/新建一个任意的项目或直接选择“继续但无需代码”进入主界面,通过选择菜单“扩展”>“管理扩展”来打开“管理扩展”对话框。选择左侧的“联机”类别,然后在搜索框中输入“nano”。

安装扩展

选择“.NET nanoFramework Extension” 下载安装,系统将提示重新启动 Visual Studio 以完成扩展的安装,此时关闭 Visual Studio 来进行继续的操作即可。

确认安装

2.2 安装工具库

接下来我们需要安装 .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

3. 固件安装

在这一部分,我们需要向电路板刷入 .NET nanoFramework 的固件。

3.1 设备连接

首先我们要进入 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。

3.2 刷写固件

在刷写固件时,我们需要提供正确的目标名称来执行固件刷写,否则板子可能无法工作。除了从平台来看,.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

3.3 设备固件检查

固件刷写完成后,设备是仍处于固件刷新状态,我们需要按 RESET 键使设备恢复正常状态或直接重新插拔 USB,此时如果电脑没有任何响应则需要检查是否刷写失败。

刷新成功后,我们是可以在 Visual Studio 的设备管理器中看到该设备的。设备管理器 Device Explore 可以通过 “视图”>“其他窗口”>“Device Explore” 来打开。

device explore

3.4 刷写指定版本

有时可能最新固件存在适配或某些问题,我们需要安装其他的稳定版本,使用下面的命令我们可以列出所有稳定版本的情况:

nanoff --listboards --platform esp32

如果想刷写指定的版本如 FEATHER_S2 1.8.0.741,可以使用下面的命令:

nanoff --target FEATHER_S2 --fwversion 1.8.0.741 --serialport COM5 --update

3.5 程序集的版本对齐

为什么介绍指定版本的安装,是因为不同版本之间引用的 Nuget 包需要和刷写的固定保持一致。若不一致,则会出现下面的报错:

Couldn't find a valid assembly required by mscorlib...

此时我们需要调整安装的 Nuget 包的版本和所刷写固定的需求改为一致即可。在设备管理器中点击“Device Capabilities”即可查看程序集版本和校验信息:

Device Capabilities

如下图已经标出了一个红色的不一致的包信息,根据组件包的介绍说明,改为一致即可:

包信息

4. 编写程序

前面我们已经做好了必要的准备,下面就可以开始愉快的编码时间。需要注意的一点是:创建 .NET nanoFramework 项目时,不要进行任何下拉框的筛选限制,你可以搜索 “nano” 即可看到项目模板。首次创建项目时若出现报错可忽略,关闭窗口前往文件夹打开生成的 sln 即可。

创建项目

4.1 编写 “Hello World” 应用

首次创建 .NET nanoFramework 项目,其模板因为是新增的,所以会排在第一位,直接选择 “Blank Application” 模板创建项目即可。

创建项目

该模板即是一个简单的 Hello World 应用,如果项目出现报错,则可能需要你手动安装缺失的 Nuget 包,可以通过包管理器搜索 “nano” 安装核心包 “nanoFramework.CoreLibrary” 并安装。

安装 Nuget 包

安装缺失的 Nuget 包即可点击运行,记得在“Device Explore” 中选择你要运行的设备,以下便是成功运行后的信息:

运行情况

当前的代码只是在调试的信息中打印了 Hello World ,但这似乎并没有板子什么事情,接下来我们使用其串口来输出 Hello World 信息。

4.2 串口输出 “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 信息。

串口输出

4.3 串口连接

这一节主要介绍如何连接 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

5. 最后

总体来说 .NET nanoFramework 的开发体验对 .NET 熟悉的同学还是非常友好的。它提供了一个熟悉的开发环境,可以让你使用 Visual Studio 和 C# 语言进行开发。此外,.NET nanoFramework 还支持与 .NET Framework 相同的语言特性和 API,因此你可以很容易地将代码迁移到 .NET nanoFramework 上。

后续我会继续进行 .NET nanoFramework 相关的研究,感兴趣的同学可以点一波关注哦,感谢!

声明:本文来自“桑榆肖物”,仅允许规范转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动Web【空间转换[空间位移、透视、空间旋转、立体呈现、3D导航、空间缩放]、动画、综合案例】

文章目录一、空间转换1.1 空间位移1.2 透视1.3 空间旋转1.4 立体呈现1.5 3D导航1.6 空间缩放二、动画2.1 动画的实现步骤2.2 动画属性三、综合案例2.1 走马灯一、空间转换 空间:是从坐标轴角度定义的。 x 、y 和z三条坐标轴构成了一个立体空间,z轴位置与…

Android实战进阶 - 拉取项目代码后多处报红?如资源找不到该如何处理?

近期参与了一个我很感兴趣的项目,项目内用到了很多新东西,例如组件化、模块化、ARouter路由、MVI框架、Kt高阶用法等等,感觉可以学一段时间… Gradle相关Blog Android Gradle - Gradle、Gradle plugin 基础认知Android Gradle - AndroidStud…

函数极限定义的理解

回顾一下非正式的极限定义法。当x从任意一侧(自左向右或自右向左)接近常量 c时,如果f(x)变得任意接近一个单独的值L, 则当x接近c时f(x)的极限值是L, 写作 咋一看,这个定义似乎非常技术化。即使这样,它仍然是非正式的,因为它没有给…

三、Django -视图

Django 提示:本文根据b站黑马python课整理 链接指引 > 黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录Django视图介绍和项目准备视图…

【数据集6】全球人工不透水面积GAIA(清华数据)

全球人工不透水面积(lobal artificial impervious area, GAIA) 人工不透水区是表征建成区和城市范围的重要覆盖类型,特别是在较细的空间分辨率下。 1 简介 原理: 由Landsat卫星图像和辅助数据集生成,如夜间灯光数据…

健康码识别[QT+OpenCV]

💂 个人主页:风间琉璃🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦目录 一、识别原理 1.二维码定位 2.颜色识别 二、部分源码 一、识别原理 二维…

matlab实现基本相位调制

相位调制(PM)是将信息编码为载波的瞬时相位变化的一种调制模式。 调相的基本表达式如下; 载波c(t)是一个标准正弦信号;m(t)是调制信号;调制以后是把m(t)的变化附加到了载波的相位变化上; 调相的基本示意如…

WPF中iconfont图标库的使用

总目录 文章目录总目录前言一、查找项目需要的图标二、图标的使用1.将下载的文件解压缩2.将ttf文件复制粘贴到自己的项目中3.使用总结前言 本文主要介绍在WPF中iconfont图标库的使用 一、查找项目需要的图标 首先进入阿里巴巴矢量图标库网站,登录自己的账号&#…

MySQL快速生成大量测试数据 (脚本一键生成分表数据)

生成128个分表的测试数据敲到手累; 生成的测试数据虽然有离散分布,但随着时间的增长数据量不增反降,不符合大多数线上业务的增长趋势; 生成的测试数据部分超过当前日期。 具体表现如下图所示: 我们直接看下脚本的用法…

月入8000+的steam/csgo搬砖项目(详细拆解)

大家好,我是阿阳 今天就给大家带来一个在steam游戏搬砖项目的拆解,目前这个项目我们团队也一直在带队实操,已经跑通了项目的整个流程,提炼出了完整的赚钱体系。 先给大家看看近期的收益情况: 近期的出售记录&#xf…

[ Azure - Database ] Azure Database for MySQL 配置Auditing并查看使用

传统MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间。本文会讲解微软云Azure Database for MySQL的binlog相关…

i.MX8MP平台开发分享(IOMUX篇)- 硬件原理

专栏目录:专栏目录传送门 平台内核i.MX8MP5.15.71文章目录1.前言2.IOMUX原理3. 寄存器实例:UART1_RX3.1 PAD: UART1_RXD3.2 PAD: SD1_CMD3.3 PAD: SAI2_RXC3.4 Input select3.5 功能实现4.SION1.前言 我们都知道,芯片包含数量有限的引脚&am…

BeanFactory和Applicationcontext实现

1.容器接口 1.BeanFactory能做哪些事 1.什么是beanFactory 它是spring的核心容器 是ApplicationContext的父接口 ApplicationContext扩展实现都【组合了】beanFactory 2.BeanFactory的功能 明面上只有getBean()方法实际上控制反转、依赖注入、bean生命周期的各种功能都…

tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题

一、前言 在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能&#x…

ESP32-S3 >>> MicroPython 编程初探

今天买了一个ESP32-S3,打算试试在这上面进行MicroPython的编程(附资料网址)。 首先为了在ESP32上进行mp的编程,需要对其重新烧录固件。这就需要我们电脑安装好CH343驱动,然后找到适用于ESP32-S3的固件,利用…

Diffusion详解及PyTorch代码

首先附上几个大佬的讲解 lilianweng-diffusion-models 这篇博客借鉴了上述博客和视频,同时加上个人的理解整合了一下,整个推导过程非常详细,希望能使每个人都看懂 结合之前讲过的VAE和GAN模型,Diffusion Model和他们的区别就是…

Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案

Apache Struts2远程代码执行漏洞(S2-015)介绍 Apache Struts 2是用于开发JavaEE Web应用程序的开源Web应用框架。Apache Struts 2.0.0至2.3.14.2版本中存在远程命令执行漏洞。远程攻击者可借助带有‘${}’和‘%{}’序列值(可导致判断OGNL代码两次)的请求…

LabVIEW​​共享​变量生命周期

LabVIEW​​共享​变量生命周期 共享​变量​生命​周期 ​所有​共享​变量​都是​项目​库​的​一部分。​SVE​将会​注册​项目​库​和​库​中​包含​的​共享​变量​(当​LabVIEW​需要​调​用​其中​某​个​变量​时)​。​默认​情况​…

AlphaGo简易版MuGo源码解析

文章目录前言源码实现MuGo的输入数据模型的搭建模型的训练参考链接结语前言 自从AlphaGo横空出世,战胜李世石后,AI围棋如雨后春笋一般遍地开花。阅读DeepMind的论文有时还是隔靴搔痒,只有钻到代码里,才能一探究竟。于是&#xff…

Arthas诊断追踪性能案例

文章目录1、什么是Arthas2、安装启动3、追踪流程背景:本次案例使用Windows操作系统进行本地环境演示(生产环境Linux同理) 案例:查询接口性能特别慢,通过Arthas追踪诊断链路中哪个步骤导致性能如此之慢 注意&#xff1a…