シリアルサーボ制御方法(2) ICS編

Posted on 2010.09.06 in

 

ICSコマンドについて

今回は弊社製シリアルサーボモーターを動かすためのICSコマンドについて説明します。

ICSとは「Interactive Communication System」の略で、近藤科学独自のデータ通信規格です。従来はPWM※でサーボモーターに角度の指令を送っていましたが、特性の変更や拡張などをより細かく制御するため、規格をシリアル通信に変更しました。

ICSバージョン2.0では主にサーボモーターの位置制御や特性の変更をするために使用されてきましたが、現在はその他のデバイスも接続できるように拡張されています。バージョン3.5ではサーボモーターのモーター温度などが読み込めるようになりました。

各種ICS規格については、詳細なリファレンスマニュアルが公開されています。下記リンクからお持ちのサーボモーターに該当するマニュアルをダウンロードいただき、今回の記事と併せてご利用ください。

 

ICSコマンドはICSデータ通信の規格に沿った命令のことを言います。通信規格など基本的な構造は次のようになります。

シリアル通信設定

通信速度 115200bps、625000bps※、1250000bps※(※ICS3.0以降)
データ長 8ビット
ストップビット長 1ビット
パリティ 偶数
フロー制御 なし

 

データ構造

バイト数 1(CMD) 2(SC) 3~N-1(DATA)
内容 コマンドヘッダ=
メインコマンド+ID番号
サブコマンド データ

コマンドヘッダ(CMD)部分は、メインコマンド4種類(ポジション、読み出し、書き込み、ID設定)とサーボモーターにセットされたID番号を連結したものです。下記のメインコマンド一覧にある数値で、「0b」がついているものは2進数での表記となっています。またこれ以降「0x」とついているものは16進数表記です。

ポジション(サーボモーターの回転角度を決める) 0b100XXXXX
読み出し(パラメーターを読み出す。種類はサブコマンドで決める) 0b101XXXXX
書き込み(パラメーターを書き込む。種類はサブコマンドで決める) 0b110XXXXX
ID(ID番号の読み込み、または書き出しを行う) 0b111XXXXX

XXXXXには5ビットのID番号が入ります。例えばID=12(5ビットの2進数で01100)のサーボにポジションをセットする場合は、ICSコマンド第1バイト目(コマンドヘッダ、CMD)は「0b10001100」となります。

サブコマンド(SC)は、メインコマンドのオプション設定で、サーボモーターのスピード、ストレッチ、電流値などがあります。ポジションコマンドにはサブコマンドはありません。下記一覧の※マークはICS3.5以降のサブコマンドです。

EEPROM サーボモーターのROMデータに直接アクセスする
STRC ストレッチデータを扱う
SPD スピードデータを扱う
CUR※ 電離位置を読み出す、または電流制限値を書き込む
TMP※ サーボモーターの温度を読み出す、または温度制限値を書き込む

データ(DATA)は読み出しの場合は指定しません。書き込みの場合にサーボモーターに書き込みたいデータを指定します。ポジションコマンドのデータ部分だけは特殊なデータ構造になります。下記データ構造を作る方法は「コマンド例」をご覧ください。

POS_H ポジションデータの上位7ビット
POS_L ポジションデータの下位7ビット

データ構造で特に注意するのは、第1バイト目以外は全てMSB(1バイトデータのもっとも上位にあるビットのこと、8ビット目のこと)を0にする必要があることです。ICS規格では、MSBが1のデータからコマンドヘッダとID番号を読み取ろうとしますので、サブコマンドやデータ部分のMSBが1の場合にはコマンドヘッダと間違えて誤動作する可能性があります。

 

コマンド例と返値について

スピードの変更

簡単な例として、ID番号が10のサーボモーターのスピードを変更するICSコマンドを作成してみます。リファレンスマニュアルから、設定できるスピード値は0~127(数値が小さいほど速度が下がる)であるので、ここでは100と設定します。

  • スピードをサーボモーターにセットするには書き込みコマンド(0b110XXXXX)を使います。
  • ID番号は10(2進数で0b00001010)です。
  • スピード設定サブコマンドは2です。

メインコマンドが「0b110XXXXX」で、ID番号は「0b00001010」ですので、CMDは11001010=202(0xCA)となります。

CMD SC DATA(SPD)

スピード変更などの書き込みコマンド実行時には、サーボモーターから次のような返事が来ます。

送信コマンドのループバック R_CMD SC DATA(SPD)

ここで「送信コマンドのループバック」とは、送った3バイトのデータがそのまま返ってくることを示しています。ICS規格では送信線と受信線が同じ(詳細は「シリアルサーボ制御方法(1) 回路編」を参照してください)であるため、データを送ると同時に受信してしまうからです。

普通のマイコンでは送信時に受信はできません(フロー制御がないとき)ので、ループバックは無視して3バイトのみの受信でかまわないのですが、パソコンなどのOSが搭載されているものでは、ループバックはバッファに自動的に保存されますので、サーボモーターから来た返事は6バイト受け取るようにしてください。

なお4バイト目のサーボモーターから返ってきたCMDはMSBが0となっていますので、この例では送信CMD=202(0xCA)に対して、R_CMD=74(0x4A)が返ります。

ID番号を読み出す

ID番号を読み込むコマンドは他のコマンドと構造が違います。サーボからIDを読み取る時には、CMD=0xFFとしてください(※IDが分からないサーボモーターからも読み込むため)。SCは0固定で、3回繰り返します。

CMD SC SC SC

サーボモーターからは下のようなデータが返ってきます(PCで受信した場合のみ5バイト、そうでないなら1バイトのみ返る)。

送信コマンドのループバック R_CMD

R_CMDには、ID読み込みコマンド0b111XXXXXとサーボモーターのID番号0b000XXXXXが合わさった1バイトのデータで、MSBが0になったものが返ります。例えば読み出したサーボモーターのID番号が25(0b000110011)だった場合は、R_CMD=0b011110011(243=0xF3)が返ってきます。

サーボモーターのポジションを移動する

サーボモーターのポジションデータに指定できる値は3500~11500となります。ポジションデータに0を入れたときだけ特殊操作となり、サーボモーターが脱力します。7500がいわゆるニュートラル位置です。

CMD POS_H POS_L
0b100XXXXX+ID 16ビットデータの下位14ビットを7ビットずつ分解して、上位をPOS_H、下位をPOS_Lとする

ポジションの設定はすこし難しくなっています。コマンドヘッダ以外はMSBを0にしなければならない約束がありますので、2バイト(16ビット)データのうち、下位14ビットのみを使用します。取り出した14ビットを2分割して、上位をPOS_H、下位をPOS_Lとします。例えばニュートラル位置7500の場合は、7500=0b00011101_01001100(0b[00][011101_0][1001100])となりますので、POS_H=0b000111010=0x3A、POS_L=0b01001100=0x4Cとなります。

返値は現在位置データが送信コマンドと同じように、7ビットずつに分解されて返ってきますので、プログラムでデータを戻すには7ビットずつ取り出してつなぎ合わせる必要があります。

次回はICSコマンドをC言語で作ってみます。自作マイコンをターゲットにしていますので、プログラムできるマイコン(KCB-1でもかまいません)をお持ちの方はシリアル通信用端子から1バイト送信できる関数と、1バイト受信できる関数をあらかじめ用意してください。

用語説明

PWM
Pulse Width Modulationの略で、信号線をHIGHにする時間を調整することによりモーターの回転を制御する方法のこと。DC(直流電圧)モーターでは入力電圧を変えると回転速度も変わりますが、マイコンで計算した値をアナログ電圧に変換(DA変換)する必要があるため、様々なコストがかかります。そこで信号のONとOFFを細かく切り替えて見かけ上電圧を変える方式になりました。
ラジコンサーボではPWMで直接モーターを制御しているわけではなく、パルスの幅にモーターの位置情報という意味を持たせています。パルスを受け取ったモーターはその幅を位置情報に変換し、改めて内部でモーターの位置制御を行っています。
MSB
Most Significant Bitの略で、ビット列の中で位(くらい)が一番大きなビットのこと。1バイトデータの場合は8ビット目がMSBとなります。最も小さい位は LSB(Least Significant Bit)といいます。
2進数、16進数
一般に使われている数値は10進数と言います。9に1を足すと桁が上がり、「10」という書き方をします。使える数値は0~9までです。2進数では1に1を足すと桁上がりして「10」と書きます。使える数値は0と1だけです。16進数では0~9とA、B、C、D、E、Fを使います。A が10進数の10にあたり、Fは15です。Fに1を足すと桁上がりして、同じように「10」となります。
10進数では10を掛けたり割ったりすると桁が上下しますが、2進数では2を掛けると桁上がりして、2で割ると桁が下がります。同じように16進数では16を掛けたり割ったりすると桁が上下します。2進数と16進数は単にコンピューター上で数値をビット列とした扱うときに分かりやすいという理由で使われています。また、16進数は大きな数値も少ない桁数で扱えるので、コンピューターでは重宝します。

 

シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(1) 回路編

 

 

KRS-3301 ICSの詳細をみる KRS-3304 ICSの詳細をみる KRS-3204 ICSの詳細をみる KRS-6003RHV ICSの詳細をみる KRS-2572HV ICSの詳細をみる KRS-4034HV ICSの詳細をみる KRS-4033HV ICSの詳細をみる KRS-4032HV ICSの詳細をみる KRS-4031HV ICSの詳細をみる KRS-2552RHV ICSの詳細をみる KRS-2542HV ICSの詳細をみる KRS-6003HV ICS Red Versionの詳細をみる