💻

.NET nanoFrameworkを使って、ESP32の開発環境の構築(C#で組み込みデバイスを制御)

2024/10/06に公開

はじめに

C#で組み込みソフトを作れないかと調べていたら、
.NET nanoFrameworkを使うことでVisual Studioで開発できることを知りました。
ブレークなども実施することができ、慣れた環境で作業ができます。
今回、環境構築の方法を紹介します。

  • .NET nanoFramework の開発フロー
  • 手順
    • .NET nanoFrameworkのインストール
    • 組み込みデバイスに専用ファームウェア(nanoCLR)を書き込み
    • HelloWorldアプリの実行

.NET nanoFramework の開発フロー

.NET nanoFrameworkの開発フローを記載します。
C言語で組み込みソフトを開発する場合は、特定のMPU向けのネイティブバイナリを生成しますが、
ではプラットフォームに依存しない .NET アセンブリ(中間言語)を生成します。

  1. アプリケーションコード (C#)
    • 開発者は Visual Studio を使用して、C# 言語でアプリケーションコードを作成
    • C# を用いることで、複雑なロジックを効率的に実装可
  2. nanoFramework クラスライブラリ
    • アプリケーションコードで nanoFramework のクラスライブラリを利用し、GPIO や I2C などのハードウェア機能を操作
    • これにより、ハードウェア制御が簡素化される
  3. ビルドされた .NET アセンブリ
    • コードをビルドすると、**.NET アセンブリ(DLL)**が生成される
    • C 言語との違い: C 言語ではソースコードをビルドしてネイティブバイナリ(マシンコード)を生成するが、.NET nanoFramework では中間言語(IL)である .NET アセンブリを生成
  4. デプロイ(アセンブリ転送)
    • ビルドされた .NET アセンブリを ESP32 デバイスにデプロイする
    • USB やシリアル接続を通じて、アセンブリをデバイスに転送
  5. nanoCLR (Common Language Runtime)
    • デバイス上で動作する nanoCLR が、デプロイされたアセンブリを解釈して実行
    • nanoCLR はアセンブリをネイティブコードにコンパイルするのではなく、その場で解釈して実行
  6. ハードウェア (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)を選択する
  • ひな形を確認する

    • "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#で組み込みデバイスを制御できるのは魅力的ですね。
触ったばかりのため、いろいろと調べていきたいと思います。
リアルタイム性が気になります。

GitHubで編集を提案
株式会社ジード テックブログ

Discussion