micro:bit内の複数のパラメータをグラフ表示する

micro:bitのシリアル通信とmakcecodeのシリアルモニターを使うと、変数やInputにあるセンサー値を時系列風に表示できることがわかった。上手に使うとデバックや動作確認に有用なので紹介したい。

# micro:bitのシリアル通信の準備
micro:bitのシリアル通信はUSB端子を使っておこなわれるので、Connect deciveでmicro:bitとWebブラウザーを接続しておく必要がある。詳細は別の記事を参照してほしい。
- USBケーブルでmicro:bitとPCを接続する。
- WebUSBを対応しているブラウザー[^1]でmakecodeを起動する。
- コードのダウンロードと同じく、[ダウンロード]ボタンの右にある[・・・]から、接続しているmicro:bitを接続する。

[^1]:ここではMac mini(2023)のChromeを使用している。

![スクリーンショット 2024-05-06 15.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/831b5c2b-0c4f-acc9-eafe-aecff84408f2.png)

# お試しで、センサーのInput値のピッチをグラフ化する
micro:bitの傾きをグラフ化してみる。

- [高度なブロック]を押すと出てくる[シリアル通信]から、[シリアル通信 名前と数値を書き出す]ブロックを取り出す
- シリアル通信のブロックのラベルに"pitch"と記入する
- [入力]の[その他]から[傾斜ピッチ]を取り出し、シリアル通信のブロックに入れる
- シリアル通信のブロックを[ずっと]ブロックに入れる
- [基本]の[一時停止]ブロックを200ミリ秒にして[ずっと]ブロックに入れる
- コードをmicro:bitにダウンロードする

![スクリーンショット 2024-05-06 15.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/6ebcb2ea-c7e3-ced3-fbb3-fb2b3ccc0f02.png)

- makecode上のmicro:bit本体の下に表示される[データを表示]という2つのボタンのうち、[デバイス]側がシリアルモニターなので、それを押す。グラフ表示に切り替わり、リアルなmicro:bitからのデータが表示される。
    本題から離れるが、この時に別のシリアル受信ソフトが動作しているとシリアルデバイスを占有してしまい、makecodeがデータ受信できなくなるので注意が必要。

![スクリーンショット 2024-05-06 15.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/280a15f1-29fa-9eaa-3724-4a37eaf70f3e.png)


# 複数のパラメータ表示
複数のパラメータのグラフが同時に表示ができると嬉しい。makecodeへの送るフォーマットによって2種類の表示方法が切り替えられる。

### グラフをパラメータ毎に別々に表示する方法
コロン(:)でラベルを付けると、パラメータ毎にグラフエリアが別れる。[名前と数値を書き出す]ブロックを表示したいパラメータ分用意する。例として加速度X、Y、Zを表示してみた。

![スクリーンショット 2024-05-06 16.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/e191f722-cfdb-db79-b302-c887a259a97c.png)

![スクリーンショット 2024-05-06 16.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/40c2bc8e-0b14-3f36-8bf6-c7c7e267412d.png)

### すべてのパラメータを1つのグラフ内に表示する方法
CSV[^2]で送られてくると、1つのグラフに複数のパラメータが表示されるようになる。以下では加速度のXYZを1つのグラフで表示させてみた。使用するブロックは[複数の数値をカンマくぎりで書き出す]だ。

[^2]:カンマで区切られた文字列データ形式。

![スクリーンショット 2024-05-06 16.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/c3ba3427-7ce3-f291-8ee6-dd1bc447faf9.png)
![スクリーンショット 2024-05-06 16.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/9f437c0a-ccf3-25cf-b2f9-1f2e607951d8.png)

### ちょっと応用
もちろん以下のようなこともできて、加速度センサーと傾斜の関係がきれいに可視化された。

![スクリーンショット 2024-05-06 16.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/10037f8c-4718-7c00-a142-d416346230a3.png)
![スクリーンショット 2024-05-06 16.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/2fb9441b-4906-55dc-bda0-476b5983211b.png)

また一部の方にお話ししていたことだが、私のmicro:bitの地磁気センサーは正しく動作していないのではないか疑惑も、下のグラフから私の気の迷いだったことが判明した。とほほ、、、

![スクリーンショット 2024-05-06 17.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/07e6c35f-c551-b1a7-50af-69d3455567de.png)
![スクリーンショット 2024-05-06 17.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126127/6de9964d-7243-59c3-fea5-f0842862de61.png)

# 制約や気づいたこと
細かいことだけど、制約となりそうなことをに遭遇したので列挙しておく。また気づいたことも書いておく。
- [名前と数値を書き出す]ブロックの名前には英数字や記号以外の、例えば漢字やひらがなを入れると、グラフが表示されなくなる。
- ブロックコード表示とグラフ表示を行き来すると、時々グラフがうまく表示されないことがある。これは何度か行き来すれば表示されるようになる。
- 数字以外でグラフは書けないので、"真"、"偽"はグラフ表示できない。表示したいときは0や1を使うと可能。
- [複数の数値をカンマくぎりで書き出す]ブロックを使わなくても、文字列連結でカンマくぎりの文字列を作れば表示可能。

# さいごに
はっきりってめちゃくちゃ便利。
気づいたことにも書いたけど、フラグやソフトの状態を数値にして表示すると、プログラムの流れが把握できるようになる。その昔、組み込みソフトで使ったタイムチャートがリアルタイムで表示できるので、コードの善し悪しはあるけれど、デバックはやりやすくなると感じた。
ぜひ試してもらいたい。