はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

M5Stackで.NET nanoFramework動かしてみた

やっぱりSoCにアプリ組み込んで動かすのが好きです。
そして、それがC#だともっと好き(書きたいことが書きたいように書けるから)。

昨年は、Arduinoを開発環境にしてM5Stackのアプリを色々作成していました。
少しでも使いやすい開発環境でということでVisual Studio Codeなども活用しました。

そんなM5Stackアプリ開発ですが、気づいてみたら、.NET nanoFrameworkで開発できるようになっていました。Arduinoとの違いは、.NET nanoFrameworkを使えばC#でコードが書けるという点です。すごい!

そもそも

M5 Stackとは

M5Stackは、ESP32というbluetoothWi-Fiを内蔵するSoCを使って、それに320x240のTFTカラー液晶、microSDカードスロット、スピーカーを組み合わせたコンパクトで便利な開発モジュールになります。
ESP32はArudino環境で開発ができるのでM5Stackで動作するアプリもArduino環境で開発ができます。
M5Stackには様々な拡張モジュールがあり、M5Stack Coreと呼ばれるM5Stack本体に拡張モジュールを積み重ねていくことでいろいろな機能が拡張ができます。

M5Stack Core 2とは

今回使うM5Stack Core 2は、M5StackのCore機能を改良した2022年6月時点での最新世代(第二世代)のCoreデバイスとなります。
www.switch-science.com
M5Stack Core 2のハード仕様などは下記の過去記事が参考になります。
hatsune.hatenablog.jp

.NET nanoFrameworkとは

.NET nanoFrameworkは、ESP32などのMCU(マイクロコントローラユニット)などの組込み用デバイス向けに.NETアプリの作成を可能にする無償のオープンソースプラットフォームです。
C# + .NET 6でデスクトップアプリを作成した経験が組込みシステム開発で活かせることを想定しているそうです。

.NET Core IoTとの違いは?

.NET環境での小型デバイス向けの開発には、.NET Core IoTと呼ばれているものもあります。
.NET Core IoTは、.NET Core+IoT向けライブラリで構成されています。
.NET Coreを動作させるので組込みといってもある程度のリソースが必要で、ターゲットとするハードは、Raspberry Piが想定さてています。
一方、.NET nanoFrameworkは動作環境でもあり、.NET Coreのランタイムではなく、.NET nanoFrameworkのランタイムでアプリが動作します。その代わり、組込み用デバイスでは不要な部分がなく、.NET Core IoTよりも更に小さなリソースで動作します。

事前準備

.NET nanoFramework Extensionを追加

.NET nanoFrameworkのプロジェクトをVisual Studioで作成できるように、Visual Studioを拡張(機能追加)しましょう。
そのために使用する拡張機能が「.NET nanoFramework Extension」です。
marketplace.visualstudio.com
Visual Studio 2022を起動したら、[拡張機能]-[拡張機能の管理]メニューで管理ウィンドウを開いてから「nano」で検索して.NET nanoFramework Extensionを探し出して適用します。

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

正常に動作すると次のようなログが表示されます。
gist.github.com

M5StackでHelloWorld

M5Stackアプリのプロジェクトを作成

.NET nanoFrameworkのテンプレートでプロジェクトを新規作成

機能拡張がうまくいくとVisual Studoの新規プロジェクト作成のテンプレートに「.NET nanoFramework」のテンプレートが追加されています。

まずは、「HelloWorld」というプロジェクト名で新規プロジェクトを作成して、M5Stack Core 2の液晶画面に「Hello World」と表示するアプリを作ってみます。

Device ExplorerでM5Core2を選択

プロジェクトが作成されたら、Device Explorerを開いてM5Core2との接続を確認します。
Device Explorerは、Visual Studioの「検索」機能から開くのが艦隊です。

テンプレートの初期コードを実行

M5Stack Core 2との接続や事前準備が正常に終わっていると、新しいプロジェクトを作成したときに自動生成されているコードのビルドおよび実行が正常に行われます。
自動生成コードは「Debug.WriteLine("Hello from nanoFramework!");」が実行される簡単なコードなので、実行が成功するとイミディエイトウィンドウに「Hello from nanoFramework!」と表示されます。

M5Stack Core 2の画面に「HelloWorld」

M5Stack Core 2用のライブラリを追加

M5Stack Core 2の画面などハードウェアにアクセスするために、M5Stack Core 2用のライブラリを追加します。

初めてのM5Stack C#プログラミング

M5Stackの画面に文字を表示する簡単な方法は「nanoFramework.M5Stack.Console.WriteLine」メソッドを使う方法です。
Console.WriteLineと書くとSystem.Consoleと名前が重複するのでusingでConsoleはnanoFramework.M5Stack.Consoleのことであることを宣言してあります。
gist.github.com

M5Stack Core 2のボタンに反応するように拡張

起動して「HelloWorld」と表示されるだけでは味気ないので、M5Stack Core 2についている3つのボタンをクリックしたら画面にボタンの種類を表示するようにしてみましょう。
M5Stack Core 2用のライブラリでボタンクリックイベントは「TouchEvent」としてイベントが発生します。
そして、そのイベント引数から3つのボタンのどれがクリックされたかをif文で判定します。
gist.github.com
イベントハンドラーを書き始めるとC#っぽい感じがすごくでてきますね。

Visual Studioから切り離してM5Stack Core 2だけで動作させる

Visual Studioデバッグ実行をとめるとM5Stack側も動作がとまってしまいます。
M5Stackだけで動作させるには、M5Stackで電源OFF/ONをしてアプリをリスタートしてあげると実行できます。

まとめ

ファームウェアの転送など少しだけ事前準備が必要ですが、比較的簡単に使える環境が整ってきた感じがします。
ファームウェアは1度実施すれば(更新はあとであるかもですが)、毎回する必要はないのですが、Device Explorerでつながっているかを確認するのは忘れがちで、デバッグ実行したときなどに「あれ?転送されない」と焦ることがあるので注意しましょう。
また、Device Explorerで「disable」すると、再度、enableするためにはデバイスマネージャーの方で該当COMポートを「無効」にして「有効」にしないといけないので、「なんだろ?」とか思ってDevice Explorerでdisable device watchesしないように注意しましょう。

次回

次回は、ENV.II SENSORを繋いで気圧を画面に表示するアプリをC#で作成します。
hatsune.hatenablog.jp