上肢帯のあるロボット4
上肢帯ロボット、今週は、ひたすらコーディング。
2つほど、発見がありました。
1.双葉サーボのボーレートの謎
RS303/304のマニュアルによると、RS304の標準のボーレートは、115,200bpsに設定されている。
13ページには、”~460,8kbps”と書かれているが、43ページの規格には230,4kbpsが”最大”と書かれている。
28ページの通信速度の設定値は09H 230,400bps以上の記載がない。(下記の通り)
いったい、どれが本当だろう…ということで、試してみたところ、
0BH (691,200bps)まで設定可能でした。(!?)
上記の説明通りなら、リセットされて115,200bpsに戻るべきところなんですが…。
(0CHに設定した時は、流石にリセットされました。)
ちなみに、そのまま問題なく使えているので、速い方が良いよね!ってことで、今のところ問題は出ておりません。
2.FTDIのUSBシリアル変換のレイテンシタイマー
上述の通り、サーボのボーレートを最大まで出し切ったにも関わらず、それでいてサーボの更新がとんでもなく遅い。
プロセスタイムを測ると352msecもかかるので、秒間3回しか更新できていない。
サーボの更新は専用のスレッドでsleep()なしで回しているので、意味が分からない。
コードのあらゆるところにタイマを仕掛けていくと、パケットの送受信のたびに16msecの遅延があることが判明した。
Twitterにつぶやいたところ、とてもありがたいことに、人形つかいさんからご返信をいただきました!
16msecはFTDIのUSBシリアル変換チップのデフォルトのLATENCY TIMERの値です。もしもFTDIのチップを使われているならぐぐると設定変更方法が見つかります
— 魔女みならい (@witch_kazumin) 2017年9月24日
まさに、ずばりこれです!
デバイスマネージャのCOMポートの詳細設定で、待ち時間がデフォルトで16msecになっているところを1msecに変更します。
言われて思い出したのですが、過去にも一度これにハマってますね。
でも、以前はいまいち意味が分かってなかったので、今回勉強になりました。
変更したところ、352msecだったサーボの更新が46msecに短縮されました!
ちなみに、レイテンシタイマー、1msec以下は設定できないようで、22個のサーボの送受信と角度指定のロングパケット1回送ると45回の送受信が発生するので、ぴったり1msecの遅延が、更新時間に影響しています。
このあたり(20Hzくらい)が限界でしょうか。
これを解決するには、COMポートを増やすか、中継用のマイコンが必要ということになりそうですね。
あ、ちなみに、これが今のロボットの制御パネルです。
というわけで、今週はここまで出来ました。
左右をミラーリングするデモ。
子供に見せたら喜んでくれました。
とりあえず、パネル上のボタンはすべて機能しています。
コメントを残す