シリアルサーボ制御方法(2) ICS編
ICSコマンドについて
今回は弊社製シリアルサーボモーターを動かすためのICSコマンドについて説明します。
ICSとは「Interactive Communication System」の略で、近藤科学独自のデータ通信規格です。従来はPWM※でサーボモーターに角度の指令を送っていましたが、特性の変更や拡張などをより細かく制御するため、規格をシリアル通信に変更しました。
ICSバージョン2.0では主にサーボモーターの位置制御や特性の変更をするために使用されてきましたが、現在はその他のデバイスも接続できるように拡張されています。バージョン3.5ではサーボモーターのモーター温度などが読み込めるようになりました。
各種ICS規格については、詳細なリファレンスマニュアルが公開されています。下記リンクからお持ちのサーボモーターに該当するマニュアルをダウンロードいただき、今回の記事と併せてご利用ください。
- ICS3.6コマンドリファレンス (KRS-6003R2HV/3301)
ICS3.5コマンドリファレンス (KRS-4032HV/4033HV/4034HV/2552RHV/6003RHV/3304/3204) - ICS3.0コマンドリファレンス (KRS-2552HV/6003HV/ROS-3101HV)
- ICS2.0コマンドリファレンス (KRS-4013HV/4014SHV)
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) | ||||||
|
|
|
スピード変更などの書き込みコマンド実行時には、サーボモーターから次のような返事が来ます。
1 | 2 | 3 | 4 | 5 | 6 |
送信コマンドのループバック | 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バイトのみ返る)。
1 | 2 | 3 | 4 | 5 |
送信コマンドのループバック | 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-5でもかまいません)をお持ちの方はシリアル通信用端子から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-2552R3HV ICSの詳細をみる KRS-3204R2 ICSの詳細をみる KRS-2572R2HV ICSの詳細をみる KRS-2552R2HV ICSの詳細をみる KRS-2542R2HV ICS の詳細をみる KRS-5054HV ICS H.Cの詳細をみる KRS-5053HV ICS H.Cの詳細をみる KRS-5034HV ICSの詳細をみる KRS-5033HV ICSの詳細をみる KRS-5032HV ICSの詳細をみる KRS-6104FHV ICSの詳細をみる KRS-3304R2 ICSの詳細をみる KRS-3302 ICSの詳細をみる KRS-6003R2HV ICSの詳細をみる KRS-3301 ICSの詳細をみる KRS-3304 ICSの詳細をみる KRS-3204 ICSの詳細をみる KRS-6003RHV ICSの詳細をみる KRS-2572HV ICSの詳細をみる KRS-4037HV ICSの詳細をみる KRS-4034HV ICSの詳細をみる KRS-4033HV ICSの詳細をみる KRS-4032HV ICSの詳細をみる KRS-4031HV ICSの詳細をみる KRS-2552RHV ICSの詳細をみる KRS-2542HV ICSの詳細をみる KRS-6003HV ICS Red Versionの詳細をみる