8: 2010-11-29 (月) 19:03:38 sho | 現: 2011-07-04 (月) 21:45:31 takaboo | ||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:Dynamixel通信プロトコル | TITLE:Dynamixel通信プロトコル | ||
- | [[Dynamixelシリーズ>Dynamixelシリーズ 他#m101b537]]で共通の通信プロトコルです。~ | + | 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を持つデバイスが複数存在してはなりません。 |
**インストラクションパケット構成 [#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 22: | 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 36: | 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 48: | Line 47: | ||
「Parameter数(N) + 2」を返します。 | 「Parameter数(N) + 2」を返します。 | ||
-&color(#000,#DDD){ERROR};~ | -&color(#000,#DDD){ERROR};~ | ||
- | Dynamixelの動作中に生じたエラーの状態を表します。エラーがある場合は各ビットが1になります。 | + | デバイスの動作中に生じたアラームの状態を表します。該当アラームがある場合はそのビットが1になります。 |
| Bit | 名称 | 内容 | | | Bit | 名称 | 内容 | | ||
|Bit7| - | - | | |Bit7| - | - | | ||
Line 66: | Line 65: | ||
**コントロールテーブル [#xbe6b522] | **コントロールテーブル [#xbe6b522] | ||
- | Dynamixelの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。Dynamixelはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。 | + | デバイスの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。デバイスはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。 |
- | -[[Dynamixelコントロールテーブル(DX,RX,AXシリーズ用)]] | + | |
- | -[[EXシリーズコントロールテーブル>EX Series Control table]] | + | |
- | -[[AX-S1コントロールテーブル]] | + | |
- | -[[USS3コントロールテーブル]] | + | |
**インストラクションセット [#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 | 同時に複数のDynamixelを制御するときに使用します | 0x83 | 4~ | | + | | 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 100: | Line 95: | ||
***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''~ | ||
Line 115: | Line 109: | ||
***REG_WRITEインストラクション [#m9b4cdbe] | ***REG_WRITEインストラクション [#m9b4cdbe] | ||
- | REG_WRITEはWRITE_DATAとほぼ同じですが実行タイミングが違います。インストラクションパケットを受け取ると値はバッファに格納され、WRITEインストラクションがスタンバイの状態になります。このとき、Registered Instruction(Address44)が1に設定されます。ACTIONインストラクションパケットを受け取った後、格納されたWRITEインストラクションが実行されます。~ | + | WRITE_DATAとほぼ同じですが、REG_WRITEインストラクションを受け取ると、デバイスはその値を即時反映せずに保留します。その際、Dynamixelの場合はRegistered Instruction(Address44)を1に設定します。その後、ACTIONインストラクションを受け取ると保留された値が反映されます。~ |
- | ~ | + | ACTIONインストラクションが受信されるまで、保留された値は永続的に反映されません。 |
- | &color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~ | + | ~&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 129: | Line 123: | ||
&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] | ||
Line 148: | Line 140: | ||
***RESETインストラクション [#d80745da] | ***RESETインストラクション [#d80745da] | ||
- | Dynamixelのコントロールテーブルの値を出荷時の初期値に戻します。~ | + | デバイスのコントロールテーブルの値を出荷時の初期値に戻します。~ |
~ | ~ | ||
&color(#000,#DDD){LENGTH}; : 0x02~ | &color(#000,#DDD){LENGTH}; : 0x02~ | ||
Line 163: | Line 155: | ||
***SYNC_WRITEインストラクション [#d25e994b] | ***SYNC_WRITEインストラクション [#d25e994b] | ||
- | 同時に複数のDynamixelを制御します。SYNC_WRITEは1つのインストラクションパケットで複数のインストラクションを送るので通信時間を減らすことが可能です。しかし、書き込むデータのアドレスとデータ長が同じインストラクションに限ります。また、Broadcast IDの使用が必要です。~ | + | 同時に複数のデバイスのコントロールテーブルへ個別のデータを書き込みます。~ |
- | ~ | + | 1つのインストラクションで複数のデバイスへ書き込みを行えるため、個々にWRITE_DATAインストラクションを送信するよりも通信にかかるオーバヘッドを軽減できる他、値が反映されるタイミングをデバイス間で同期化できます。なお、書き込むアイテムのアドレスとデータ長はすべてのデバイスで共通となります。 |
- | &color(#000,#DDD){ID}; : 0xFE~ | + | ~&color(#000,#DDD){ID}; : 0xFE~ |
&color(#000,#DDD){LENGTH}; : (L+1) * N+4 (L : 各Dynamixelのデータ長、N : Dynamixelの個数)~ | &color(#000,#DDD){LENGTH}; : (L+1) * N+4 (L : 各Dynamixelのデータ長、N : Dynamixelの個数)~ | ||
&color(#000,#DDD){INSTRUCTION}; : 0x83~ | &color(#000,#DDD){INSTRUCTION}; : 0x83~ |