陸續用 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#) 寫得挺詳細,照方煎藥即可。大致步驟如下:

  1. 如果你還沒裝過地表最強大的開發工具,請先下載及安裝 Visual Stduio 2019 (自己玩的可用免費的 Community 版本),安裝時記得選取 .NET Desktop Development 及 .NET Core Corss-Platform Development
    註:nanoFramework 還很新,我一度因 VS2019 版本太舊出錯,若要用已安裝好的 VS2019 開發,記得先更新。
  2. 建議使用 Preview 版 nanoFramework NuGet 套件,故要新增 nanoFramework 最新版 NuGet 來源:
  3. 安裝 nanoFramework VS2019 Extension
  4. 燒錄 nanoFramework 環境到 ESP32 開發板
    ESP32 開發板必須換成 nanoFramework 環境,做法是使用 .NET Core 工具 nano Firmware Flasher (nanoff),使用 dotnet tool install -g nanof 下載,再下指令 nanoff --target ESP32_WROOM_32 --serialport 開發板COM --update,不到 30 秒即可更新完成:
  5. 更新成 nanoFramework 之後,應該可以在 Device Explorer 看到它(執行或偵錯前記得先選取部署對象):
  6. 之後新增專案時選擇 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

Post a comment