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

参考

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