💻
.NET nanoFrameworkを使って、ESP32の開発環境の構築(C#で組み込みデバイスを制御)
はじめに
C#で組み込みソフトを作れないかと調べていたら、
.NET nanoFrameworkを使うことでVisual Studioで開発できることを知りました。
ブレークなども実施することができ、慣れた環境で作業ができます。
今回、環境構築の方法を紹介します。
- .NET nanoFramework の開発フロー
- 手順
- .NET nanoFrameworkのインストール
- 組み込みデバイスに専用ファームウェア(nanoCLR)を書き込み
- HelloWorldアプリの実行
.NET nanoFramework の開発フロー
.NET nanoFrameworkの開発フローを記載します。
C言語で組み込みソフトを開発する場合は、特定のMPU向けのネイティブバイナリを生成しますが、
ではプラットフォームに依存しない .NET アセンブリ(中間言語)を生成します。
- アプリケーションコード (C#)
- 開発者は Visual Studio を使用して、C# 言語でアプリケーションコードを作成
- C# を用いることで、複雑なロジックを効率的に実装可
- nanoFramework クラスライブラリ
- アプリケーションコードで nanoFramework のクラスライブラリを利用し、GPIO や I2C などのハードウェア機能を操作
- これにより、ハードウェア制御が簡素化される
- ビルドされた .NET アセンブリ
- コードをビルドすると、**.NET アセンブリ(DLL)**が生成される
- C 言語との違い: C 言語ではソースコードをビルドしてネイティブバイナリ(マシンコード)を生成するが、.NET nanoFramework では中間言語(IL)である .NET アセンブリを生成
- デプロイ(アセンブリ転送)
- ビルドされた .NET アセンブリを ESP32 デバイスにデプロイする
- USB やシリアル接続を通じて、アセンブリをデバイスに転送
- nanoCLR (Common Language Runtime)
- デバイス上で動作する nanoCLR が、デプロイされたアセンブリを解釈して実行
- nanoCLR はアセンブリをネイティブコードにコンパイルするのではなく、その場で解釈して実行
- ハードウェア (ESP32)
- nanoCLR を通じて、アプリケーションコードが ESP32 のハードウェアを制御
- センサーの読み取りやアクチュエーターの操作など、実際のハードウェア操作が行われる
💻環境
- ホストPC
- Windows 11 Home
- Visual Studio Community 2022
- Version 17.11.4
- ターゲットボード
- ESP32-WROOM-32 開発ボード
手順
.NET nanoFrameworkのインストール
- Visual Studioを起動し、"拡張機能の管理"を選択する
- "nanoFramework"で検索し、インストールを実施する
-
Visual Studioを閉じるとインストールが開始される
-
Visual Studioを起動し、インストールされていることを確認する
組み込みデバイスに専用ファームウェア(nanoCLR)を書き込み
- ターゲットデバイスをUSBで接続し、デバイスマネージャーから接続先を確認する
- 私の環境だとCOM14
- Visual Studio側でPowerShellを起動する
- nanoffをインストールする
> dotnet tool install -g nanoff
-
書き込みを行う
> nanoff --platform esp32 --serialport COM14 --update .NET nanoFramework Firmware Flasher v2.5.96+5e1d1e4a6e Copyright (C) 2019 .NET Foundation and nanoFramework project contributors 略 Downloading firmware package...OK Extracting ESP32_REV0-1.12.0.166.zip...OK Updating to 1.12.0.166 Backup configuration...OK Flashing firmware...OK
- CHIP情報から適切なファームウェアを自動で選択される
-
デバイス一覧の確認をする
以上で、開発環境の準備が整いました。
HelloWorldアプリの実行
いよいよコードを書きます
-
プロジェクトを作成する
- "Blank Application(.NET nanoFramework)を選択する
- "Blank Application(.NET nanoFramework)を選択する
-
ひな形を確認する
- "Hello from nanoFramework!"と表示後、スリープするコードが提供される
using System; using System.Diagnostics; using System.Threading; namespace NFApp1 { public class Program { public static void Main() { Debug.WriteLine("Hello from nanoFramework!"); Thread.Sleep(Timeout.Infinite); // Browse our samples repository: https://github.com/nanoframework/samples // Check our documentation online: https://docs.nanoframework.net/ // Join our lively Discord community: https://discord.gg/gCyBu8T } } }
-
実行する
Attaching to nanoDevice... Waiting for nanoDevice to initialize... Debugger found. Resuming boot sequence. Create Type System. Assembly: NFApp1 (1.0.0.0) (196 RAM - 436 ROM - 162 METADATA) 略 Ready. The nanoDevice runtime is loading the application assemblies and starting execution. 'nanoFramework.Tools.VS2022.Extension.dll' (マネージド): 'C:\Users\XXX\source\repos\NFApp1\packages\nanoFramework.CoreLibrary.1.15.5\lib\mscorlib.dll' が読み込まれ、シンボルの読み込みがスキップされました。モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています。 'nanoFramework.Tools.VS2022.Extension.dll' (マネージド): 'C:\Users\XXX\source\repos\NFApp1\NFApp1\bin\Debug\NFApp1.exe が読み込まれました。シンボルが読み込まれました。 スレッド '<名前なし>' (2) はコード 0 (0x0) で終了しました。 Hello from nanoFramework!
- "Hello from nanoFramework!"が表示される
-
デバッグしてみる
- ブレークを張ることができる
- 変数もみえる
以上が基本的な手順となります。
さいごに
C#で組み込みデバイスを制御できるのは魅力的ですね。
触ったばかりのため、いろいろと調べていきたいと思います。
リアルタイム性が気になります。
Discussion