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]);」のように記載する。

C-Styleのフリーズ回避

私の利用している環境では、TJ3Bの電源が入っていない状態で、

  • センサモニタを開こうとする
  • ビルドが完了してダウンロードを始めようとする

と毎回C-Styleがフリーズしていた。

忘れなければ良いのだが、発生するとタスクマネージャから「CStyle_Tj3B.exe」を終了させて、開き直すという手順が面倒で情報募集のツイートをしてみたところ、GUJO ROBOT CLUB (@gujorobo) / Twitter さんより情報をいただき、状況を改善できたのでまとめておく。

  • 「タスクマネージャー」を開く
  • 「ポート(COMとLPT)」を展開する。
  • 「Blutetoothリンク経由の標準シリアル(COM?)※」を含む使用していないCOMポートを全て削除。 -「タスクマネージャー」の「表示」メニューで「非表示のデバイスも表示」を選択して、さらに使用していないCOMポートを削除。

この後状況が改善したものの、再起動後に「※」が復活し、症状が再発した。

「※」の無効化でも症状は改善された。 無効化であれば、PC再起動後も「※」が有効になることはなく、C-Styleのフリーズは回避できるようだ。

3D CADのススメ

お手伝いしているロボット教室には3Dプリンタがあり、メンバーは自由に使うことができるが、3D CADでデータを作ることができるメンバーは少ないので、今後増えることを期待して簡単な形状のパーツの作成方法を紹介してみる。

今回紹介するのは、TJ3Bに取り付けできるロボット用ハンドルで、Fusion360で作成する。


まずは形状を決めるためのスケッチを作成する。
スケッチの追加から基準面を選択する。


ざっくり形状を決める。

  • ハンドルの厚みはとりあえず3mmとする。
  • ハンドル高さは50mmとする。
  • ハンドルの内寸を100mmとする。
  • ハンドル固定用のネジはセンターから60mmの位置に通す。
  • ネジと合わせて使うワッシャに合わせたサイズにする。
  • 最終的にミラー機能でパーツを合成するので左右対称の半分のパーツを作る。


フィレットで形状を一体化する。
ハンドルの強度を保つために弱点となる角はつけないようにする。
また、固定時に問題がないようワッシャーに干渉しない大きさの半径にする。


一体形状を適当に押し出す。


ハンドルを横から見た形状を調整するために、スケッチ追加。


サイドの穴などを追加する。
M3ネジを想定した穴だが、うちの3Dプリンタでは穴径がデータの寸法より小さく出力されるので大きめサイズにしている。


追加したスケッチで押し出し。
「交差」することで、元のボディと新しく押し出したボディの共通部分を新たなボディとする。


更に固定用のネジ穴などハンドルを上下から見た形状を調整するために、スケッチを追加。
なお、Fusion360で作成したデータをそのままの向きで3D出力できるよう寝かした状態でデータを作成している。


ネジは片側に2本づつ。間隔は10mm。


さらに押し出して「交差」し、ボディにネジと角丸を追加する。


ハンドル上部のフィレットの部分にも穴を作っていたことに気づいたのでこれを削除するために、作業履歴から横から見た際のスケッチを選択して、編集し直す。


フィレット部分にかかる円を削除してスケッチを終了。


フィレット部分の穴が消える。
作業履歴を遡って修正した内容が、その後の操作で作成された形状に反映してくれるので、作業を遡って修正するのが大変楽でよい。


ミラー機能でパーツを結合して1つのパーツとする。


ここで完成としても良いが、さらに細部を詰める。


ハンドルの内側、外側の面を指定して、その面の辺を面取りする。
が、ここでエラー発生。面取りできるだけのサイズがないとのメッセージ。


サイドの形状を調整するために、操作履歴から再度スケッチを編集。


斜辺の位置を少しずらす。


操作履歴から横方向の押し出しを編集。


押し出し箇所を追加。


操作履歴から面取りを編集。


今度はエラーなしで面取りできた。


完成。

アナログ出力ジャイロセンサ

方位センサとして利用できるarduinoベースのアナログ出力ジャイロセンサが満足の行く仕上がりになったのでまとめておく。

f:id:ohguma:20211229020943j:plain

ハードウェア的には下記からさほど進歩がないが、今回ソフトウェア的に満足行くものができた。

ohguma.hatenablog.com

ここ数年使っていたプログラムは下記を参考に作成していたが起動時に自動キャリブレーションで数十秒の待ち時間があった。ロボット教室などでセンサを作成した場合でも、センサごとの調整は不要で作る手間はさほどでなかったが、時間制限のあるロボット大会などで使う場合に待ち時間が支障になることがあった。

github.com

今回、「 センサーの使い方(ジャイロ編) : Revolution_Include」の情報を参考にして、手動の任意タイミングでキャリブレーションできるようにすることで起動時の自動キャリブレーションの待ち時間をなくすことができ、より実用的になった。

詳細な情報(arduinoスケッチやFritzingデータ・ガーバーデータ)はgithubにまとめたのでそちらを参照のこと。 github.com

オムニホイールの設計(その2)

最初のスケッチでは、オムニホイールの外形46mmとメインホイールの外形を記載する。
データ量削減などを期待し、3D出力するパーツで円は使わずポリゴンを使う。
メインホイールは半径21mm、16角。
(以後のポリゴンは説明ない場合は外接ポリゴンを使用)
f:id:ohguma:20201226030802p:plain

サイドホイール

次にサイドホイール用の新しいスケッチを作成。
利用する燃料ホースのサイズとシャフト用のクリップの線径はそのままのサイズで一旦データ化する。
シャフトを通す穴のサイズは実際に3D出力して調整する。
利用した燃料ホースは若干の柔軟性はあったので、両端に抜け止めを設けても装着に問題はなかった。
両端の抜け止めだけではホースがずれる場合、ホース内側部分を太くするなどして対策する。
f:id:ohguma:20201226030821p:plain

先のスケッチから回転でサイドホイール用の各パーツのボディを1セット作成する。
ここでは全て新規ボディとして作成、それぞれ適当に素材も設定した。
今後、複製して利用するため、管理しやすいようグループ登録しておく。
f:id:ohguma:20201226030847p:plain

サイドホイールの1つを選択し、円形状パターンでZ軸回りに8つに複写。
1列分のサイドホイールの配置完了。
f:id:ohguma:20201226033730p:plain

その8つのサイドホイールをコピー・ペーストして、
 ・上に10mm移動
 ・Z軸回りに22.5度回転
して2列めのサイドホイールの配置完了。複製したサイドホイールも適宜グループで管理する。
f:id:ohguma:20201226034514p:plain

メインホイール

一旦サイドホイールのボディは非表示にし、1枚目のスケッチから押出でメインホイールを作成。
メインホイールの厚みは、2列のサイドホイールのシャフト間隔10mm+両側に2mmの合計14mmとした。
下の画像での実際の処理は、下に押出2mm、上に押出12mm、面取り1mm。
f:id:ohguma:20201226035408p:plain

サイドホイール用の溝

最初のサイドホイールの赤道面にスケッチを追加。
このスケッチでメインホイールに作成するサイドホイール用溝を作成する。
サポート無しで3D出力できるように底面に平行な天井は作らないようにする。
サイドホイールのシャフト用溝もここで準備する。
シャフト用溝の幅は実際に出力して調整する。
f:id:ohguma:20201226040632p:plain


メインホイールのボディは非表示にする。
サイドホイール用の溝は、それ用のボディを作成し、後でメインホイールのボディから切り抜く。
まずは、溝の主要素となるボディを両側に押出で作成。
サイドホイール長の8mmに両側の隙間合計1mmを足した9mm幅とする。
f:id:ohguma:20201226042344p:plain

サイドホイールの両端が当たる部分のボディを結合。
溝の側面とサイドホイール両端の接触部分を減らす。
f:id:ohguma:20201226042404p:plain

サイドホイール用シャフトを収容する溝用のボディを結合。
f:id:ohguma:20201226042434p:plain

サイドホイール用の溝の調整

先の形状のまま円形状パターンで配置すると角が干渉するため、スケッチを追加し、押出の交差を利用して角を落とす。
f:id:ohguma:20201226051127p:plainf:id:ohguma:20201226051140p:plain
f:id:ohguma:20201226051206p:plainf:id:ohguma:20201226051220p:plain

交差で処理した結果はこちら。
f:id:ohguma:20201226051251p:plain

さらに中央部分を面取りで調整。
f:id:ohguma:20201226051335p:plain

サイドホイール用溝の切り抜き

円形状パターンで1列分複製。
f:id:ohguma:20201226052928p:plain

それをサイドホイールと同様にコピーする。
サイドホイールと違って上下の形状が異るため、
 ・X軸で180度回転
 ・Z軸の上向きに10mm移動
 ・Z軸で22.5度回転
させる。
各ボディが接触していないことを確認する。
接触がある場合は、サイドホイール用溝のボディをさらに削る。
f:id:ohguma:20201226052948p:plain

メインホイールのボディを表示し、それを結合のターゲットボディとする。
サイドホイール用溝ボディをツールボディにして、切り取り。
f:id:ohguma:20201226053003p:plain

ここまででメインホイールが概ね完成。
f:id:ohguma:20201226053021p:plain

最終工程

ダイセンモーター用のスプリングピン用の溝を切り抜き。
f:id:ohguma:20201226081009p:plain
f:id:ohguma:20201226081610p:plain

モーター軸用の穴を切り抜き。
f:id:ohguma:20201226082408p:plain
f:id:ohguma:20201226082422p:plain

固定用ナットのスペースはテーパ角度をつけて切り抜き。
f:id:ohguma:20201226082443p:plain

完成

必要に応じて面取りなどを追加する。
f:id:ohguma:20201226092742p:plain

枝豆オムニと比較すると、厚みがあり、サイドホイールがメインホイールから飛び出している関係でそのまま置き換えできない場合は、メインホイールの底面側の厚みを増すなどの対応をすればよいと思う。

その他

燃料ホースやクリップを切断する際に、長さを揃える治具も設計しておく。
クリップは伸ばして真っ直ぐな部分のみを利用して、次のような治具に当ててニッパーで切断して長さを揃える。
f:id:ohguma:20201226083240p:plain

3D出力してサイズに問題がある箇所があれば、履歴で問題箇所のスケッチやフィーチャー編集で寸法を直す。
Fusion360は履歴をさかのぼって修正した場合、以後の履歴に修正内容が反映するので大変便利に作業できる。