ページへ戻る

− Links

 印刷 

Dynamixel通信プロトコル のバックアップソース(No.3) :: Besttechnology

knowledge:Dynamixel通信プロトコル のバックアップソース(No.3)

« Prev[4]  Next »[5]
**概要 [#sbf1e938]
[[Dynamixelシリーズ>Dynamixelシリーズ 他#m101b537]](AX-12+、AX-S1、RX-28、RX-64)及び[[USS3>BTE069 USS3]]で共通の通信プロトコルです。~
異なる機器でもIDさえ重複しなければ同一ネットワークでの運用が可能です。~
以下Dynamixel以外の機器の場合は、Dynamixelと書かれている部分をその機器名に読み替えて下さい。

**パケット [#eb0635b5]
ホストコントローラは送受信データパケットでDynamixelと通信します。ホストコントローラからDynamixelへ発信する「インストラクションパケット」、Dynamixelからホストコントローラへ発信する「ステータスパケット」の2つのパケットタイプがあります。
#ref(DxProt1.png,80%)

**ID [#i70fa31a]
複数のDynamixelを同じノードに接続して運用するには、個々を区別するためのIDを使用します。ホストは任意のIDを持ったインストラクションパケットにて通信するDynamixelを指定でき、またそのIDに従ったDynamixelのみがステータスパケットをホストへ返信し、必要な命令を実行します。
#ref(DxProt2.png,80%)
複数のDynamixelユニットに同じID値が付けられていると、パケットの衝突が起こり、通信障害が生じます。そのため、1つのネットワークノード内には同一IDを持つDynamixelが存在してはなりません。

**プロトコル [#f63e7535]
Dynamixelは8 bit, 1 Stop bit, None Parityの非同期通信をサポートします。通信速度は後述の数値範囲で任意に設定可能です。

**インストラクションパケット構成 [#f7c5cc11]
インストラクションパケットはホストコントローラーからDynamixelに命令を送るためのパケットです。パケット構造は以下の通りです。なお、コントロールテーブル、使用可能なインストラクションセットに関しては後述します。~
~
&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID};
&color(#000,#DDD){LENGTH}; &color(#000,#DDD){INSTRUCTION}; &color(#000,#DDD){PARAMETER 1};・・・&color(#000,#DDD){PARAMETER N}; &color(#000,#DDD){CHECKSUM};~
~
-&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF};~
先頭に位置している2バイトはパケットの始まり(ヘッダ)を意味し、2バイトともに16進数で0xFF固定です。
-&color(#000,#DDD){ID};~
送信先のDynamixelのIDを指定します。DynamixelのIDは通常0x00~0xFDまで(254台)指定できます。~
また、0xFEは接続されている全Dynamixelを指定するBroadcast IDとなり、IDを0xFEに設定したパケットは全てのDynamixelにて処理されます。なお、ブロードキャスト送信時はステータスパケットが返信されません。~
-&color(#000,#DDD){LENGTH};~
「Parameter数(N) + 2」を指定します。~
-&color(#000,#DDD){INSTRUCTION};~
インストラクションを指定します。~
-&color(#000,#DDD){PARAMETER 1~N};~
インストラクションに従った追加情報を指定します。~
-&color(#000,#DDD){CHECKSUM};~
CHECKSUMの計算方法は次の通りです。~
CHECKSUM = ~(ID+LENGTH+INSTRUCTION+PARAMETER1+… +PARAMETER N)
計算された値が255以上なら、下位8ビットがCHECKSUMの値となります。(「~」はnot演算子の意)

**ステータスパケット構成 [#a1058504]
ステータスパケットはDynamixelがインストラクションパケットを受信した後、その応答としてホストへ返信するパケットです。パケット構造は以下の通りです。~
~
&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID};
&color(#000,#DDD){LENGTH}; &color(#000,#DDD){ERROR}; &color(#000,#DDD){PARAMETER 1};・・・&color(#000,#DDD){PARAMETER N}; &color(#000,#DDD){CHECKSUM};~
~
-&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF};~
先頭に位置している2バイトはパケットの始まり(ヘッダ)を意味し、2バイトともに16進数で0xFF固定です。~
-&color(#000,#DDD){ID};~
パケットを返信するDynamixelのIDです。~
-&color(#000,#DDD){LENGTH};~
「Parameter数(N) + 2」を返します。
-&color(#000,#DDD){ERROR};~
Dynamixelの動作中に生じたエラーの状態を表します。エラーがある場合は各ビットが1になります。~
|Bit|名称|内容|
|Bit7|-|-|
|Bit6|Instruction Error|未定義のインストラクションが指定された、もしくはreg_writeなしでactionが指定された|
|Bit5|Overload Error|指定された最大トルクで現在の負荷を制御できない|
|Bit4|Checksum Error|インストラクションパケットのチェックサムが正しく無い|
|Bit3|Range Error|パラメータの設定範囲を超えた|
|Bit2|Overheating Error|内部温度が設定温度を超えた|
|Bit1|Angle Limit Error|Angle Limitの範囲外にGoal Positionが指定された|
|Bit0|Input Voltage Error|電源電圧が指定動作電圧の範囲を超えた|
-&color(#000,#DDD){PARAMETER 1~N};~
インストラクションに従った追加情報を返します。~
-&color(#000,#DDD){CHECKSUM};~
CHECKSUMの計算方法は次の通りです。~
CHECKSUM = ~(ID+LENGTH+INSTRUCTION+PARAMETER1+… +PARAMETER N)
計算された値が255以上なら、下位8ビットがCHECKSUMの値となります。(「~」はnot演算子の意)

**コントロールテーブル [#xbe6b522]
Dynamixelの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。Dynamixelはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。
***[[Dynamixelコントロールテーブル]] [#bc4806ee]
***[[USS3コントロールテーブル]] [#fc8bcb5c]

**インストラクションセット [#j7c4ce31]
以下が使用可能なインストラクションです。
|Instruction|Function|Value|Number of Parameter|
|PING|動作なし&br;ステータスパケットを得るのに使用します|0x01|0|
|READ DATA|コントロールテーブルの読み込みです|0x02|2|
|WRITE DATA|コントロールテーブルへの書き込みです|0x03|2~|
|REG WRITE|WRITE_DATAと同じですが、ACTIONが与えられるまでスタンバイモードになります|0x04|2~|
|ACTION|REG_WRITEで保持された動作を実行します|0x05|0|
|RESET|Dynamixelのコントロールテーブルの値を製造時のデフォルトの値に戻します|0x06|0|

***WRITE_DATAインストラクション [#za2d7929]
Dynamixel内部のコントロールテーブルへデータを書き込みます。ステータスパケットはコントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみ返信されます。~
~
&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~
&color(#000,#DDD){INSTRUCTION}; : 0x03~
&color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~
&color(#000,#DDD){PARAMETER 2}; : 書き込む最初のデータ~
&color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~
~
例)接続されているDynamixelのIDを1に設定~
コントロールテーブルのAddress3に1を書き込みます。IDはBroadcast ID(0xFE)を使って送信します。~
~
''インストラクションパケット : 0xFF 0xFF 0xFE 0x04 0x03 0x03 0x01 0xF6''

|ヘッダ|ID|LENGTH|INSTRUCTION|PARAMETERS|CHECKSUM|
|0xFF 0xFF|0xFE|0x04|0x03|0x03 0x01|0xF6|
Broadcast ID(0xFE)で送信したため、ステータスパケットは返ってきません。

**READ_DATAインストラクション [#f183fe48]
Dynamixel内部のコントロールテーブルのデータを読み出します。ステータスパケットはコントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみ返信されます。~
~
&color(#000,#DDD){LENGTH}; : 0x04~
&color(#000,#DDD){INSTRUCTION}; : 0x02~
&color(#000,#DDD){PARAMETER 1}; : 読み込むデータの先頭アドレス~
&color(#000,#DDD){PARAMETER 2}; : 読み込むデータの長さ~
~
例) IDが1のDynamixelの内部温度(Address 0x2B 1byte)を読み込む~
~
''インストラクションパケット : 0xFF 0xFF 0x01 0x04 0x02 0x2B 0x01 0xCC''
|ヘッダ|ID|LENGTH|INSTRUCTION|PARAMETERS|CHECKSUM|
|0xFF 0xFF|0x01|0x04|0x02|0x2B 0x01|0xCC|
''ステータスパケット : 0xFF 0xFF 0x01 0x03 0x00 0x20 0xDB''
|ヘッダ|ID|LENGTH|ERROR|PARAMETER1|CHECKSUM|
|0xFF 0xFF|0x01|0x03|0x00|0x20|0xDB|

**REG_WRITEインストラクション [#m9b4cdbe]
REG_WRITEはWRITE_DATAとほぼ同じですが実行タイミングが違います。インストラクションパケットを受け取ると値はバッファに格納され、WRITEインストラクションがスタンバイの状態になります。このとき、Registered Instruction(Address44)が1に設定されます。ACTIONインストラクションパケットを受け取った後、格納されたWRITEインストラクションが実行されます。~
~
&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~
&color(#000,#DDD){INSTRUCTION}; : 0x04~
&color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~
&color(#000,#DDD){PARAMETER 2}; : 書き込む最初のデータ~
&color(#000,#DDD){PARAMETER 3}; : 書き込む2番目のデータ~
&color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~

**ACTIONインストラクション [#v7f41414]
REG_WRITEで格納されたインストラクションを実行します。~
~
&color(#000,#DDD){LENGTH}; : 0x02~
&color(#000,#DDD){INSTRUCTION}; : 0x05~
&color(#000,#DDD){PARAMETER}; : なし~
~
複数のDynamixelを同時に動作させるときにはACTIONが役立ちます。複数のDynamixelを制御するとき、1番目と最後のDynamixelの間にわずかな遅延が発生します。ACTIONを使うことでこの問題を解決することができます。2個以上のDynamixelへACTIONを送信するときにBroadcast ID(0xFE)を使用します。Broadcast IDを使用するとパケットが一切返ってこないことに注意して下さい。

**PINGインストラクション [#ya8e46c6]
ノード中にある特定IDを持つDynamixelの存在を確認するときに使用します。指定されたIDを持ったDynamixelは、Broadcast IDを使用している、またはStatus Return Level(Adress16)に関わらず常にステータスパケットを返します。~
~
&color(#000,#DDD){LENGTH}; : 0x02~
&color(#000,#DDD){INSTRUCTION}; : 0x01~
&color(#000,#DDD){PARAMETER}; : なし~
~
例) IDが1のDynamixelへPINGを行なう~
~
''インストラクションパケット : 0xFF 0xFF 0x01 0x02 0x01 0xFB''
|ヘッダ|ID|LENGTH|INSTRUCTION|CHECKSUM|
|0xFF 0xFF|0x01|0x02|0x01|0xFB|
''ステータスパケット : 0xFF 0xFF 0x01 0x02 0x00 0xFC''
|ヘッダ|ID|LENGTH|ERROR|CHECKSUM|
|0xFF 0xFF|0x01|0x02|0x00|0xFC|

**RESETインストラクション [#d80745da]
Dynamixelのコントロールテーブルの値を出荷時の初期値に戻します。~
~
&color(#000,#DDD){LENGTH}; : 0x02~
&color(#000,#DDD){INSTRUCTION}; : 0x06~
&color(#000,#DDD){PARAMETER}; : なし~
~
例) IDが0のDynamixelを出荷時の設定に戻す~
''インストラクションパケット : 0xFF 0xFF 0x00 0x02 0x06 0xF7''
|ヘッダ|ID|LENGTH|INSTRUCTION|CHECKSUM|
|0xFF 0xFF|0x00|0x02|0x06|0xF7|
''ステータスパケット : 0xFF 0xFF 0x00 0x02 0x00 0xFD''
|ヘッダ|ID|LENGTH|ERROR|CHECKSUM|
|0xFF 0xFF|0x00|0x02|0x00|0xFD|
RESETを実行した後、DynamixelのIDが1に変わっていることに注意して下さい。

**SYNC_WRITEインストラクション [#d25e994b]
同時に複数のDynamixelを制御します。SYNC_WRITEは1つのインストラクションパケットで複数のインストラクションを送るので通信時間を減らすことが可能です。しかし、書き込むデータのアドレスとデータ長が同じインストラクションに限ります。また、Broadcast IDの使用が必要です。~
~
&color(#000,#DDD){ID}; : 0xFE~
&color(#000,#DDD){LENGTH}; : (L+1) * N+4 (L : 各Dynamixelのデータ長、N : Dynamixelの個数)~
&color(#000,#DDD){INSTRUCTION}; : 0x83~
&color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~
&color(#000,#DDD){PARAMETER 2}; : 書き込むデータの長さ~
&color(#000,#DDD){PARAMETER 3}; : 1番目のDynamixelのID~
&color(#000,#DDD){PARAMETER 4}; : 1番目のDynamixelの書き込む1番目のデータ~
&color(#000,#DDD){PARAMETER 5}; : 1番目のDynamixelの書き込む2番目のデータ~
・~
・~
&color(#000,#DDD){PARAMETER L+3}; : 1番目のDynamixelの書き込むL番目のデータ~
&color(#000,#DDD){PARAMETER L+4}; : 2番目のDynamixelのID~
&color(#000,#DDD){PARAMETER L+5}; : 2番目のDynamixelの書き込む1番目のデータ~
&color(#000,#DDD){PARAMETER L+6}; : 2番目のDynamixelの書き込む2番目のデータ~
・~
・~
&color(#000,#DDD){PARAMETER 2L+4}; : 2番目のDynamixelの書き込むL番目のデータ~
~
例) 4個のDynamixelに以下の位置と速度を設定~
ID0のDynamixel : スピード0x150でポジション0x010へ~
ID1のDynamixel : スピード0x360でポジション0x220へ~
ID2のDynamixel : スピード0x170でポジション0x030へ~
ID3のDynamixel : スピード0x380でポジション0x220へ~
~
''インストラクションパケット : 0xFF 0xFF 0xFE 0x18 0x83 0x1E 0x04 0x00 0x10 0x00 0x50 0x01 0x01 0x20 0x02 0x60 0x03 0x02 0x30 0x00 0x70 0x01 0x03 0x20 0x02 0x80 0x03 0x12''~
~
Broadcast IDを使ったのでステータスパケットは返ってきません。

« Prev[4]  Next »[5]