Dynamixelシリーズ共通の通信プロトコルです。
異なるデバイスであっても、IDが重複しなければ同一ネットワークでの運用が可能です。
ホスト(マスター)及びデバイス(スレーブ)はパケット単位で通信を行い、ホストからデバイスへ送信する「インストラクションパケット」、デバイスからホストへ送信する「ステータスパケット」の2種類あります。
複数のデバイスを同じノードに接続して運用するには、各々を区別するIDを使用します。ホストは任意のIDを持ったインストラクションパケットにて通信するデバイスを指定でき、またそのIDに従ったデバイスのみがステータスパケットをホストへ返信し、必要な命令を実行します。
複数のデバイスに同じID値が付けられているとパケットの衝突が起こり、通信障害が生じます。そのため、1つのネットワークノード内には同一IDを持つデバイスが複数存在してはなりません。
インストラクションパケットはホストからデバイスへ命令するためのパケットです。パケット構造は以下の通りです。なお、コントロールテーブル、使用可能なインストラクションセットに関しては後述します。
0xFF 0xFF ID
LENGTH INSTRUCTION PARAMETER 1・・・PARAMETER N CHECKSUM
ステータスパケットはデバイスがインストラクションパケットを受信した後、その応答としてホストへ返信するパケットです。パケット構造は以下の通りです。
0xFF 0xFF ID
LENGTH ERROR PARAMETER 1・・・PARAMETER N CHECKSUM
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 | 電源電圧が指定動作電圧の範囲を超えた |
デバイスの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。デバイスはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。
以下が使用可能なインストラクションです。
Instruction | Function | Value | Number of Parameter |
PING | デバイスの死活確認 | 0x01 | 0 |
READ_DATA | コントロールテーブルから読み出し | 0x02 | 2 |
WRITE_DATA | コントロールテーブルへ書き込み(即時反映) | 0x03 | 2~ |
REG_WRITE | コントロールテーブルへ書き込み(保留) | 0x04 | 2~ |
ACTION | REG_WRITEで保留された値を反映 | 0x05 | 0 |
RESET | デバイスのコントロールテーブルを出荷時の値に初期化 | 0x06 | 0 |
SYNC_WRITE | 複数デバイスの同一コントロールテーブルへの一括書き込み(即時反映) | 0x83 | 4~ |
コントロールテーブルへデータを書き込みます。
Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。
LENGTH : Parameter数(N) + 2
INSTRUCTION : 0x03
PARAMETER 1 : 書き込むデータの先頭アドレス
PARAMETER 2 : 書き込む最初のデータ
PARAMETER N+1 : 書き込むN番目のデータ
例)接続されているDynamixelのIDを1に設定
コントロールテーブルのAddress3に1を書き込みます。IDはBroadcast ID(0xFE)を使って送信します。
インストラクションパケット : 0xFF 0xFF 0xFE 0x04 0x03 0x03 0x01 0xF6
Broadcast ID(0xFE)で送信したため、ステータスパケットは返ってきません。
コントロールテーブルのデータを読み出します。
Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。
LENGTH : 0x04
INSTRUCTION : 0x02
PARAMETER 1 : 読み込むデータの先頭アドレス
PARAMETER 2 : 読み込むデータの長さ
例) IDが1のDynamixelの内部温度(Address 0x2B 1byte)を読み込む
インストラクションパケット : 0xFF 0xFF 0x01 0x04 0x02 0x2B 0x01 0xCC
ステータスパケット : 0xFF 0xFF 0x01 0x03 0x00 0x20 0xDB
WRITE_DATAとほぼ同じですが、REG_WRITEインストラクションを受け取ると、デバイスはその値を即時反映せずに保留します。その際、Dynamixelの場合はRegistered Instruction(Address44)を1に設定します。その後、ACTIONインストラクションを受け取ると保留された値が反映されます。
ACTIONインストラクションが受信されるまで、保留された値は永続的に反映されません。
LENGTH : Parameter数(N) + 2
INSTRUCTION : 0x04
PARAMETER 1 : 書き込むデータの先頭アドレス
PARAMETER 2 : 書き込む最初のデータ
PARAMETER 3 : 書き込む2番目のデータ
PARAMETER N+1 : 書き込むN番目のデータ
ノード中にある特定IDを持つDynamixelの存在を確認するときに使用します。指定されたIDを持ったDynamixelは、Broadcast IDを使用している、またはStatus Return Level(Adress16)に関わらず常にステータスパケットを返します。
LENGTH : 0x02
INSTRUCTION : 0x01
PARAMETER : なし
例) IDが1のDynamixelへPINGを行なう
インストラクションパケット : 0xFF 0xFF 0x01 0x02 0x01 0xFB
ステータスパケット : 0xFF 0xFF 0x01 0x02 0x00 0xFC
デバイスのコントロールテーブルの値を出荷時の初期値に戻します。
LENGTH : 0x02
INSTRUCTION : 0x06
PARAMETER : なし
例) IDが0のDynamixelを出荷時の設定に戻す
インストラクションパケット : 0xFF 0xFF 0x00 0x02 0x06 0xF7
ステータスパケット : 0xFF 0xFF 0x00 0x02 0x00 0xFD
RESETを実行した後、DynamixelのIDが1に変わっていることに注意して下さい。
同時に複数のデバイスのコントロールテーブルへ個別のデータを書き込みます。
1つのインストラクションで複数のデバイスへ書き込みを行えるため、個々にWRITE_DATAインストラクションを送信するよりも通信にかかるオーバヘッドを軽減できる他、値が反映されるタイミングをデバイス間で同期化できます。なお、書き込むアイテムのアドレスとデータ長はすべてのデバイスで共通となります。
ID : 0xFE
LENGTH : (L+1) * N+4 (L : 各Dynamixelのデータ長、N : Dynamixelの個数)
INSTRUCTION : 0x83
PARAMETER 1 : 書き込むデータの先頭アドレス
PARAMETER 2 : 書き込むデータの長さ
PARAMETER 3 : 1番目のDynamixelのID
PARAMETER 4 : 1番目のDynamixelの書き込む1番目のデータ
PARAMETER 5 : 1番目のDynamixelの書き込む2番目のデータ
・
・
PARAMETER L+3 : 1番目のDynamixelの書き込むL番目のデータ
PARAMETER L+4 : 2番目のDynamixelのID
PARAMETER L+5 : 2番目のDynamixelの書き込む1番目のデータ
PARAMETER L+6 : 2番目のDynamixelの書き込む2番目のデータ
・
・
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を使ったのでステータスパケットは返ってきません。