BROKEN's Advanced Vehicle Laboratory

プロジェクト / 小型ヒューマノイド2003 for ROBO-ONE

4.10 複数個のラジコンサーボ制御

基礎実験 4.9ではPC側のVBプログラムからシリアル通信で連続データをPICに送り、データどおりにラジコンサーボを制御する実験を行いました。 今回は、それを複数個のラジコンサーボに拡張します。

4.10.1 制御信号のタイミング

サーボの数を増やすと聞いて私が真っ先に思いついたのは、「全部のサーボ制御信号を同時にHighにして、時間がきたものから順にLowおとしていく」というやり方です。 そのやり方で上手にできている方もあるようですが、サーボの数が増えるとLowにすべき順番の並べ替えに処理時間がかかりそうだとか、Lowにすべきタイミングが重なった場合にジッタが発生しそうだといった不安があります。そこで今回は、「信号をHighにする時間をずらす」という方法を用いることにします。

では、信号をHighにする時間をずらしたら、Lowにすべきタイミングが重なってしまったりしないでしょうか? 次の図で動作タイミングを検証してみましょう。

図 4.10-1 20ms周期で10個のラジコンサーボを制御したときの信号のタイミング

この図は、ラジコンサーボの制御周期を20msとして制御信号がHighになる時間が重ならないようにした場合の制御信号がHighになるタイミングの例です。ラジコンサーボのニュートラル位置は1500us(1.5ms)でしたね。サーボの出力角度が±60°まで変化する場合、信号がHighになる時間は(メーカーによって多少異なるかとは思いますが)大体 1.0〜2.0msの間に収まっているかと思います。(この部分は、自分で使用するモータで実際に確かめてみてください。少なくとも、HitecのHS-805BB+は収まっていました。) ですから、各サーボの制御信号をHighにする時間を 2ms ずつずらせば信号がHighになる時間がオーバーラップしません。Highになる時間が重ならなければ、Lowにするタイミングも重なりません。 この方法なら、1個のPICで最大10個までラジコンサーボを同時に制御できそうです。

PIC16F876Aを使って24個のラジコンサーボを制御したという話を聞いたことがありますから、10個以上同時に制御したい方は挑戦してみてはいかがでしょうか。

4.10.2 通信パケットの変更

なんとなくできそうだなと思ったところで、PIC側制御プログラムに手を入れる前にPC側プログラムとの通信に使用する通信パケットの仕様を拡張します。

表:通信パケットのフォーマット
意味 ASCII文字 ASCIIコード
先頭コード @ 0x40
サーボID 0〜9 0x30〜0x39
符号 +、- 0x2b、0x2d
十の位 0〜9 0x30〜0x39
一の位 0〜9 0x30〜0x39
終了コード [LF] 0x0a

ピンクで色づけした部分が今回新たに加わった部分です。サーボIDは0〜9に限定する必要はありません。256個同時制御ができるのであれば、0〜255でも可です。

パケットを変更したついでに、必要な通信速度も見積もっておきます。計算式は省略しますが、スタートビット、ストップビットを1bitづつ付加して、サーボ制御周期を20msにすると、サーボを6個制御すれば 18Kbps、サーボを10個なら30kbpsになりそうです。(ちょっと自信ありません。) 10個のときは通信速度は 19.2Kbpsでは不足なので、38.4Kbpsや57.6Kbpsにして速度を補うことにします。

(注) この通信パケットでは将来ラジコンサーボを24〜36個同時に制御しようとした時には通信が間に合わなくなるものと予想しています。これについては、必要になった時点で再度通信速度とパケットサイズの見積もりを行い、フォーマットを見直すことにします。

4.10.3 PIC側プログラムの拡張

実験4.9で使用したPIC側のプログラムをベースにして、複数サーボ同時制御が可能になるように変更を加えていきます。主な変更点は以下のとおりです。

割り込みハンドラ内での処理の軽量化

実験4.9のPIC側プログラムではサーボが特定の角度になるとジッタが発生していました。原因は先に述べたとおりで、対策は「割り込み処理を徹底的に軽量化すること」です。割り込み処理を軽量化するために以下のような変更を加えました。

通信パケットの変更

先ほど説明した内容に合うように通信パケットを変更しました。

サーボ関連関数の複数化対応

サーボ関連の関数に、それぞれ複数個のサーボが扱えるように変更を加えました。具体的には、サーボ構造体を配列として定義したときに、各関数で構造体の配列からデータを読み出すようにしました。

細かい変更点はまだまだありますが、説明し始めるときりが無いので、あとはソースコードから読み取ってください。

サンプルプログラム(サーボ4個同時制御)

次は何?

ここまでできれば、PCとPICを接続して、ラジコンサーボをいくつか組み合わせて縫い包みの中に入れて動かしたり、簡単なロボットアームを動かしたりと、いろいろなことに応用できます。しかし、本プロジェクトの目指すところはヒューマノイドをバリバリ動かすことです。ROBO-ONEのリングに立つ事です。そのためには、20〜30個のサーボを同時に制御したり、零点調整(PICに覚えさせる)をしたり、やるべきことがまだまだあります。 こんなの、PICじゃなくてFPGAでやりゃいいぢゃん、なんて思わなくもありませんが、PICによる分散制御のほうがかっこよさそうに聞こえるので(笑)、このまま続けます。

△目次 / 4.11 マルチプロセッサ間通信 >>