C-Styleからグラフ出力

C-Styleのセンサモニタではリアルタイムのセンサ値は確認できるが、それ以外の確認ができない。 プログラムをデバッグするには、プログラムを実行しながら変数の値などを確認したり、グラフ化したい。

まずは変数の値を確認できるようにする。

準備

メニュー「オプション」の「Setupボタンを表示」を選択し、Setup画面で「Advanced mode」のチェックボックスをONにする。 変数の値などをシリアル出力するには「Advanced Mode」で利用できる「"C-code」ブロックを利用する。

シリアル出力する内容は、センサモニタ画面のタイトル「センサモニタ & 出力チェック」をダブルクリックした際にウィンドウ下部に表示されるシリアル出力領域(と勝手に呼称する)で確認できるようになる。

Teraterm等その他のソフトで確認することもできるが、ここでは省略する。

「C-code」の記述

「C-code」ブロックでシリアル出力するには、printfという関数を使用する。(他にもあるが省略) 変数Aをシリアル出力する場合は、「printf("%ld", gV[VAR_A]);」と記述する。

C-codeを記述する際には以下を注意する。

  • すべて半角文字で入力する。
  • 大文字と小文字は区別されるので間違えないようにする。
  • 行末には「;」(セミコロン)が必要。

「printf( )」コマンドでは、表示するテキストとそこに差し込む変数などを指定する。

  • 上記の例ではテキスト中「%ld」(パーセント、小文字エル、小文字ディー)が変数Aの値に置換される。
  • 置換される箇所以外はそのまま出力されるので、カンマや改行(\r\n)も1文に含めてもよいし、変数以外は別の「C-code」ブロックで出力しても良い。(「\」は円記号「¥」のキーで入力できる)

変数Aを改行しながらシリアル出力する場合は、1つの「C-code」ブロックで

「printf("%ld\r\n", gV[VAR_A]);」

と記述するが、もしくは「C-code」ブロックを2つに分けて

「printf("%ld", gV[VAR_A]);」「printf("\r\n");」

のように記述する。

変数A以外を表示する場合は、「VAR_A」となっているところを「VAR_B」、「VAR_C」のように置き換える。

サンプルプログラム

これらを踏まえて、ロボットを動かしながら、センサの測定値をシリアル出力してみる。 ロボットは2輪で、次のセンサを搭載している。

  • ロボットは4秒間ゆっくり反時計回りで回転する。回転中は赤LED2を点灯し、プログラム終了で消灯する。
  • 8行目の「while」ループは4秒間経ったら終了する。
  • (9~12行)9行目の「while」ループは、現在の方位が前回ループ時より変化があるまで待機する。これにより、方位が変化していない場合の出力を防止する。回転速度がゆっくりであれば1度ごとにセンサ値を出力する。
  • (12~20行)4つのボールセンサの値を変数C~Fに代入する。自作ボールセンサの出力値は、ボールが近いほど値が小さく、ボールが無いときに100%の値になるが、直感的でないので、「1023-CNx」と計算することで、ボールが近いほど値が大きく、ボールが無いときが0になるよう計算したものをボールセンサ値とする。
  • (21行)現在の方位である変数Aの値を「,」(カンマ)つきでシリアル出力する。
  • (22~24行)ボールセンサ1から3の値を「,」(カンマ)つきでシリアル出力する。
  • (25行)ボールセンサ4の値を改行つきでシリアル出力する。
  • (27~28行)プログラムの終了処理。モータ停止とLED消灯

プログラムのビルドとダウンロードが済んだら、シリアルケーブルは繋いだままでセンサモニタ画面を開き、タイトル部分をダブルクリックしてリアル出力領域を開く。一度「モニタ開始」をクリックしてからTJ3Bでプログラムをスタートすると、リアル出力領域に「printf」の結果が表示される。

Arduino IDEのシリアルプロッタの利用

リアル出力領域の表示内容をコピー、Excelなどの表計算ソフトにペーストしてグラフを作ることもできるが、Arduinoの開発環境の「ツール」にある「シリアルプロッタ」を利用するとリアルタイムに変数値などをグラフ化できる。

Arduino IDEの準備

インストールと起動、終了の仕方についてはこちらが詳しい。 2022年10月時点では新しいバージョン2.0.xが利用できるが、1.8.xでも2.0.xでも同様に利用できるので、どちらを利用してもよい。

sanuki-tech.net

シリアルプロッタの準備

シリアルプロッタを使う際には、Arduino IDEのメニュー「ツール」の「ポート」を、C-Styleの通信設定と同じ接続ポートで設定する。 なお、普段C-Style利用時に使用するシリアルケーブルを抜いた状態では、メニュー「ツール」の「ポート」に該当の接続ポートが表示されないため、シリアルケーブルは繋ぎっぱなしにしておく。

ポートの準備ができたら、Arduino IDEのメニュー「ツール」の「シリアルプロッタ」を選択する。 シリアルプロッタ画面下にあるボーレートの指定は、C-Styleの通信設定と同じ115200bpsを指定しておく。 シリアルプロッタが準備できたら、ロボットのプログラムをスタートしてグラフを確認する。

注意点

PC上で、複数のプログラムから同時に同じシリアルポートに接続することができないため、C-Styleでプログラムをビルドし、ダウンロードする際は、シリアルプロッタを閉じておくこと。

その他

Arduino IDEのメニュー「ツール」の「シリアルプロッタ」では、グラフの「凡例」を表示することができる。 上のサンプルプログラムのように、凡例のテキストのみを出力する方法と、個々のデータを凡例とともに出力する方法がある。

後者をする場合、「C-code」ブロックで「printf("dir:%ld,", gV[VAR_A]);」「printf("ball1:%ld,", gV[VAR_B]);」のように記載する。