Azure Sphere 20.07がリリース

Azure Sphereの20.07がリリースされました。

ここ最近は、アップデートに関してブログを書いていませんでしたが、、、気になる機能が追加されたので、久しぶりに書いておきたいと思います。(気になる機能は太字)

docs.microsoft.com

ネットワーク機能

静的IPアドレス、ネットワーク診断APIネットワーク診断コマンドが追加されました。

時々、なぜかネットワーク機能が有効にならないときがあって(Networking_IsNetworkingReady())、azsphere device wifi listコマンドぐらいしか確認する手段が無くて詰んでいたのですが、こういうときに有効と思われるネットワーク診断コマンドazsphere device networkが追加されました。

f:id:matsujirushix:20200802212526p:plain

show-statusshow-diagnosticsが気になります。

show-statusを実行してみると、デバイスが認証済みかどうかと、時刻同期の状態が表示されました。

C:\>azsphere device network show-status
Is device authentication ready: False
Network time sync status      : incomplete


C:\>

Wi-Fiに接続設定して、再度、show-statusを実行してみると、デバイス認証されていることが表示されました。

C:\>azsphere device network show-status
Is device authentication ready: True
Network time sync status      : complete


C:\>

どうやら、アプリケーションをデプロイしなくても、コマンドラインでNetworking_IsNetworkingReady()が確認できるようになった感じです。

それでは、show-diagnosticsを実行してみます。

C:\>azsphere device network show-diagnostics
No errors logged.


C:\>

あ、、、そういう感じなんですね、、、。
ちょっと寂しい。

コンテナー

Azure Sphereアプリをビルドするコンテナーイメージが提供されました。

Visual StudioVisual Studio Codeのテンプレート

Visual StudioVisual Studio Codeに、2つのプロジェクトテンプレートが入りました。

テナント証明書の更新

Azure Sphereテナント証明書は2年間有効です。初期ユーザーの証明書の有効期限が切れますので、更新する方法とタイミングがドキュメントに掲載されました。

本番運用では超重要事項。
あとで読む。

wolfSSL

Azure Sphereアプリケーションでwolf SSL client-side TLS APIを使用できるようになりました。

PCからデバイスへの通信の安定性

WindowsのFTDIドライバーに関連するPCとデバイス間の通信の安定性に関する問題に対して、バグ修正と機能強化が含まれました。

遭遇したこと無いです、、、

パブリックAPI

Azure Sphere Public APIに機能追加されました。
* バイスグループを削除
* 製品を削除する
* テナント証明書の取得
* テナント証明書チェーンを取得する
* 所有証明書の証明を取得する
* テナント証明書の一覧表示

うぉーーーー、これは胸アツ。
バイスグループやプロダクトを削除するAPIが追加になりました。

azsphereコマンドには未だ上記機能は無いので、デバイスグループやプロダクトを削除する唯一の方法ですね。

ADCとPWM

ADCとPWMのAPIが、βからLTSに昇格されました。

リアルタイムアプリケーション開発

RTApp開発がLTSに昇格されました。

これで安心してRTApp使えるようになりました。

ハードウェア定義

既定のハードウェア定義がAzure Sphere SDKに含まれるようになりました。

いままではazure-sphere-samplesに入っていて、自身のプロジェクトでハードウェア定義を使うときはコピーしなければいけませんでしたが、一般的なものがSDKに同封になりました。

うむ、、、切り出して公開していたの、不要になったな、、、。

公開しているプロジェクトも、ハードウェア定義を利用しているものは修正したほうが良さそう。

サンプルアプリケーション

Azure IoT サンプルアプリケーションが更新されました。

起動タイミング

起動が約750ミリ秒短縮されました。

GNU Armパス検出

Visual StudioVisual Studio CodeのAzure Sphere拡張が、GNU Armパスの場所を検出する手順が同じになりました。

製造サンプル

(割愛)

Azure IoT C SDKのサポート

Azure IoT C SDKのlts_02_2020をサポートされるようになりました。

ほぅ。
あとで調べる。

Linuxカーネル

Linuxカーネルのバージョンが5.4に更新されました。

Arduinoのシリアルプロッタ

Arduino IDEについているシリアルプロッタ、便利ですよね。
ときどき、マイコンのデータをパッとグラフにしたいときに使っています。

はて、いったいどういうフォーマットのシリアルデータを受け付けるんだろうか、、、と思い、調べました。

公式のドキュメントがなかなか見つからず、、、いろいろと探し回ったところ、ここにありました。

github.com

シリアルプロッタのプロトコル

一時点のデータ群をメッセージといいます。
メッセージには、複数のパートを含めることができ、パートラベルラベルと値のいずれかです。

メッセージの終端 '\n'
(メッセージ内の)パートのセパレータ ' ' or '\t' or ','
ラベルと値のセパレータ ':'

さらに、ラベルのみのメッセージで、ラベルを指定できます。(CSVヘッダースタイルと言うらしい)

コード例

CSV形式とラベル付加形式を試しました。
CSV形式だと、最初のメッセージ(ラベル)をシリアルプロッタが正しく受信できないとラベルが表示されません。
ラベル付加形式では、各値にラベルが付いているので、上記のような不安はありませんが、、、各値にラベルが付いているので通信量が多いです。
どっちも一長一短なので、好みで選べば良いと思います。(わたしはラベル付加形式かな。)

CSV形式

example1.ino:

#define SEPARATOR   ','

int count = 0;

void setup() {
  Serial.begin(115200);
  Serial.print("a");
  Serial.print(SEPARATOR);
  Serial.print("b");
  Serial.println();
}

void loop() {
  double a = sin(count * PI / 180);
  double b = cos(count * PI / 180);
  ++count;
  
  Serial.print(a);
  Serial.print(SEPARATOR);
  Serial.print(b);
  Serial.println();

  delay(10);
}

シリアル出力:

a,b
0.00,1.00
0.02,1.00
0.03,1.00
...

シリアルプロッタ表示:
f:id:matsujirushix:20200723135827p:plain

ラベル付加形式

example2.ino:

#define SEPARATOR   ','

int count = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  double a = sin(count * PI / 180);
  double b = cos(count * PI / 180);
  ++count;
  
  Serial.print("a:");
  Serial.print(a);
  Serial.print(SEPARATOR);
  Serial.print("b:");
  Serial.print(b);
  Serial.println();

  delay(10);
}

シリアル出力:

a:0.00,b:1.00
a:0.02,b:1.00
a:0.03,b:1.00
...

シリアルプロッタ表示:
f:id:matsujirushix:20200723140159p:plain

おまけ

データの歯抜けがあったときに、きちんとグラフが表示されるのか試したところ、、、あぁ、なるほどな表示でしたw(凡例の表示もなんともいえない動き)

example3.ino:

#define SEPARATOR   ','

int count = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  double a = sin(count * PI / 180);
  double b = cos(count * PI / 180);
  ++count;
  
  Serial.print("a:");
  Serial.print(a);
  Serial.print(SEPARATOR);
  if (count % 15 == 0) {
    Serial.print("b:");
    Serial.print(b);
  }
  Serial.print(SEPARATOR);
  Serial.print("c:");
  Serial.print(b);
  Serial.println();

  delay(10);
}

シリアルプロッタ表示:
f:id:matsujirushix:20200723140820p:plain

参考

メッセージのパース(解析)コードはこちら

IoT Centralのデバイスコード自動生成

久しぶりにAzure IoT Centralをイジっていたら、、、テスト用のデバイスコードを自動生成する機能がありましたので試しました。

この機能、まぁまぁ以前からあったのかもしれません。気づいていませんでした。

Azure IoT Centralを立てる

料金プランの内容が補記されてた。これは分かりやすくてグー。
そうそう、そういえば今年の春ぐらいから(?)、場所日本が選べるようになったんですよね。

f:id:matsujirushix:20200712205224p:plain

バイステンプレートを追加する

次に、デバイステンプレートを追加します。
今回は、実デバイスを用意してつなげるわけではないので、、、あらかじめ用意されているAzure Sphere Sample Deviceを追加することに。
バイステンプレート > 新規 > Azure Sphere Sample Device を選択、作成します。

f:id:matsujirushix:20200712210008p:plain

テスト用のデバイスコードを生成する

で、ここからが本題。

作成したデバイステンプレートのテストデバイスの管理で、テストデバイスのコードを自動生成、ダウンロードします。

f:id:matsujirushix:20200712210406p:plain

現時点、選べる言語は4種類。

ここでは、CSharpを選んでみました。

f:id:matsujirushix:20200712210526p:plain

ダウンロードしたzipの中に、C#プロジェクトファイル(.csproj)があります。

f:id:matsujirushix:20200712210800p:plain

バイスコードを実行

Visual StudioC#プロジェクトファイルを開いて実行してみると、、、

黒画面が起動して、Sending telemetry ...と、送信されているっぽいメッセージが表示されて、

f:id:matsujirushix:20200712210953p:plain

Azure IoT Centralのグラフに値が表示されました!

f:id:matsujirushix:20200712211426p:plain

バイスコードの中身

ふむふむ。.NET Core 3.1。

f:id:matsujirushix:20200712211929p:plain

Azure IoT Centralへは、AMQPプロトコルで対称キー(!= クライアント証明書)を使ってAzure IoT DPSに接続している。

f:id:matsujirushix:20200712212205p:plain

なので、Azure IoT Centralで事前にデバイスを作成しておく必要は無い。

500[ms] * 20 = 10秒周期にTelemetryとDeviceTwinを送信していて、

f:id:matsujirushix:20200712212502p:plain

Telemetryの値は固定値。

f:id:matsujirushix:20200712212611p:plain

まとめ

  • バイステンプレートに合わせた(テスト用途の)デバイスコードが自動生成できる。
  • Azure IoT DPSに接続。事前にデバイスの追加は不要。
  • 認証は対称キー。(クライアント証明書ではない。)
  • データは固定値。周期は10秒。

バイスを作る前に、Azure IoT Centralのデバイステンプレートを作って見た目とか動きを確認するときに使うと良さそう。

Azure Sphereのアプリケーションデプロイ

Azure Sphereの特徴の一つに、アプリケーションのデプロイ機能があります。 一般にOver-the-Air(OTA)とか、自動更新などと言われるもので、デバイスのアプリケーションを遠隔で入れ替えることができる機能です。
Azure Sphereでは、チップ上で動いているAzure Sphere OSが定期的にクラウド、Azure Sphere Security Service(AS3)をチェックして、新しいOSやアプリケーションが有ったときにダウンロードして入れ替えることで実現しています。

で、アプリケーションを更新したいときはAS3にアップロードするわけですが、、、まー、構造がややこしい。どれくらいややこしいかというと、これくらい。(松岡調べ)

f:id:matsujirushix:20200601211955p:plain

まー、ややこしい。(2度目)

こんな声が届いたのか分かりませんが、ちょっと前にこのあたりの構造が大幅に変更されシンプルになりました。

変更後がこんな感じ。(松岡調べ)

f:id:matsujirushix:20200601212416p:plain

シンプルにはなったものの、まだ把握不十分な感じもしていてモヤモヤとしていたのですが、、、
先日、Azure Sphere Public APIなるものが公開されて、これを見てみたところ、スッキリ・バッチリと構造を理解することができました。

結果がこちら。(松岡調べw)

f:id:matsujirushix:20200601210818p:plain

  • 製品をProductとする。
  • アプリケーションの配布単位にDevice Groupを設ける。
  • DeviceDevice Groupと紐づいている。
  • Device Groupに配布するアプリケーションDeploymentを紐づける。
  • と、結果としてデバイスDeviceに紐づいたDevice Group、に紐づいたDeploymentImageをインストールする。

です。

さらに細かな点を言うと、

  • 内部はIDで管理。(なので、名前が重複しても関係ない)
  • DeviceGroupは、複数Productで兼用されない。
  • DeviceGroupからDeploymentのカレント参照は1つのみ。

でした。

あー、スッキリした。

Azure Sphere SDKのバージョンアップに注意を!

縁あって参加させていただいた、AVNETさんのセミナーで気になるお話しが。

20.04から、Azure Sphere SDKVisual Studio拡張が別々になったので(略

別々!?

いままでは、Azure Sphere SDKをインストールすれば、Azure SphereVisual Studio拡張も自動的にインストールされていましたが、どうやら別々に提供されるようになったみたい。
知らなかった...

というわけで、手元の環境を確認することにします。

現在のバージョン

Azure Sphere SDK

コントロールパネルで、Azure Sphere SDKのバージョンを確認。
20.4.7.42974なので、現在の最新でした。

f:id:matsujirushix:20200516204037p:plain

azsphere

azsphereコマンドのバージョンを確認。
こちらも、20.4.7.42974です。

f:id:matsujirushix:20200516204252p:plain

Visual Studio Extension for Azure Sphere

Visual Studioで、Azure SphereVisual Studio拡張のバージョンを確認。
20.1.7.495...

f:id:matsujirushix:20200516204534p:plain

古 い ぞ ! !

この情報はちゃんと公開されているのか?

ちゃんと公開されていました...ハイ。

20.04概要に、

f:id:matsujirushix:20200516204948p:plain

Visual Studio用とVSCode用のSDKを同一のSDKにして、Visual Studio拡張やVSCode拡張はマーケットプレイスで配布になったと、ちゃんと書いてあります

Visual Studio Extension for Azure Sphereの最新バージョンは?

Visual Studioマーケットプレイスを覗くと、、、20.4.7.49790でした。

f:id:matsujirushix:20200516205324p:plain

Visual Studio Extension for Azure Sphereの更新

これをポチっとやればOK。

f:id:matsujirushix:20200516205605p:plain

教訓。
What's newは隅々確認しましょう。

Seeeduino XIAOのタッチ入力

Seeed K.K. エンジニアブログにも記事をポストしていますが、雑多な感じのものはこっちの個人ブログへポストすることにします。

タッチ入力を、ちょー軽く確認しました。

ライブラリの追加が必要

Seeeduino XIAOのArduinoパッケージには、タッチ入力の機能が含まれていません。

ググってみたところ、Adafruit_FreeTouchで出来るようです。

Arduinoライブラリマネージャで出てくるので、ここからインストールしました。

f:id:matsujirushix:20200423173122p:plain

ソフトウェア

Adafruit_FreeTouchに同封のサンプルコードを修正して、A0~A10をシリアルプロッタに出力しました。

(具体的なコードは省略w)

結果

f:id:matsujirushix:20200423173325p:plain

凡例が間違っているのは無視してください(汗

A0~A1、A6~10が、タッチ入力で使えました。
(A2~A5は使えませんでした。)

f:id:matsujirushix:20200423173627p:plain

Seeeduino XIAOのデジタル入力

Seeed K.K. エンジニアブログにも記事をポストしていますが、雑多な感じのものはこっちの個人ブログへポストすることにします。

今回は、デジタル入力を確認しましょう。

ハードウェア

デジタル出力のときと同様、(電源を除いた)全ピンで入力できるようです。

f:id:matsujirushix:20200418162232p:plain

なので、D0にタクトスイッチ経由で3V3(3.3V)に結線し、かつ、D0を抵抗経由でGNDに結線しました。

f:id:matsujirushix:20200418200744p:plain

ソフトウェア

タクトスイッチを押したときに、オンボードの黄色LEDを点灯するコードを作成しました。
オンボードの黄色LEDは13で、論理が反対(LOWで点灯)なので注意してください。

constexpr int BTN = 0;  // D0
constexpr int LED = 13; // YELLOW_LED

void setup()
{
  pinMode(BTN, INPUT);
  pinMode(LED, OUTPUT);
}

void loop()
{
  digitalWrite(LED, digitalRead(BTN) ? LOW : HIGH);
}

実行!

タクトスイッチを押すと、黄色LEDが点灯しました。(動画は割愛w)

プルアップ/プルダウン抵抗って省略できないの?

SAMD21マイコンのPORTには、内蔵プルアップ/プルダウンの機能があります。
↓データシートから抜粋
f:id:matsujirushix:20200418201437p:plain

Platformにも、それらしい定義があるので試してみることに。

f:id:matsujirushix:20200418201544p:plain

ハードウェアはこちら。プルダウン抵抗を取っ払いました。
f:id:matsujirushix:20200418201637p:plain

ソフトウェアは、pinMode()で指定していたINPUTINPUT_PULLDOWNにしました。

constexpr int BTN = 0;  // D0
constexpr int LED = 13; // YELLOW_LED

void setup()
{
  pinMode(BTN, INPUT_PULLDOWN); // <---
  pinMode(LED, OUTPUT);
}

void loop()
{
  digitalWrite(LED, digitalRead(BTN) ? LOW : HIGH);
}

結果、ちゃんと動作しましたー

おしまい。