はつねの日記

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

.NET nanoFrameworkで色指定の定義値がRedとBlueで逆なのかもしれない

.NET nanoFrameworkで作成していて、テキストカラーを指定したいときは次のように指定します。

Console.ForegroundColor = nanoFramework.Presentation.Media.Color.White;

赤なら「Color.Red」青なら「Colre.Blue」と指定します。

M5StickC Plusだと指定したとおりの色にならない

しかし、実際に動作させてみると、Color.Redと指定したときは青文字で、Color.Blueと指定したときは赤文字で表示されます。
このColorのenumは、「nanoFramework.Graphics」クラスライブラリの「nanoFramework.Presentation.Media」名前空間に定義があります。

定義値をみてみると
Red = 0x0000ff
Blue = 0xff0000
となっています。

でもM5StackCore2だとColor.RedはRed

一方、M5StackCore2ではColor.Redと指定したときは赤文字で表示されるので、Color定義コードが間違えているわけではないようです。

結論

nanoFrameworkのDiscordで質問したところM5StackC Plusのディスプレイドライバーの問題かもとのことなので、そのあたり調査してみたいと思います。

.NET nanoFrameworkでM5StickC Plusにグラフを描画してみる

前回

hatsune.hatenablog.jp


前回は、.NET nanoFrameworkで加速度と角速度の情報を取得しました。
今回は、取得した加速度をグラフとしてM5StickC Plusの画面に描画します。

事前準備

Install the nanoFramework firmware

M5StickC PlusにはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5StickC PlusをPCに接続したら、USB Serial Portのポート番号を確認します。今回の環境では「COM6」が該当しました。

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

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

dotnet tool install --global nanoff

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

M5StickC Plusをターゲットにして「COM6」経由でnanoFrameworkをアップロードします。

nanoff --target M5StickCPlus --update --serialport COM6

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

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

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

ここまでが、M5StickC Plusを使うアプリ開発を行う上での共通の事前準備となります。

加速度をグラフ表示する

前回の記事で、M5StickC Plusには、6軸姿勢センサーMPU6886が内蔵されていて、画面を上にしておいた時の上下方向の加速度はZ軸の加速度であるという点について説明しました。

今回は、このZ軸方向の加速度を画面にグラフとして描画します。

Z軸の値について

Z軸の加速度は重力加速度を1Gとして、初期状態の測定範囲は±2Gで、0Gが自由落下状態となります。

今回のグラフについて

M5StickC Plusは縦の解像度が240dot、横の解像度が135dotとなります。
よって、±2Gの範囲を0~239dotにマッピングすればグラフが収まることになります。
1dot=0.016Gなので少しの揺れではグラフが変化しないかもしれないので、今回、グラフに描画する測定範囲は0~2Gの範囲にしてみたいと思います。
これであれば、Z軸方向には常に1Gの加速度が測定されるので、何もしなければ真ん中あたりに値がプロットされ、そこを中心として上下振動に応じたグラフの上下が描画されるはずです。

0~2Gを0~239dotにマップング

minValue=0、maxValue=2G、screenHeigh=240としたときに加速度をドットにマップングするには次のような式を使います。

(((value - minValue) * screenHeigh) / (maxValue - minValue))

グラフを描画する

「nanoFramework.M5StickCPlus」ライブラリには、点を描画するScreen.Writeメソッドはありますが、残念ながら直線などを描画するメソッドがありません。そこで、1つ前の測定値と現測定値を直線で結ぶ代わりに、その範囲を1ドットづつ点で描画することで疑似的にグラフを描画します。
今回は、20msごとにZ軸方向の加速度を取得してグラフ描画します。
gist.github.com
www.youtube.com

次回

次回はRTC(RealTimeClock)について調べてみたいと思います。
hatsune.hatenablog.jp

.NET nanoFrameworkでM5StickC Plusの加速度と角加速度を取得してみる

前回

hatsune.hatenablog.jp


前回は、.NET nanoFrameworkで電源状態を取得しました。
今回は、加速度と角速度の情報を取得します。

事前準備

Install the nanoFramework firmware

M5StickC PlusにはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5StickC PlusをPCに接続したら、USB Serial Portのポート番号を確認します。今回の環境では「COM6」が該当しました。

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

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

dotnet tool install --global nanoff

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

M5StickC Plusをターゲットにして「COM6」経由でnanoFrameworkをアップロードします。

nanoff --target M5StickCPlus --update --serialport COM6

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

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

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

ここまでが、M5StickC Plusを使うアプリ開発を行う上での共通の事前準備となります。

加速度計とジャイロ計の情報を取得する

M5StickC Plusには、6軸姿勢センサーMPU6886が内蔵されています。
6軸とは、X軸Y軸Z軸方向の加速度に加えて、X軸Y軸Z軸の角加速度も取得できるので6軸となります。

これによりどちら方向に進んでいるのか、どちら向きに(画面の)方向を変えようとしているのかが分かります。

キャリブレーション

MPU6886を使うときは起動時にキャリブレーション(補正)を実行します。
例えば、100回試行して補正するときは次のようにします。

M5StickCPlus.AccelerometerGyroscope.Calibrate(100);

もちろん補正中はM5StickC Plusを静止させておくことが必要ですから、今回は初期だけではなくM5ボタンをクリックしたときも補正できるようにしておきます。

加速度を取得する

「M5StickCPlus.AccelerometerGyroscope」で加速度を取得するには「GetAccelerometer」メソッドを実行します。

M5StickCPlus.AccelerometerGyroscope.GetAccelerometer();

初期設定の範囲は±2G(重力加速度の2倍まで測定)となります。
測定範囲は「AccelerometerScale」で±2G、±4G、±8G、±16Gから選択できます。測定範囲が大きいほど精度は下がります。

角加速度を取得する

「M5StickCPlus.AccelerometerGyroscope」で加速度を取得するには「GetGyroscope」メソッドを実行します。

M5StickCPlus.AccelerometerGyroscope.GetGyroscope();

初期設定の範囲は±250dps (degree per second=1秒間に250度の回転まで測定=1分間に約41回転以下なら測定可)となります。
測定範囲は「GyroscopeScale」で±250 dps、±500 dps、±1000 dps、±2000 dpsから選択できます。測定範囲が大きいほど精度は下がります。

コード全体(0.5秒ごとに表示)

gist.github.com

次回

次回はスクリーン描画について調べてみたいと思います。
hatsune.hatenablog.jp

2022/08/06現在のnanoFramework.M5StickCPlusライブラリのバージョンについて

2022/08/06 (日本時間は多分2022/08/07)にnanoFramework.M5StickCPlusライブラリの最新バージョンは「v1.1.32」となっています。

また、ファームウェアのバージョンは、「1.8.0.469」となります。

「nanoFramework.M5StickCPlus」ライブラリが更新されて、「M5StickCPlus.Led」のエラーが解消されました。

hatsune.hatenablog.jp
2022/7/31に公開した上記の記事の中で、「M5StickCPlus.Led」を実行するとNullエラーが発生するのでGpioのPin10を使ったコードを独自に記載してLEDを光らせるようにしていると記述しています。

この問題ですが、2022/08/03で公開された「nanoFramework.M5StickCPlus」ライブラリv1.1.26で解消しています。

該当する変更はこちらのようです。
github.com
これでもっと簡単に、M5StickC Plusで内蔵LEDを光らせることができますね。

.NET nanoFramework 話は逸れますが…

M5StackC Plusで動作するプログラムを.NET nanoFrameworkで作っていて、ちょっと困ることがあります。
.NET nanoFrameworkでは、画面のローテートとか、文字サイズの変更というArduinoではできているものがなくてちょっと困ってます。

### 画面の向き(Arduino

M5.Lcd.setRotation(rotation)

### テキストサイズ(Arduino

M5.Lcd.setTextFont(font);

LCD(ST7789V2)のデータシート読むか、Arduinoのライブラリのソースコード読むかして、.NET nanoFrameworkのM5StackC Plus用ライブラリにも実装したいところですね。

.NET nanoFrameworkでM5StickC Plusの電源状態を取得してみる

前回

hatsune.hatenablog.jp

前回は、.NET nanoFrameworkでのLEDを光らせてみました。

事前準備

Install the nanoFramework firmware

M5StickC PlusにはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5StickC PlusをPCに接続したら、USB Serial Portのポート番号を確認します。今回の環境では「COM6」が該当しました。

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

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

dotnet tool install --global nanoff

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

M5StickC Plusをターゲットにして「COM6」経由でnanoFrameworkをアップロードします。

nanoff --target M5StickCPlus --update --serialport COM6

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

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

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

直近では2022/08/03にV1.1.26へのアップデートがかかっているので、nanoFrameworkfファームウェアも必ずペアでアップデートしておきます。

ここまでが、M5StickC Plusを使うアプリ開発を行う上での共通の事前準備となります。

電源状態を取得する

M5StickC Plusの電源を管理しているPMICであるAXP192は、電源周りの情報に加えて内部温度などの計測も可能です。
AXP192からの情報はAxp192クラスで取得でき、このクラス自体は、「nanoFramework.M5StickCPlus」ライブラリでは「M5StickCPlus.Power」で参照できます。

状態取得系メソッド

「M5StickCPlus.Power」に用意されている状態取得系メソッドとしては次のようなものがあります。

GetApsVoltage

内部動作電圧を取得します。次の例では[V]で値を取得します。

M5StickCPlus.Power.GetApsVoltage().Volts

GetBatteryChargeCurrent

内蔵バッテリーへの充電電流を取得します。次の例では[mA]で値を取得します。

M5StickCPlus.Power.GetBatteryChargeCurrent().Milliamperes

GetBatteryDischargeCurrent

内蔵バッテリーからの放電電流を取得します。次の例では[mA]で値を取得します。

M5StickCPlus.Power.GetBatteryDischargeCurrent().Milliamperes

GetBatteryVoltage

内蔵バッテリーの電圧を取得します。次の例では[V]で値を取得します。

M5StickCPlus.Power.GetBatteryVoltage().Volts

GetUsbCurrentInput

USBからの給電電流を取得します。次の例では[mA]で値を取得します。

M5StickCPlus.Power.GetUsbCurrentInput().Milliamperes

GetUsbVoltageInput

USBからの給電電圧を取得します。次の例では[V]で値を取得します。

M5StickCPlus.Power.GetUsbVoltageInput().Volts

GetInternalTemperature次の例では[℃]で値を取得します。

本体内部温度を取得します。

GetInternalTemperature().DegreesCelsius

GetInputCurrent

2.54mm 8pinの[5V入力]への入力電流を取得します。次の例では[mA]で値を取得します。

M5StickCPlus.Power.GetInputCurrent().Milliamperes

GetInputVoltage

2.54mm 8pinの[5V入力]への入力電圧を取得します。次の例では[V]で値を取得します。

M5StickCPlus.Power.GetInputVoltage().Volts

USBから給電される電圧と内部温度を表示する

状態取得系メソッドを使って、電流(mA)、電圧(V)などを取得してみましょう。
gist.github.com
www.youtube.com
途中でUSBケーブルを外していますので、USB給電の電流と電圧の値が変化します。

次回

次回はAccelerometerとGyroscopeについて色々調べてみたいと思います。
hatsune.hatenablog.jp