2: 2009-07-02 (木) 12:18:50 sho ソース 現: 2011-07-04 (月) 21:45:31 takaboo ソース
Line 1: Line 1:
-**概要 [#sbf1e938] +TITLE:Dynamixel通信プロトコル 
-[[Dynamixelシリーズ>Dynamixelシリーズ 他#m101b537]](AX-12+、AX-S1、RX-28、RX-64)及び[[USS3>BTE069 USS3]]で共通の通信プロトコルです。+Dynamixelシリーズ共通の通信プロトコルです。
-異なる機器でもIDさえ重複しなければ同一ネットワークでの運用が可能です。~ +異なるデバイスであっても、IDが重複しなければ同一ネットワークでの運用が可能です。
-以下Dynamixel以外の機器の場合は、Dynamixelと書かれている部分をその機器名に読み替えて下さい。+
**パケット [#eb0635b5] **パケット [#eb0635b5]
-ホストコントローラは送受信データパケットでDynamixelと通信します。ホストコントローラからDynamixelへ発信する「インストラクションパケット」、Dynamixelからホストコントローラへ発信する「ステータスパケット」の2つのパケットタイプがあります。+ホスト(マスター)及びデバイス(スレーブ)はパケット単位で通信を行い、ホストからデバイスへ送信する「インストラクションパケット」、デバイスからホストへ送信する「ステータスパケット」の2種類あります。
#ref(DxProt1.png,80%) #ref(DxProt1.png,80%)
**ID [#i70fa31a] **ID [#i70fa31a]
-複数のDynamixelを同じノードに接続して運用するには、個々を区別するためのIDを使用します。ホストは任意のIDを持ったインストラクションパケットにて通信するDynamixelを指定でき、またそのIDに従ったDynamixelのみがステータスパケットをホストへ返信し、必要な命令を実行します。+複数のデバイスを同じノードに接続して運用するには、各々を区別するIDを使用します。ホストは任意のIDを持ったインストラクションパケットにて通信するデバイスを指定でき、またそのIDに従ったデバイスのみがステータスパケットをホストへ返信し、必要な命令を実行します。
#ref(DxProt2.png,80%) #ref(DxProt2.png,80%)
-複数のDynamixelユニットに同じID値が付けられていると、パケットの衝突が起こり、通信障害が生じます。そのため、1つのネットワークノード内には同一IDを持つDynamixelが存在してはなりません。 +複数のデバイスに同じID値が付けられているとパケットの衝突が起こり、通信障害が生じます。そのため、1つのネットワークノード内には同一IDを持つデバイスが複数存在してはなりません。
- +
-**プロトコル [#f63e7535] +
-Dynamixelは8 bit, 1 Stop bit, None Parityの非同期通信をサポートします。通信速度は後述の数値範囲で任意に設定可能です。+
**インストラクションパケット構成 [#f7c5cc11] **インストラクションパケット構成 [#f7c5cc11]
-インストラクションパケットはホストコントローラーからDynamixelに命令を送るためのパケットです。パケット構造は以下の通りです。なお、コントロールテーブル、使用可能なインストラクションセットに関しては後述します。~+インストラクションパケットはホストからデバイスへ命令するためのパケットです。パケット構造は以下の通りです。なお、コントロールテーブル、使用可能なインストラクションセットに関しては後述します。~
~ ~
&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID};
Line 25: Line 21:
先頭に位置している2バイトはパケットの始まり(ヘッダ)を意味し、2バイトともに16進数で0xFF固定です。 先頭に位置している2バイトはパケットの始まり(ヘッダ)を意味し、2バイトともに16進数で0xFF固定です。
-&color(#000,#DDD){ID};~ -&color(#000,#DDD){ID};~
-送信先のDynamixelのIDを指定します。DynamixelのIDは通常0x00~0xFDまで(254台)指定できます。~ +送信先のデバイスのIDを指定します。DynamixelのIDは通常0x00~0xFDまで(254台)指定できます。~ 
-また、0xFEは接続されている全Dynamixelを指定するBroadcast IDとなり、IDを0xFEに設定したパケットは全てのDynamixelにて処理されます。なお、ブロードキャスト送信時はステータスパケットが返信されません。~+また、0xFEは接続されている全デバイスを指定するBroadcast IDとなり、IDを0xFEに設定したパケットは全てのデバイスにて処理されます。なお、ブロードキャスト送信時はステータスパケットが返信されません。~
-&color(#000,#DDD){LENGTH};~ -&color(#000,#DDD){LENGTH};~
「Parameter数(N) + 2」を指定します。~ 「Parameter数(N) + 2」を指定します。~
Line 39: Line 35:
**ステータスパケット構成 [#a1058504] **ステータスパケット構成 [#a1058504]
-ステータスパケットはDynamixelがインストラクションパケットを受信した後、その応答としてホストへ返信するパケットです。パケット構造は以下の通りです。~+ステータスパケットはデバイスがインストラクションパケットを受信した後、その応答としてホストへ返信するパケットです。パケット構造は以下の通りです。~
~ ~
&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){ID};
Line 51: Line 47:
「Parameter数(N) + 2」を返します。 「Parameter数(N) + 2」を返します。
-&color(#000,#DDD){ERROR};~ -&color(#000,#DDD){ERROR};~
-Dynamixelの動作中に生じたエラーの状態を表します。エラーがある場合は各ビットが1になります。~ +デバイスの動作中に生じたアラームの状態を表します。該当アラームがある場合はそのビットが1になります。 
-|Bit|名称|内容| +| Bit | 名称 | 内容 | 
-|Bit7|-|-| +|Bit7| - | - | 
-|Bit6|Instruction Error|未定義のインストラクションが指定された、もしくはreg_writeなしでactionが指定された| +|Bit6| Instruction Error |未定義のインストラクションが指定された、もしくはreg_writeなしでactionが指定された| 
-|Bit5|Overload Error|指定された最大トルクで現在の負荷を制御できない| +|Bit5| Overload Error |指定された最大トルクで現在の負荷を制御できない| 
-|Bit4|Checksum Error|インストラクションパケットのチェックサムが正しく無い| +|Bit4| Checksum Error |インストラクションパケットのチェックサムが正しく無い| 
-|Bit3|Range Error|パラメータの設定範囲を超えた| +|Bit3| Range Error |パラメータの設定範囲を超えた| 
-|Bit2|Overheating Error|内部温度が設定温度を超えた| +|Bit2| Overheating Error |内部温度が設定温度を超えた| 
-|Bit1|Angle Limit Error|Angle Limitの範囲外にGoal Positionが指定された| +|Bit1| Angle Limit Error |Angle Limitの範囲外にGoal Positionが指定された| 
-|Bit0|Input Voltage Error|電源電圧が指定動作電圧の範囲を超えた|+|Bit0| Input Voltage Error |電源電圧が指定動作電圧の範囲を超えた|
-&color(#000,#DDD){PARAMETER 1~N};~ -&color(#000,#DDD){PARAMETER 1~N};~
インストラクションに従った追加情報を返します。~ インストラクションに従った追加情報を返します。~
Line 69: Line 65:
**コントロールテーブル [#xbe6b522] **コントロールテーブル [#xbe6b522]
-Dynamixelの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。Dynamixelはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。 +デバイスの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。デバイスはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。
-***[[Dynamixelコントロールテーブル]] [#bc4806ee] +
-***[[USS3コントロールテーブル]] [#fc8bcb5c]+
**インストラクションセット [#j7c4ce31] **インストラクションセット [#j7c4ce31]
以下が使用可能なインストラクションです。 以下が使用可能なインストラクションです。
-|Instruction|Function|Value|Number of Parameter| +| Instruction | Function | Value | Number of Parameter | 
-|PING|動作なし&br;ステータスパケットを得るのに使用します|0x01|0| +| PING |デバイスの死活確認 | 0x01 | 0 | 
-|READ DATA|コントロールテーブルの読み込みです|0x02|2| +| READ_DATA |コントロールテーブルから読み出し | 0x02 | 2 | 
-|WRITE DATA|コントロールテーブルへの書き込みです|0x03|2~| +| WRITE_DATA |コントロールテーブルへ書き込み(即時反映) | 0x03 | 2~ | 
-|REG WRITE|WRITE_DATAと同じですが、ACTIONが与えられるまでスタンバイモードになります|0x04|2~| +| REG_WRITE |コントロールテーブルへ書き込み(保留) | 0x04 | 2~ | 
-|ACTION|REG_WRITEで保持された動作を実行します|0x05|0| +| ACTION |REG_WRITEで保留された値を反映 | 0x05 | 0 | 
-|RESET|Dynamixelのコントロールテーブルの値を製造時のデフォルトの値に戻します|0x06|0|+| RESET |デバイスのコントロールテーブルを出荷時の値に初期化 | 0x06 | 0
 +| SYNC_WRITE |複数デバイスの同一コントロールテーブルへの一括書き込み(即時反映) | 0x83 | 4~ |
***WRITE_DATAインストラクション [#za2d7929] ***WRITE_DATAインストラクション [#za2d7929]
-Dynamixel内部のコントロールテーブルへデータを書き込みます。ステータスパケットはコントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみ返信されます。~ +コントロールテーブルへデータを書き込みます。~ 
-~ +Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。 
-&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~+~&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~
&color(#000,#DDD){INSTRUCTION}; : 0x03~ &color(#000,#DDD){INSTRUCTION}; : 0x03~
&color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~
Line 95: Line 90:
コントロールテーブルのAddress3に1を書き込みます。IDはBroadcast ID(0xFE)を使って送信します。~ コントロールテーブルのAddress3に1を書き込みます。IDはBroadcast ID(0xFE)を使って送信します。~
~ ~
-''インストラクションパケット : 0xFF 0xFF 0xFE 0x04 0x03 0x03 0x01 0xF6'' +''インストラクションパケット : 0xFF 0xFF 0xFE 0x04 0x03 0x03 0x01 0xF6''~ 
- +~
-|ヘッダ|ID|LENGTH|INSTRUCTION|PARAMETERS|CHECKS​UM| +
-|0xFF 0xFF|0xFE|0x04|0x03|0x03 0x01|0xF6|+
Broadcast ID(0xFE)で送信したため、ステータスパケットは返ってきません。 Broadcast ID(0xFE)で送信したため、ステータスパケットは返ってきません。
-**READ_DATAインストラクション [#f183fe48] +***READ_DATAインストラクション [#f183fe48] 
-Dynamixel内部のコントロールテーブルのデータを読み出します。ステータスパケットはコントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみ返信されます。~ +コントロールテーブルのデータを読み出します。~ 
-~ +Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。 
-&color(#000,#DDD){LENGTH}; : 0x04~+~&color(#000,#DDD){LENGTH}; : 0x04~
&color(#000,#DDD){INSTRUCTION}; : 0x02~ &color(#000,#DDD){INSTRUCTION}; : 0x02~
&color(#000,#DDD){PARAMETER 1}; : 読み込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 1}; : 読み込むデータの先頭アドレス~
-&color(#000,#DDD){PARAMETER 2}; : 読み込むデータの長さ~+&color(#000,#DDD){PARAMETER 2}; : 読み込むデータの長さ 
 +~例) IDが1のDynamixelの内部温度(Address 0x2B 1byte)を読み込む~
~ ~
-例) IDが1のDynamixelの内部温度(Address 0x2B 1byte)を読み込む~+''インストラクションパケット : 0xFF 0xFF 0x01 0x04 0x02 0x2B 0x01 0xCC''~
~ ~
-''インストラクションパケット : 0xFF 0xFF 0x01 0x04 0x02 0x2B 0x01 0xCC'' +''ステータスパケット : 0xFF 0xFF 0x01 0x03 0x00 0x20 0xDB''~
-|ヘッダ|ID|LENGTH|INSTRUCTION|PARAMETERS|CHECKS​UM| +
-|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~+ 
 +***REG_WRITEインストラクション [#m9b4cdbe] 
 +WRITE_DATAとほぼ同じですが、REG_WRITEインストラクションを受け取ると、デバイスはその値を即時反映せずに保留します。その際、Dynamixelの場合はRegistered Instruction(Address44)を1に設定します。その後、ACTIONインストラクションを受け取ると保留された値が反映されます。~ 
 +ACTIONインストラクションが受信されるまで、保留された値は永続的に反映されません。 
 +~&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~
&color(#000,#DDD){INSTRUCTION}; : 0x04~ &color(#000,#DDD){INSTRUCTION}; : 0x04~
&color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~
Line 128: Line 118:
&color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~ &color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~
-**ACTIONインストラクション [#v7f41414]+***ACTIONインストラクション [#v7f41414]
REG_WRITEで格納されたインストラクションを実行します。~ REG_WRITEで格納されたインストラクションを実行します。~
~ ~
&color(#000,#DDD){LENGTH}; : 0x02~ &color(#000,#DDD){LENGTH}; : 0x02~
&color(#000,#DDD){INSTRUCTION}; : 0x05~ &color(#000,#DDD){INSTRUCTION}; : 0x05~
-&color(#000,#DDD){PARAMETER}; : なし+&color(#000,#DDD){PARAMETER}; : なし
-+
-複数のDynamixelを同時に動作させるときにはACTIONが役立ちます。複数のDynamixelを制御するとき、1番目と最後のDynamixelの間にわずかな遅延が発生します。ACTIONを使うことでこの問題を解決することができます。2個以上のDynamixelへACTIONを送信するときにBroadcast ID(0xFE)を使用します。Broadcast IDを使用するとパケットが一切返ってこないことに注意が必要です。+
-**PINGインストラクション [#ya8e46c6]+***PINGインストラクション [#ya8e46c6]
ノード中にある特定IDを持つDynamixelの存在を確認するときに使用します。指定されたIDを持ったDynamixelは、Broadcast IDを使用している、またはStatus Return Level(Adress16)に関わらず常にステータスパケットを返します。~ ノード中にある特定IDを持つDynamixelの存在を確認するときに使用します。指定されたIDを持ったDynamixelは、Broadcast IDを使用している、またはStatus Return Level(Adress16)に関わらず常にステータスパケットを返します。~
~ ~
Line 146: Line 134:
例) IDが1のDynamixelへPINGを行なう~ 例) IDが1のDynamixelへPINGを行なう~
~ ~
-''インストラクションパケット : 0xFF 0xFF 0x01 0x02 0x01 0xFB'' +''インストラクションパケット : 0xFF 0xFF 0x01 0x02 0x01 0xFB''~ 
-|ヘッダ|ID|LENGTH|INSTRUCTION|CHECKSUM| +~ 
-|0xFF 0xFF|0x01|0x02|0x01|0xFB| +''ステータスパケット : 0xFF 0xFF 0x01 0x02 0x00 0xFC''~ 
-''ステータスパケット : 0xFF 0xFF 0x01 0x02 0x00 0xFC'' +~
-|ヘッダ|ID|LENGTH|ERROR|CHECKSUM| +
-|0xFF 0xFF|0x01|0x02|0x00|0xFC|+
-**RESETインストラクション [#d80745da] +***RESETインストラクション [#d80745da] 
-Dynamixelのコントロールテーブルの値を出荷時の初期値に戻します。~+デバイスのコントロールテーブルの値を出荷時の初期値に戻します。~
~ ~
&color(#000,#DDD){LENGTH}; : 0x02~ &color(#000,#DDD){LENGTH}; : 0x02~
Line 161: Line 147:
~ ~
例) IDが0のDynamixelを出荷時の設定に戻す~ 例) IDが0のDynamixelを出荷時の設定に戻す~
-''インストラクションパケット : 0xFF 0xFF 0x00 0x02 0x06 0xF7'' +
-|ヘッダ|ID|LENGTH|INSTRUCTION|CHECKSUM| +''インストラクションパケット : 0xFF 0xFF 0x00 0x02 0x06 0xF7''~ 
-|0xFF 0xFF|0x00|0x02|0x06|0xF7| +~ 
-''ステータスパケット : 0xFF 0xFF 0x00 0x02 0x00 0xFD'' +''ステータスパケット : 0xFF 0xFF 0x00 0x02 0x00 0xFD''~ 
-|ヘッダ|ID|LENGTH|ERROR|CHECKSUM| +
-|0xFF 0xFF|0x00|0x02|0x00|0xFD| +RESETを実行した後、DynamixelのIDが1に変わっていることに注意して下さい。 
-RESETを実行した後、DynamixelのIDが1に変わっていることに注意しましょう。+ 
 +***SYNC_WRITEインストラクション [#d25e994b] 
 +同時に複数のデバイスのコントロールテーブルへ個別のデータを書き込みます。~ 
 +1つのインストラクションで複数のデバイスへ書き込みを行えるため、個々にWRITE_DATAインストラクションを送信するよりも通信にかかるオーバヘッドを軽減できる他、値が反映されるタイミングをデバイス間で同期化できます。なお、書き込むアイテムのアドレスとデータ長はすべてのデバイスで共通となります。 
 +~&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を使ったのでステータスパケットは返ってきません。


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom