MT3620開発ボードを有線イーサネット接続

久しぶりのAzure Sphere投稿です。

MT3620にはWi-Fi 2.4G/5Gが内蔵されているので、ネットワークにサクッと繋がるのですが、、、
展示会や勉強会でWi-Fi混雑していると、ネットワークに繋がらないことがあります。

展示物がただの置物になってしまうなんて、、、想像しただけでも怖いですよね。

そんなあなたに朗報が!

Azure Sphereの18.11で、Private Networkとして有線イーサネットが利用可能になり、
そして、19.05から、Wi-Fiの代わりに(Public Networkとして)有線イーサネットが利用可能になりました!!

Ethernet is now supported as an alternative to Wi-Fi for communicating with the Azure Sphere Security Service and your own services. The HTTPS and AzureIoT samples can now be run over Ethernet in addition to Wi-Fi. The Azure Sphere Samples repository on GitHub includes documentation on how to wire the supported MicroChip part, bring up the Ethernet interface, and connect to Azure IoT or your own web services.

原文

ハードウェア

当初は、マイクロチップ社のイーサネットコントローラを自分で結線する必要がありました。
時が経ち、現在はSeeed社からシールドが販売されています。

結線面倒なので、シールドを入手しました。

MT3620イーサネットシールド
f:id:matsujirushix:20190901140754p:plain

MT3620開発ボードに重ねると、こんな感じ。

f:id:matsujirushix:20190901141005p:plain

LED見にくくなった、、、は、まぁ良しとして、
A/Bボタンが押せなくなったのは開発時に辛いなぁ、と思うわけで。

念のため、Groveシールドが載せれるか確認したところ、これは大丈夫でした。
開発時にインプット必要だったら、Groveシールド+Grove-Buttonを追加して対処しましょう。

f:id:matsujirushix:20190901141205p:plain

ソフトウェア

念のため、デバイスOSのバージョンを確認。
Azure Sphere OS 19.07。

C:\>azsphere device show-ota-status
Your device is running Azure Sphere OS version 19.07.
The Azure Sphere Security Service is targeting this device with Azure Sphere OS version 19.07.
Your device has the expected version of the Azure Sphere OS: 19.07.
Command completed successfully in 00:00:03.3995705.

Wi-Fiは未設定状態。

C:\>azsphere device wifi list
No networks found.

有線イーサネットを有効にするプログラム、enc28j60-isu0-int5.imagepackageを生成します。

C:\>azsphere image package-board-config --preset lan-enc28j60-isu0-int5 --output enc28j60-isu0-int5.imagepackage

生成したenc28j60-isu0-int5.imagepackageを、サイドローディングでデバイスにインストールします。

C:\>azsphere device prep-debug
Getting device capability configuration for application development.
...
C:\>azsphere device sideload deploy --imagepackage enc28j60-isu0-int5.imagepackage
Deploying 'enc28j60-isu0-int5.imagepackage' to the attached device.
Image package 'enc28j60-isu0-int5.imagepackage' has been deployed to the attached device.
The device is rebooting.

アプリケーション

それでは、AzureSphereサンプルのHTTPS_Curl_Easyを動かして、実際に有線イーサネットで通信できるか確認してみましょう。

github.com

実行!!

Remote debugging from host 192.168.35.1
cURL easy interface based application starting.
This sample periodically attempts to download a webpage, using curl's 'easy' API.
Not doing download because network is not up.

Not doing download because network is not up.

通信できない模様orz
接続しているスイッチの状態を見ると、Linkのランプが点灯していません。

アプリケーションのコード上で、有線イーサネットを有効にしないといけないようです。

app_manifest.jsonCapabilities"NetworkConfig": trueを追加して、コードの最初の方に下記を追加します。

int err = Networking_SetInterfaceState("eth0", true);
if (err < 0) {
    Log_Debug("Error setting interface state %d\n", errno);
    return -1;
}

実行すると、無事、HTTPS_Curl_Easyが動いて、https://example.com/からページを取得することができました。

f:id:matsujirushix:20190910172742p:plain

わかったこと

VSCode + Remote - SSHでRaspberry Pi開発

Visual Studio Code拡張のRemote Developmentの中の1つ、Remote - SSHが、知らぬ間にARM/ARM64に対応していたので、どんな感じで動くか試しました。

VSCode拡張 Remote Development

リモートマシンのフォルダ(ディレクトリ)やDockerコンテナを、都度ファイルコピーとかの操作をすることなく遠隔で表示、編集などをするための、VSCode拡張パックです。

marketplace.visualstudio.com

これはパックで、中身は3つのVSCode拡張が入っています。

  1. Remote - SSH
    物理/仮想のリモートマシンにSSHで接続して、ソースコードを表示、編集などをすることができます。
  2. Remote - Containers
    Dockerコンテナ (略
  3. Remote - WSL
    WSL(Windows Subsystem for Linux) (略

Remote DevelopmentできるLinux

リリース当初はx86_64しか対応していなかったと思うのですが、、、
なにげなくドキュメントを見ていたら、ARM/ARM64が追加されていました!!

code.visualstudio.com

f:id:matsujirushix:20190908192114p:plain

こりゃ、いいじゃん!
ってことで、試すことに。

いざ接続!

VSCodeを最新(1.38.0)にして、Remote - SSHが最新(0.46.0)になっていることを確認。

configをこんな感じに設定して、
f:id:matsujirushix:20190908193455p:plain

Remote ExplorerRaspberry Piに接続しようとすると、自動的にVSCode ServerをRaspberry Piにインストールされて、
f:id:matsujirushix:20190908202643p:plain

Raspberry Piのファイルを、母艦から編集できるようになりました。
f:id:matsujirushix:20190908203833p:plain

IntelliSense

何故か、IntelliSenseが機能しない。

VSCodeのExtensionsを見ると、SSH: RASPILOCALに分かれていて、LOCALのC# ExtensionにInstall in SSH: raspiの文字が。
f:id:matsujirushix:20190908204123p:plain

なんだろ、VSCode Server側にExtensionが入る必要があるのかな?

Install in SSH: raspiをクリックしてみたところ、SSH: RASPIのところにC# Extensionが追加された、
f:id:matsujirushix:20190908204412p:plain

けど、IntelliSense機能せずorz

Terminal

ターミナルは普通に動きます。
f:id:matsujirushix:20190908204816p:plain

Debugging

うーむ、launch.jsonをがんばって設定してみるが、動かん。
f:id:matsujirushix:20190908210216p:plain

Issue: Feature request: support Linux ARM

余談

言語がC#(NETCore)じゃなくてPythonだと、デバッグもできるみたい。(Scott Hanselmanのブログ)

.NET Core 3.0 SDKをRaspberry Piで動かしてみた

OSインストール

最新のRaspbianをダウンロードしてmicroSD焼きます。
現時点の最新、2019-07-10-raspbian-buster-lite.imgを使いました。
あと、sudo apt updatesudo apt upgradeも忘れずに実行。

NETCore 3.0インストール

最新のNET Core 3.0をダウンロード、インストールします。
現時点の最新はv3.0.100-preview9

まずはダウンロード。

wget https://download.visualstudio.microsoft.com/download/pr/33387ff2-7687-4564-a90d-28b9539e0d3b/f75a063b80fc5a94a4d35689aee8b108/dotnet-sdk-3.0.100-preview9-014004-linux-arm.tar.gz

RaspbianはARM32なので、Linux.NETCore BinariesにあるARM32をクリックすると、ダウンロードURLを得ることができます。

約113Mbytesのファイルでした。

次に、ダウンロードしたファイルを解凍します。

mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100-preview9-014004-linux-arm.tar.gz -C $HOME/dotnet

最後に、環境変数DOTNET_ROOTPATHに、解凍したディレクトリを設定します。
これは.bashrcの最後に以下を追加してログインし直し。

export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

Hello World!

.NETCoreでコンパイル、実行できるか確認します。

dotnet new console -o myApp
cd myApp
dotnet run

Hello World!と表示されれば正常です。

Single-file executables

2回目以降でも、相変わらず起動に時間がかかるのですが、
f:id:matsujirushix:20190908165253p:plain

.NETCore3から使えるようになった(?)、Single-file executablesで、どれくらい起動時間が短縮されるか見てみましょう。

dotnet publish /p:PublishSingleFile=trueで実行ファイルを生成すると、
f:id:matsujirushix:20190908165825p:plain

エラーorz

あ、-rオプションでRuntime Identifierというのを指定する必要があるみたい。

気を取り直して、リトライ。

dotnet publish -r linux-arm /p:PublishSingleFile=true

できたっぽい。
f:id:matsujirushix:20190908170752p:plain

起動がクッソ速くなった。
f:id:matsujirushix:20190908170914p:plain

仕組みについては、ここに書いてあるようです。

ML.NET Object Detection

ML.NET Samplesにある、Object Detectionを動かしてみました。

github.com

Object Detectionサンプル

学習済みモデルTiny Yolo2を.NET Coreコンソールアプリ(+ML.NET)で動かすサンプルプログラムです。

実行

Visual StudioObjectDetection.slnを開いて実行するだけ。

こんな感じで、画像に含まれるオブジェクトをコンソールに表示します。

=====Identify the objects in the images=====

.....The objects in the image image1.jpg are detected as below....
car and its Confidence score: 0.9697261
car and its Confidence score: 0.6674223
person and its Confidence score: 0.5226038
car and its Confidence score: 0.5224892
car and its Confidence score: 0.4675334

.....The objects in the image image2.jpg are detected as below....
cat and its Confidence score: 0.6461141
cat and its Confidence score: 0.6400049

.....The objects in the image image3.jpg are detected as below....
chair and its Confidence score: 0.8405777
chair and its Confidence score: 0.7963627
diningtable and its Confidence score: 0.6056049
diningtable and its Confidence score: 0.3737413

.....The objects in the image image4.jpg are detected as below....
dog and its Confidence score: 0.7608147
person and its Confidence score: 0.6321325
dog and its Confidence score: 0.5967442
person and its Confidence score: 0.5730396
person and its Confidence score: 0.5551758

========= End of Process..Hit any Key ========

また、assets/images/output フォルダに、オブジェクトを検知した結果画像を保存します。

f:id:matsujirushix:20190901115438p:plain

処理時間

ここかな?というところに、Stopwatchを追加して測りました。

var sw = new System.Diagnostics.Stopwatch();
sw.Restart();
IList<YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i);
sw.Stop();
Console.WriteLine($"Elapsed time = {sw.ElapsedMilliseconds}");

Surface Pro 4Core i7-6650U@2.20GHz)で、この結果でした。

Elapsed time = 1485
.....The objects in the image image1.jpg are detected as below....

Elapsed time = 1300
.....The objects in the image image2.jpg are detected as below....

Elapsed time = 1299
.....The objects in the image image3.jpg are detected as below....

Elapsed time = 1277
.....The objects in the image image4.jpg are detected as below....

Learn ML.NETのGet started in 10 minutesをやってみた

某氏と話していて「ML.NETいけるんじゃね?」(←だいぶ省略)と興味が湧いてきたのだが、Machine Learningよくわからないマンなので、、、
とりあえず、Get startedがあったので、Windowsでやってみました。

dotnet.microsoft.com

  1. Visual Studioをインストール → VS2019 16.2.3
  2. ML.NET Model Builder拡張をインストール → 16.0.1908.1402
  3. コンソールアプリ(.NET Core)プロジェクトを新規作成 → このときにソリューションとプロジェクトを同じディレクトリに配置しないこと
  4. プロジェクトにMachine Learningを追加 → Sentiment Analysisを選択

Time to trainの時間内に、さまざまなModelを試すみたい。

10秒
f:id:matsujirushix:20190831111821p:plain

30秒
f:id:matsujirushix:20190831111956p:plain

60秒
f:id:matsujirushix:20190831112732p:plain

最後にCodeを選択すると、自動的にソリューションにプロジェクトが2つ追加されました。

f:id:matsujirushix:20190831113410p:plain

ML.NET Model BuilderでTrainして、その結果がmyMLAppML.Modelライブラリとして生成されているようです。

で、myMLAppML.Modelライブラリを利用して推論するサンプルアプリがmyMLAppML.ConsoleAppアプリ

myMLAppML.ConsoleAppアプリのProgram.csを見ると、

MLContext mlContext = new MLContext();
ITransformer mlModel = mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH), out DataViewSchema inputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

で、MODEL_FILEPATHからpredEngineを生成して、

ModelInput sampleData = CreateSingleDataSample(mlContext, DATA_FILEPATH);
ModelOutput predictionResult = predEngine.Predict(sampleData);

で、ModelInputをpredEngineに通してModelOutputを得ています。

MODEL_FILEPATHはMLModel.zipを指しており、これが学習済みモデルのようです。

MLModel.zipの中身は、

f:id:matsujirushix:20190831144210p:plain

なんだろ?
ML.NETのクラスをシリアライズした感じなのかな?

Visual Studioさえ入っていれば、VS拡張でササッとできてお手軽でした。

【メモ】IoT Plug and Playのデバイス実装コード

IoT Plug and PlayのAZ3166向けサンプルコードを調査。

github.com

★ ... Azure IoT SDK for C
☆ ... Azure IoT Device Workbench生成コード

main.ino

setup()
  connectIoTService()
    registerDeviceRetry()
      registerDevice()
        IoTHub_Init()★
        prov_dev_set_symmetric_key_info()★
        prov_dev_security_init()★
        Prov_Device_LL_Create()★
        Prov_Device_LL_Register_Device()★
        Prov_Device_LL_DoWork()★
        IoTHub_Deinit()★
    pnp_device_initialize()☆ ---> pnp_device.h/.c

loop()
  pnp_device_run()☆ ---> pnp_device.h/.c
  is_error_max()☆
  invokeDevKitPeripheral()

pnp_device.h/.c

pnp_device_initialize()
  tickcounter_create()★
  DigitalTwinClientHelper_InitializeDeviceHandle()☆
    IoTHub_Init()★
    IoTHubDeviceClient_LL_CreateFromConnectionString()★
    DigitalTwin_DeviceClient_LL_CreateFromDeviceHandle()★
  DeviceinfoInterface_Create()☆
    DigitalTwin_InterfaceClient_Create()★
  SensorsInterface_Create()☆
    DigitalTwin_InterfaceClient_Create()★
  LedsInterface_Create()☆
    DigitalTwin_InterfaceClient_Create()★
    DigitalTwin_InterfaceClient_SetCommandsCallback()★
  ScreenInterface_Create()☆
    DigitalTwin_InterfaceClient_Create()★
    DigitalTwin_InterfaceClient_SetCommandsCallback()★
  SettingsInterface_Create()☆
    DigitalTwin_InterfaceClient_Create()★
    DigitalTwin_InterfaceClient_SetPropertiesUpdatedCallback()★
  DigitalTwinClientHelper_RegisterInterfacesAndWait()☆
    DigitalTwin_DeviceClient_LL_RegisterInterfacesAsync()★
    DigitalTwin_DeviceClient_LL_DoWork()★
  DigitalTwinClientHelper_Check()☆
    DigitalTwin_DeviceClient_LL_DoWork()★
  DeviceinfoInterface_Property_ReportAll()☆
  tickcounter_get_current_ms()★
pnp_device_run()
  SensorsInterface_Telemetry_SendAll()☆
  DigitalTwinClientHelper_Check()☆
pnp_device_close()

digitaltwin_device_client_ll.h

DigitalTwin_DeviceClient_LL_CreateFromDeviceHandle()
DigitalTwin_DeviceClient_LL_RegisterInterfacesAsync()
DigitalTwin_DeviceClient_LL_DoWork()
DigitalTwin_DeviceClient_LL_Destroy()

digialtwin_interface_client.h

DigitalTwin_InterfaceClient_Create()
DigitalTwin_InterfaceClient_SetPropertiesUpdatedCallback()
DigitalTwin_InterfaceClient_SetCommandsCallback()
DigitalTwin_InterfaceClient_SendTelemetryAsync()
DigitalTwin_InterfaceClient_ReportPropertyAsync()
DigitalTwin_InterfaceClient_UpdateAsyncCommandStatusAsync()
DigitalTwin_InterfaceClient_Destroy()

考察

  • スケッチ -> Azure IoT Device Workbench生成コード -> Azure IoT SDK for C
  • 接続は、Privisoning -> IoTHubDeviceClient -> DigitalTwinDeviceClient
  • 低レベルは従来のIoTHubDeviceClientで、その上にDigitalTwinDeviceClientの模様
  • (Device Capability Modelから)Azure IoT Device Workbenchで生成したコードを使うと、項目毎のコールバック実装になる。(mxchip_iot_devkit_impl.h/.c)

Mbed Studioを使ってみた

前提条件

Windowsの場合は、Gitをインストールしておく必要があります。参照

サポートしているボード

今は、Mbed Enabledのボード全てではなく、一部のボードのみ対応しているようです。参照
何気に、Seeed Wio 3Gも入っていますね!

STMのNucleo/Discoveryシリーズが少ないのは意外でした。

インストール

ここからダウンロードして実行するだけ。
現時点のダウンロードファイルはMbedStudio-0.5.3.exeで、約800MBでした。

Getting Started

使い方をさらっと学ぶために、Getting startedをやってみましょう。

  1. ワークスペースを指定
  2. プログラムを作成(mbed-os-example-blinkyを選択)
  3. ターゲットを選択(FRDM-K64F(K64F)を選択)
  4. プロファイルを選択(Debugを選択)
  5. ビルド
  6. 実行

f:id:matsujirushix:20190824204237p:plain

うーん、GUI快適♪

感じたこと

  • mbed-cliも簡単にインストールできるようになっているようですが、こちらのほうがツールが別々にインストールされず1パックになっているので良さげ。
  • やっぱGUI使いやすい。
  • mbed-osのインポートやバージョン切り替えがメチャ早。(メニューにLibrary cacheという文字があるが何者か分からず。mbed-cliのrepository cachingのことかな?)
  • VSCodeのExtensionを追加することができない。これは悲しい。

結論は、かなりオススメなツールでした。
しばらく使ってみようと思います。