Azure Sphere 20.07がリリース
Azure Sphereの20.07がリリースされました。
ここ最近は、アップデートに関してブログを書いていませんでしたが、、、気になる機能が追加されたので、久しぶりに書いておきたいと思います。(気になる機能は太字)
ネットワーク機能
時々、なぜかネットワーク機能が有効にならないときがあって(Networking_IsNetworkingReady())、azsphere device wifi listコマンドぐらいしか確認する手段が無くて詰んでいたのですが、こういうときに有効と思われるネットワーク診断コマンドazsphere device network
が追加されました。
show-status
とshow-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 StudioとVisual Studio Codeのテンプレート
Visual StudioとVisual 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-samplesに入っていて、自身のプロジェクトでハードウェア定義を使うときはコピーしなければいけませんでしたが、一般的なものがSDKに同封になりました。
うむ、、、切り出して公開していたの、不要になったな、、、。
公開しているプロジェクトも、ハードウェア定義を利用しているものは修正したほうが良さそう。
サンプルアプリケーション
Azure IoT サンプルアプリケーションが更新されました。
起動タイミング
起動が約750ミリ秒短縮されました。
GNU Armパス検出
Visual StudioとVisual Studio CodeのAzure Sphere拡張が、GNU Armパスの場所を検出する手順が同じになりました。
製造サンプル
(割愛)
Azure IoT C SDKのサポート
Azure IoT C SDKのlts_02_2020をサポートされるようになりました。
ほぅ。
あとで調べる。
Linuxカーネル
Arduinoのシリアルプロッタ
Arduino IDEについているシリアルプロッタ、便利ですよね。
ときどき、マイコンのデータをパッとグラフにしたいときに使っています。
はて、いったいどういうフォーマットのシリアルデータを受け付けるんだろうか、、、と思い、調べました。
公式のドキュメントがなかなか見つからず、、、いろいろと探し回ったところ、ここにありました。
シリアルプロッタのプロトコル
一時点のデータ群をメッセージといいます。
メッセージには、複数のパートを含めることができ、パートはラベル、値、ラベルと値のいずれかです。
メッセージの終端 | '\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 ...
シリアルプロッタ表示:
ラベル付加形式
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 ...
シリアルプロッタ表示:
おまけ
データの歯抜けがあったときに、きちんとグラフが表示されるのか試したところ、、、あぁ、なるほどな表示でした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); }
シリアルプロッタ表示:
参考
メッセージのパース(解析)コードはこちら。
IoT Centralのデバイスコード自動生成
久しぶりにAzure IoT Centralをイジっていたら、、、テスト用のデバイスコードを自動生成する機能がありましたので試しました。
この機能、まぁまぁ以前からあったのかもしれません。気づいていませんでした。
Azure IoT Centralを立てる
料金プランの内容が補記されてた。これは分かりやすくてグー。
そうそう、そういえば今年の春ぐらいから(?)、場所に日本が選べるようになったんですよね。
デバイステンプレートを追加する
次に、デバイステンプレートを追加します。
今回は、実デバイスを用意してつなげるわけではないので、、、あらかじめ用意されているAzure Sphere Sample Deviceを追加することに。
デバイステンプレート > 新規 > Azure Sphere Sample Device を選択、作成します。
テスト用のデバイスコードを生成する
で、ここからが本題。
作成したデバイステンプレートのテストデバイスの管理で、テストデバイスのコードを自動生成、ダウンロードします。
現時点、選べる言語は4種類。
ここでは、CSharpを選んでみました。
ダウンロードしたzipの中に、C#プロジェクトファイル(.csproj)があります。
デバイスコードを実行
Visual StudioでC#プロジェクトファイルを開いて実行してみると、、、
黒画面が起動して、Sending telemetry ...と、送信されているっぽいメッセージが表示されて、
Azure IoT Centralのグラフに値が表示されました!
デバイスコードの中身
ふむふむ。.NET Core 3.1。
Azure IoT Centralへは、AMQPプロトコルで対称キー(!= クライアント証明書)を使ってAzure IoT DPSに接続している。
なので、Azure IoT Centralで事前にデバイスを作成しておく必要は無い。
500[ms] * 20 = 10秒周期にTelemetryとDeviceTwinを送信していて、
Telemetryの値は固定値。
まとめ
- デバイステンプレートに合わせた(テスト用途の)デバイスコードが自動生成できる。
- 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にアップロードするわけですが、、、まー、構造がややこしい。どれくらいややこしいかというと、これくらい。(松岡調べ)
まー、ややこしい。(2度目)
こんな声が届いたのか分かりませんが、ちょっと前にこのあたりの構造が大幅に変更されシンプルになりました。
変更後がこんな感じ。(松岡調べ)
シンプルにはなったものの、まだ把握不十分な感じもしていてモヤモヤとしていたのですが、、、
先日、Azure Sphere Public APIなるものが公開されて、これを見てみたところ、スッキリ・バッチリと構造を理解することができました。
結果がこちら。(松岡調べw)
- 製品をProductとする。
- アプリケーションの配布単位にDevice Groupを設ける。
- DeviceはDevice Groupと紐づいている。
- Device Groupに配布するアプリケーションDeploymentを紐づける。
- と、結果としてデバイスはDeviceに紐づいたDevice Group、に紐づいたDeploymentのImageをインストールする。
です。
さらに細かな点を言うと、
- 内部はIDで管理。(なので、名前が重複しても関係ない)
- DeviceGroupは、複数Productで兼用されない。
- DeviceGroupからDeploymentのカレント参照は1つのみ。
でした。
あー、スッキリした。
Azure Sphere SDKのバージョンアップに注意を!
縁あって参加させていただいた、AVNETさんのセミナーで気になるお話しが。
20.04から、Azure Sphere SDKとVisual Studio拡張が別々になったので(略
別々!?
いままでは、Azure Sphere SDKをインストールすれば、Azure Sphere用Visual Studio拡張も自動的にインストールされていましたが、どうやら別々に提供されるようになったみたい。
知らなかった...
というわけで、手元の環境を確認することにします。
現在のバージョン
Azure Sphere SDK
コントロールパネルで、Azure Sphere SDKのバージョンを確認。
20.4.7.42974なので、現在の最新でした。
azsphere
azsphereコマンドのバージョンを確認。
こちらも、20.4.7.42974です。
Visual Studio Extension for Azure Sphere
Visual Studioで、Azure Sphere用Visual Studio拡張のバージョンを確認。
20.1.7.495...
古 い ぞ ! !
この情報はちゃんと公開されているのか?
ちゃんと公開されていました...ハイ。
20.04概要に、
Visual Studio用とVSCode用のSDKを同一のSDKにして、Visual Studio拡張やVSCode拡張はマーケットプレイスで配布になったと、ちゃんと書いてあります。
Visual Studio Extension for Azure Sphereの最新バージョンは?
Visual Studioマーケットプレイスを覗くと、、、20.4.7.49790でした。
Visual Studio Extension for Azure Sphereの更新
これをポチっとやればOK。
教訓。
What's newは隅々確認しましょう。
Seeeduino XIAOのタッチ入力
Seeed K.K. エンジニアブログにも記事をポストしていますが、雑多な感じのものはこっちの個人ブログへポストすることにします。
タッチ入力を、ちょー軽く確認しました。
ライブラリの追加が必要
Seeeduino XIAOのArduinoパッケージには、タッチ入力の機能が含まれていません。
ググってみたところ、Adafruit_FreeTouchで出来るようです。
Arduinoライブラリマネージャで出てくるので、ここからインストールしました。
ソフトウェア
Adafruit_FreeTouchに同封のサンプルコードを修正して、A0~A10をシリアルプロッタに出力しました。
(具体的なコードは省略w)
結果
凡例が間違っているのは無視してください(汗
A0~A1、A6~10が、タッチ入力で使えました。
(A2~A5は使えませんでした。)
Seeeduino XIAOのデジタル入力
Seeed K.K. エンジニアブログにも記事をポストしていますが、雑多な感じのものはこっちの個人ブログへポストすることにします。
今回は、デジタル入力を確認しましょう。
ハードウェア
デジタル出力のときと同様、(電源を除いた)全ピンで入力できるようです。
なので、D0にタクトスイッチ経由で3V3(3.3V)に結線し、かつ、D0を抵抗経由でGNDに結線しました。
ソフトウェア
タクトスイッチを押したときに、オンボードの黄色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には、内蔵プルアップ/プルダウンの機能があります。
↓データシートから抜粋
Platformにも、それらしい定義があるので試してみることに。
ハードウェアはこちら。プルダウン抵抗を取っ払いました。
ソフトウェアは、pinMode()で指定していたINPUT
をINPUT_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); }
結果、ちゃんと動作しましたー
おしまい。