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); }
シリアルプロッタ表示:
参考
メッセージのパース(解析)コードはこちら。