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); }
結果、ちゃんと動作しましたー
おしまい。
Seeeduino XIAOのデジタル出力
Seeed K.K. エンジニアブログにも記事をポストしていますが、雑多な感じのものはこっちの個人ブログへポストすることにします。
Seeeduino XIAO、ちっちゃカワイイので、のんびりじっくりと時間をかけて楽しもうと思っています。
さっそく、基本中の基本、デジタル出力を確認しましょう。
ハードウェア
下図の「D〇」のピンがデジタル入出力で使えるみたい。
ということは、、、つまり、(電源を除いた)どのピンでもデジタル入出力可能!!
ほほー。
ってことで、D0とD1に、LED-電流制限抵抗-GNDの流れを結線しました。
ソフトウェア
LED1が点灯(0.2秒)、LED2が点灯(0.2秒)、消灯(1秒)を繰り返すコードを作成しました。
constexpr int LED1 = 0; // D0 constexpr int LED2 = 1; // D1 void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); } void loop() { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); delay(200); digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); delay(200); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(1000); }
実行!
えー、点滅しました。(動画は割愛w)
デジタル出力のピン番号って不思議ですよね?
Seeeduino XIAOの回路図を見ると、D0はSAMD21マイコンのPA2に接続されています。
でも、digitalWrite()に指定するピン番号は2ではなくて0...。
どこかで番号を変換(マッピング)していると思われるので、探しました。
定義しているのはココ。Platformのvariants\XIAO_m0\variant.cppでした。
そして、これを使っている箇所は、、、色々w
デジタル出力のときは、cores\arduino\wiring_digital.cでした。