inICSコマンドについて今回は弊社製シリアルサーボモーターを動かすためのICSコマンドについて説明します。System」の略で、近藤科学独自のデータ通信規格です。従来はPWM※でサーボモーターに角度の指令を送っていましたが、特性の変更や拡張などをより細かく制御するため、規格をシリアル通信に変更しました。ICSバージョン2.0では主にサーボモーターの位置制御や特性の変更をするために使用されてきましたが、現在はその他のデバイスも接続できるように拡張されています。バージョン3.5ではサーボモーターのモーター温度などが読み込めるようになりました。各種ICS規格については、詳細なリファレンスマニュアルが公開されています。下記リンクからお持ちのサーボモーターに該当するマニュアルをダウンロードいただき、今回の記事と併せてご利用ください。(KRS-4013HV/4014SHV)ICSコマンドはICSデータ通信の規格に沿った命令のことを言います。通信規格など基本的な構造は次のようになります。データコマンドヘッダ(CMD)部分は、メインコマンド4種類(ポジション、読み出し、書き込み、ID設定)とサーボモーターにセットされたID番号を連結したものです。下記のメインコマンド一覧にある数値で、「0b」がついているものは2進数での表記となっています。これ以降「0x」とついているものは16進数表記です。0b100XXXXX読み出し(パラメーターを読み出す。0b101XXXXX書き込み(パラメーターを書き込む。0b111XXXXXXXXXXには5ビットのID番号が入ります。ID=12(5ビットの2進数で01100)のサーボにポジションをセットする場合は、ICSコマンド第1バイト目(コマンドヘッダ、CMD)は「0b10001100」となります。サブコマンド(SC)は、メインコマンドのオプション設定で、サーボモーターのスピード、ストレッチ、電流値などがあります。ポジションコマンドにはサブコマンドはありません。下記一覧の※マークはICS3.5以降のサブコマンドです。EEPROM0x0010x00サーボモーターのROMデータに直接アクセスするSTRC0x0110x01ストレッチデータを扱うSPD0x0210x02スピードデータを扱うCUR※0x0310x03電離位置を読み出す、または電流制限値を書き込むTMP※0x0410x04サーボモーターの温度を読み出す、または温度制限値を書き込むデータ(DATA)は読み出しの場合は指定しません。書き込みの場合にサーボモーターに書き込みたいデータを指定します。ポジションコマンドのデータ部分だけは特殊なデータ構造になります。下記データ構造を作る方法は「コマンド例」をご覧ください。ポジションデータの下位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)となります。DATA(SPD)202(0xCA)1202(0xCA)2(0x02)12(0x02)100(0x64)1100(0x64)スピード変更などの書き込みコマンド実行時には、サーボモーターから次のような返事が来ます。DATA(SPD)ここで「送信コマンドのループバック」とは、送った3バイトのデータがそのまま返ってくることを示しています。回路編」を参照してください)であるため、データを送ると同時に受信してしまうからです。普通のマイコンでは送信時に受信はできません(フロー制御がないとき)ので、ループバックは無視して3バイトのみの受信でかまわないのですが、パソコンなどのOSが搭載されているものでは、ループバックはバッファに自動的に保存されますので、サーボモーターから来た返事は6バイト受け取るようにしてください。4バイト目のサーボモーターから返ってきたCMDはMSBが0となっていますので、この例では送信CMD=202(0xCA)に対して、R_CMD=74(0x4A)が返ります。ID番号を読み出すID番号を読み込むコマンドは他のコマンドと構造が違います。サーボからIDを読み取る時には、CMD=0xFFとしてください(※IDが分からないサーボモーターからも読み込むため)。SCは0固定で、3回繰り返します。SC255(0xFF)1255(0xFF)0(0x00)10(0x00)0(0x00)10(0x00)0(0x00)10(0x00)サーボモーターからは下のようなデータが返ってきます(PCで受信した場合のみ5バイト、そうでないなら1バイトのみ返る)。R_CMDR_CMDには、ID読み込みコマンド0b111XXXXXとサーボモーターのID番号0b000XXXXXが合わさった1バイトのデータで、MSBが0になったものが返ります。読み出したサーボモーターのID番号が25(0b000110011)だった場合は、R_CMD=0b011110011(243=0xF3)が返ってきます。サーボモーターのポジションを移動するサーボモーターのポジションデータに指定できる値は3500~11500となります。ポジションデータに0を入れたときだけ特殊操作となり、サーボモーターが脱力します。7500がいわゆるニュートラル位置です。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バイト受信できる関数をあらかじめ用意してください。Modulationの略で、信号線をHIGHにする時間を調整することによりモーターの回転を制御する方法のこと。DC(直流電圧)モーターでは入力電圧を変えると回転速度も変わりますが、マイコンで計算した値をアナログ電圧に変換(DA変換)する必要があるため、様々なコストがかかります。そこで信号のONとOFFを細かく切り替えて見かけ上電圧を変える方式になりました。ラジコンサーボではPWMで直接モーターを制御しているわけではなく、パルスの幅にモーターの位置情報という意味を持たせています。パルスを受け取ったモーターはその幅を位置情報に変換し、改めて内部でモーターの位置制御を行っています。Bitの略で、ビット列の中で位(くらい)が一番大きなビットのこと。1バイトデータの場合は8ビット目がMSBとなります。一般に使われている数値は10進数と言います。9に1を足すと桁が上がり、「10」という書き方をします。使える数値は0~9までです。2進数では1に1を足すと桁上がりして「10」と書きます。使える数値は0と1だけです。16進数では0~9とA、B、C、D、E、Fを使います。10進数の10にあたり、Fは15です。Fに1を足すと桁上がりして、同じように「10」となります。10進数では10を掛けたり割ったりすると桁が上下しますが、2進数では2を掛けると桁上がりして、2で割ると桁が下がります。同じように16進数では16を掛けたり割ったりすると桁が上下します。2進数と16進数は単にコンピューター上で数値をビット列とした扱うときに分かりやすいという理由で使われています。16進数は大きな数値も少ない桁数で扱えるので、コンピューターでは重宝します。