はつねの日記

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

M5Stack+距離センサーで距離を測ってみた

はじめに

M5 Stackとは

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

M5Stack Core 2とは

M5Stack Coreシリーズの2023年7月時点での最新世代は、第三世代のESP32であるESP32S3を搭載したM5Stack Core S3となります。
M5Stack CoreS3 ESP32S3 IoT開発キットwww.switch-science.com
今回使うM5Stack Core 2は、その1世代前(第二世代)のCoreデバイスとなります。
M5Stack Core2 IoT開発キットwww.switch-science.com
1世代前ですがM5Stack Core S3と併売もされている現役世代となります(価格も安めです)。

.NET nanoFrameworkとは

.NET nanoFrameworkは、ESP32などのMCU(マイクロコントローラユニット)などの組込み用デバイス向けに.NETアプリの作成を可能にする無償のオープンソースプラットフォームです。
https://github.com/nanoframework/Home

C# + .NET 6でデスクトップアプリを作成した経験が組込みシステム開発で活かせることを想定しているそうです。

.NET Core IoTとの違いは?

.NET環境での小型デバイス向けの開発には、.NET Core IoTと呼ばれているものもあります。
https://learn.microsoft.com/en-us/shows/On-NET/IoT-support-for-NET-Core

.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 Core 2に使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

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

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

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

dotnet tool install --global nanoff

すでにインストールされているときに更新したいときは次のように実行します。

dotnet tool update --global nanoff

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

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

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

センサーについて

この記事で使用する距離センサーは、TFMini-Sを使います。
TFMini-S - Micro LiDAR Modulewww.switch-science.com

TFMini-SはToF(Time of Flight)赤外線距離センサーで10 cmから12 mまでの対象物との距離を測ることができます。
インターフェースはUARTまたはI2Cとなります。
M5Stack Core 2のPORT.A端子は、I2C規格のシリアル通信端子なので、TFMini-SのインターフェースをI2Cに切り替えれば接続できそうですが、次のような手間がかかります。

  1. インターフェースの切り替えには、UARTに接続してコマンドを投入する必要がある
  2. TFMini-Sの端子は「Qwiic」規格の端子のためGrove互換端子であるPORT.A(I2C)端子とはサイズが異なる。

そのため、今回はUARTのままにしておいて、M5Stack Core 2のM-Busに接続することにします。
TFMini-S M5Stack Core 2
① 黒 GND GND
② 赤 5V 5V
③ 白 RXD G14:TXD2
④ 緑 TXD G13:RXD2

M5StackでTFMini-Sの測定値を表示する

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

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

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

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

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

Device ExplorerでM5Core2を選択

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

Hello World

M5Stackの画面に文字を表示する簡単な方法は「nanoFramework.M5Stack.Console.WriteLine」メソッドを使う方法です。
Console.WriteLineと書くとSystem.Consoleと名前が重複するのでusingでConsoleはnanoFramework.M5Stack.Consoleのことであることを宣言してあります。
また、以前はフォントカラーの定義は独自の「nanoFramework.Presentation.Media.Color」で指定する必要がありましたが、最新のものでは「 System.Drawing.Color」で指定できるようになっており、便利さが向上しています。
gist.github.com

このコードを実行すれば、M5Stack Core 2の画面に「HelloWorld」の白文字で表示されます。

TFMini-Sからセンサー値をよみとる

TXD2/RXD2からあたりを取得するためには、「COM2」を指定してシリアルポートをオープンします。

TFMiniS = new SerialPort("COM2", 115200, Parity.None, 8, StopBits.One);

マニュアルによればTFMiniSのシリアル通信データは9バイトで1つの意味をなすとあります。

このデータフォーマットによれば、0x59 0x59という2バイトのデータを受信したら、そのあとの7バイトがセンサー値ということになります。
3バイト目が距離の下位1バイト、4バイト目が上位1バイトなので距離は次のように取得できます。

distance = (buffers[3] << 8) + buffers[2];

単位は「cm」となります。
最後の1バイトはチェックサムとなり、1~8バイト目の値を足した結果の下位1バイトとチェックサムが一致していれば有効なデータとなります。
gist.github.com

まとめ

シリアル通信なのでどうしてもデータ開始の「0x59 0x59」を見つけて、そこから7バイト読み取ってのような操作が必要です。
このあたりはI2Cモードにしたり、キャラクタモード(距離がm単位の数字として返却される)の方が扱いやすいかもしれません。
また、M-Busにジャンパーコードで刺す形にしているので、このあたりも改善でしていきたいですね。

Azure OpenAI ServiceとAzure AI SpeechにOpenAI Whisperがやってくる!

techcommunity.microsoft.com
ChatGPTで有名なOpenAI社には、音声認識モデル「Whisper」があります。
Whisperで音声を認識するためには1センテンスくらいの長さの音声を渡す必要があるため、リアルタイム音声認識に利用する(少し聞いてから文字がでるみたいなUXは実現できるとしても)よりも、録音ファイルを渡して文字起こししてもらうような用途に向いています。

そんなWhisperですが、まもなくAzure OpenAI ServiceとAzure AI Speechにプレビュー提供されるようです。

Azure上で提供されるという事ですから、利用したとしても音声データなどは再利用されず、企業でも安心して利用できるようになりそうです。

Azure OpenAI Service

プレビュー提供が開始されるとAzure OpenAI Serviceに「OpenAI Whisper」 モデルが追加されます。
そのモデルを指定してREST APIで利用ができるようになります。
また、Azure OpenAI Studioでも試せるようになります。

Azure AI Speech

Azure AI Speechでは、Azure OpenAI Serviceをそのまま使った場合に比べていくつかの工夫が加味されたものが使えます。

  • 非同期処理
  • 話者紐付け(ダイアライゼーション)
  • カスタマイズ(詳細はこれから調べます)
  • 大きな録音ファイル(1GB)のサポート

まとめ

プレビュー利用開始が楽しみですね。

Microsoft MVP for Windows Developmentを再受賞しました。

2023-2024 Microsoft MVP for Windows Development & Mixed Realiyを受賞しました。
2008年から16年連続となります。

オフラインイベントなども増えてきましたし、オンライン中心からの再シフトなどもあるかもしれませんが、状況に応じて自分ができる範囲で無理せずコミュニティ活動を続けていけたらと思います。

今年は、.NET 6/7/8、.NET MAUI、AzureのAI関係を基軸にして、XREALあたりのアウトプットを増やしていけたらと思っています。
引き続きよろしくお願いします。


MVPサイトの表記はWindows DevelopmentのみですがCongratulationメールではダブルカテゴリ書かれていました。

Dev Homeのプレビュー提供が始まりました!


Dev Homeは、開発者向けのダッシュボードアプリです。
Dev Homeを使えば

  • バイスのセットアップ
  • GitHubと連携してIssueやプルリクの確認・管理
  • Windows設定の最適化

などが行えます。

バイスのセットアップ

開発に必要なIDE、エディタ、SDK、ツールなどをまとめてインストールできます。

インストール済のものも検出できるので、開発チームで必要なアプリ一覧などを用意しておけば、あとは足りなものをここからインストールすればOKです。
残念なことに(?)Visual StudioをCommunityが候補にのっていますが、Enterpriseが入っていても「インストール済」と認定されない点です。このあたりはEdition関係なくVisual Studioと検出してくれるといいですね。
プレビュー版ですので、フィードバックしておくのがいいでしょう。
フィードバックボタンも左側のメニューアイコンにちゃんとありますね。

GitHubと連携してIssueやプルリクの確認・管理


このあたりがダッシュボードでみれると便利ですね。

Windows設定の最適化

Microsoft Build 2023 Book of Newsが公開されましたね

news.microsoft.com
今回のBuildの見どころがまとまった資料「Book of News」が公開されました。
その冒頭では次のように書かれています。

Microsoft Buildは、開発者のために設計されたイベントです。AIがテクノロジー分野の話題を独占している今、今年のイベントでAIが重要な役割を果たすことは理にかなっています。

こちらの日本語コンテンツですが英語コンテンツを自動翻訳した日本語訳とは異なっていますので、人による翻訳・もしくは監修が入ってそうですね。

Azure Cognitive Service for Language

Book of Newsによれば「Azure Cognitive Service for Language」の様々なところに「Azure OpenAI Service」による機能がはいってくるそうです。
すでにプレビュー中のものに加えて、私が注目したのは「開発者が要約をカスタマイズする機能」です。
さらに

一般提供開始を間近に控えたドキュメントと会話の要約は、すぐに使えるようになります。これにより、お客様は、Azure Service Level Agreementsやデータセキュリティなど、Azureのエンタープライズグレードの準備に支えられながら、ユースケースを本番環境で展開することができます。

とのことです。
要約機能はタイパ(タイムパフォーマンス)を向上させますから、これは提供が待ち遠しいですね。

ACS Translator plugin for Azure OpenAI Service

ACS=Azure Communication ServiceのプラグインとしてOpen AIを使った翻訳機能がプライベートプレビューとして提供されるようです。
まだ詳細は未確認ですが、Teamsの裏側のようなACSにこのプラグインがつくというのは多言語コミュニケーション通信アプリにとって非常に強力な翻訳機能がつけれることを意味しているかもですね。
learn.microsoft.com