IoT 筆記 - 用 C# 寫 ESP32 開發板程式
3 | 4,987 |
陸續用 VSCode + PlatformIO 寫了幾個 ESP 開發板 C++ 程式,琢磨出有效率寫出 Web 控制介面的開發模式,尋找及安裝硬體元件程式庫已難不倒我,自己算是符合「拿到新東西能讓它動起來」的基本要求。
經過這段時間磨練,雖勉強能用 C++ 拼湊出會動的程式,但身為跨界的資深 .NET 開發人員,卻深陷老鳥魔咒,常有「想很多,能力卻沒跟上」的挫折感。想想,是時候體驗放飛自我,重回舒適圈的感覺,回頭用我最擅長的 C# 來寫 ESP32 程式吧!
微軟有個開源專案 .NET nanoFramework 是一套極精簡版 .NET Framework,小到可以放在 64K RAM + 256KB Flash 的嵌入式裝置(YES! 包含 200 元有找的窮人原子彈 - ESP32 開發板)上執行,成熟度跟生態圈完整性當然無法與 Arduino C++ 相提並論,但是,nanoFramework 對我有難以抗拒的強大魔力,原因是它讓我可以
開 Visual Studio IDE 用 C# 寫 ESP32 程式!
.NET 老鳥只需要這句,不需多費唇舌解釋,什麼都值了。
nanoFramework 目前支援 ARM Cortex-M 及 ESP32 晶片,能在多款平價開發板上執行,包含 STM 的 Discovery 及 Nucleo、Mikrobus 的 Quail、Wilderness Labs 的 Netduino 以及 ESP32 DevKit... 等等,而不用煩惱該選哪一塊,ESP32 是最方便取得的平價選擇! ESP32 開發板很有多版本,我目前試過 NodeMCU-32S、DevKit 都能跑 nanoFramework。關於 ESP32 開發板介紹,推薦夜市小霸王尤濬哲老師的這篇 - ESP32評比與教學推薦NodeMCU-32s的理由。
前始前要先準備 nanoFramework 開發環境,官方文件 Getting Started Guide for managed code (C#) 寫得挺詳細,照方煎藥即可。大致步驟如下:
- 如果你還沒裝過地表最強大的開發工具,請先下載及安裝 Visual Stduio 2019 (自己玩的可用免費的 Community 版本),安裝時記得選取 .NET Desktop Development 及 .NET Core Corss-Platform Development
註:nanoFramework 還很新,我一度因 VS2019 版本太舊出錯,若要用已安裝好的 VS2019 開發,記得先更新。
- 建議使用 Preview 版 nanoFramework NuGet 套件,故要新增 nanoFramework 最新版 NuGet 來源:
- 安裝 nanoFramework VS2019 Extension
- 燒錄 nanoFramework 環境到 ESP32 開發板
ESP32 開發板必須換成 nanoFramework 環境,做法是使用 .NET Core 工具 nano Firmware Flasher (nanoff),使用dotnet tool install -g nanof
下載,再下指令nanoff --target ESP32_WROOM_32 --serialport 開發板COM --update
,不到 30 秒即可更新完成:
- 更新成 nanoFramework 之後,應該可以在 Device Explorer 看到它(執行或偵錯前記得先選取部署對象):
- 之後新增專案時選擇 nanoFramework 專案,就可以幹活兒了:
就醬,我完成了我的 nanoFramework Helo World:
using System;
using System.Device.Gpio;
using System.Diagnostics;
using System.Threading;
namespace nanoFrameworkHelloWorld
{
public class Program
{
private static GpioController s_GpioController;
public static void Main()
{
s_GpioController = new GpioController();
var led = s_GpioController.OpenPin(
2,
PinMode.Output);
led.Write(PinValue.Low);
while (true)
{
led.Toggle();
Thread.Sleep(125);
led.Toggle();
Thread.Sleep(125);
led.Toggle();
Thread.Sleep(125);
led.Toggle();
Thread.Sleep(525);
}
}
}
}
這段程式幾乎是所有人學 Arduino 的起手式,透過改變 GPIO 改變輸出電位讓 LED 閃爍,堪稱 Arduino 界的 Hello World。
接下來我們來看最美妙的部分,nanoFramwork 可以 Line-By-Line Debug,甚至在即時運算下指令控制硬體動作,跟平常寫 .NET 程式的體驗相同。
實際示範一下。以下的操作是透過按 F10 逐步執行跑 led.Toggle() 切換 LED 亮燈狀態,最酷的是還可以手動敲指令現場控制,這是每個開發者追求的夢幻開發環境呀!
最後,補上一個小訣竅,nanoFramework 還在發展初期,API 會頻繁調整,像我就遇到官方範例無法編譯的問題,記得勾選「Include prerelease」並下載最新版:
呼口號時間
C# 真棒,Visual Studio / nanoFramework 好威呀!
Tutorial of writing nanoFramework program for ESP32.
Comments
# by Jackson2746
牛逼!
# by 卡比
請問一下,我想讀取原生的 Hall Sensor 的 value,真的找不到比較正統的文件,只找到是有關 nanoFramework.Hardware.Esp32 這個 library,嘗試過 DeviceFunction.ADC1_CH9 及 Channel 之類的方向著手,仍舊是讀不到,請問能分享一下有關的學習資源嗎?
# by Jeffrey
to 卡比,讀取 Hall Sensor 值是標準 ADC 應用,為排除 Sensor 本身或電路接法問題,我建議先接個可變電阻調電壓,看 ADC 能否正確讀到數值變化。參考:https://www.hackster.io/phantom-burn-17/adc-with-nanoframework-1f3e21