Dynamixel DX/RX/EX/AX/MXシリーズ共通の通信プロトコルです。また、Dynamixel XシリーズでプロトコルをV1に切り替えた際にも適用されます。
Dynamixelでは複数のデバイスを同じネットワークに接続して運用する事を前提としているため、各々のデバイスを区別するためにユニークなID番号を用いる事としています。
また、ホストは任意のIDを持ったデバイスを指定して命令し、指定されたIDに一致したデバイスがそれに応答するといったマスタースレーブ方式を採用しています。
なお、複数のデバイスに同じID値が付けられている事は前提としていないため、1つのネットワークに同一IDを持つデバイスが複数存在してはなりません。
デバイスの情報はメモリマップでとして提供されており、それをコントロールテーブルと称します。
複数の情報はコントロールテーブル上の異なるアドレスに割り当てられており、必要に応じてホストから任意のIDを持ったデバイスの任意のアドレスへアクセスします。
ホストとデバイス間は一般的なシリアル通信を行うハードウェアで接続され、パケット単位で処理される共通の通信プロトコルを用いて相互に情報をやりとりします。
ここではホストからデバイスへ送信されるパケットを「インストラクションパケット」、デバイスからホストへ送信されるパケットを「ステータスパケット」と称します。
ホストから送信するインストラクションパケットの主な機能はIDの指定とコントロールテーブルの任意のアドレスへのデータの読み書きとなります。そのパケットに対して応答すべきデバイスから返信されるステータスパケットには、ホストから読み出し要求されたコントロールテーブル内のデータや、書き込み要求に対する整合性の結果などが含まれます。
以後「0x」が付与された英数字は16進数、そうでないものは10進数とみなします。
また、デバイスのコントロールテーブル上のStatus Return Levelによってパケットの有無が異なります。
インストラクションパケットはホストからデバイスへ命令するためのパケットです。
パケット構造は以下の通りで、囲み1つが1byteを意味します。
SUM = ~(id + LEN + INS + Param1 + … + ParamN)
ステータスパケットはホストから送信されるインストラクションパケットをデバイスが受信した後、その応答としてデバイスからホストへ返信されるパケットです。
パケット構造は以下の通りで、囲み1つが1byteを意味します。
Bit | Name | Description |
7 | - | - |
6 | Instruction Error | 未定義のインストラクションが指定された、もしくはREG WRITEなしでACTIONが指定された |
5 | Overload Error | 指定された最大トルクで現在の負荷を制御できない |
4 | Checksum Error | インストラクションパケットのチェックサムが正しく無い |
3 | Range Error | パラメータの設定範囲を超えた |
2 | Overheating Error | 内部温度が設定温度を超えた |
1 | Angle Limit Error | Angle Limitの範囲外にGoal Positionが指定された |
0 | Input Voltage Error | 電源電圧が指定動作電圧の範囲を超えた |
SUM = ~(id + LEN + INS + Param1 + … + ParamN)
特定のIDを持ったDynamixelの存在を確認します。
IDに254を指定してPINGインストラクションを送信すると、ネットワークに存在する全てのDynamixelが順次ステータスパケットを返します。
例)
INST:ID=1にPINGを発行。
0xFF 0xFF ...Header
0x01 ...ID
0x02 ...Length
0x01 ...Instruction
0xFB ...Checksum
STAT:ID=1のDynamixelが応答。
0xFF 0xFF ...Header
0x01 ...ID
0x02 ...Length
0x00 ...Error
0xFC ...Checksum
特定IDのデバイスへアドレス・バイトサイズを指定してコントロールテーブルのデータを読み出します。IDは0~253の範囲が指定できます。
Param byte No. | Description |
1 | 開始アドレス |
2 | バイトサイズ(N) |
Param byte No. | Description |
1 | DATA[0] |
2 | DATA[1] |
3 | DATA[2] |
... | ... |
N | DATA[N-1] |
例)
INST:AX-12A想定。ID=1に対しパラメータにAddress=43(0x2B PresentTemperature), Length=2(0x02)を指定してREADを発行。
0xFF 0xFF ...Header
0x01 ...ID
0x04 ...Length
0x02 ...Instruction
0x2B ...開始アドレス
0x01 ...バイトサイズ
0xCC ...Checksum
STAT:8bit幅で現在のPresentTemperature=32(0x20)の値を返信。
0xFF 0xFF ...Header
0x01 ...ID
0x03 ...Length
0x00 ...Error
0x20 ...DATAs
0xDB ...Checksum
特定IDのデバイスへアドレス・データ(任意バイト数)を指定してコントロールテーブルへ書き込みます。IDは0~252の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。
Param byte No. | Description |
1 | 開始アドレス |
2 | |
3 | DATA[0] |
4 | DATA[1] |
5 | DATA[2] |
... | ... |
N+2 | DATA[N-1] |
例)
INST:AX-12A想定。ID=1(0x01)に対しパラメータにAddress=30(0x1E GoalPosition), Data=512(0x0200 16bit幅)を指定してWRITEを発行。
0xFF 0xFF ...Header
0x01 ...ID
0x05 ...Length
0x03 ...Instruction
0x1E ...開始アドレス
0x00 02 ...DATAs
0xD7 ...Checksum
STAT:ID=1のDynamixelが応答。
0xFF 0xFF ...Header
0x01 ...ID
0x02 ...Length
0x00 ...Error
0xFC ...Checksum
特定IDのデバイスへアドレス・データ(任意バイト数)を指定してコントロールテーブルへ書き込む点ではWRITEインストラクションと同じですが、その後ACTIONインストラクションが実行されない限りコントロールテーブルへ反映されません。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。
なお、REG WRITEを受信したデバイスは、コントロールテーブル上のアイテムRegistered Instructionを1にし、ACTIONインストラクションを待機中である事を示します。
Param byte No. | Description |
1 | 開始アドレス |
2 | DATA[0] |
3 | DATA[1] |
4 | DATA[2] |
... | ... |
N+1 | DATA[N-1] |
例)
INST:AX-12A想定。ID=1に対しパラメータにAddress=30(0x1E GoalPosition), Data=200(0x00C8 16bit幅)を指定してREG WRITEを発行。
0xFF 0xFF ...Header
0x01 ...ID
0x05 ...Length
0x04 ...Instruction
0x1E ...開始アドレス
0xC8 0x00 ...DATAs
0x0F ...Checksum
STAT:ID=1のDynamixelが応答。
0xFF 0xFF ...Header
0x01 ...ID
0x02 ...Length
0x00 ...Error
0xFC ...Checksum
REG WRITEインストラクションで待機中のデバイスのコントロールテーブルを更新します。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。
ACTIONを受け取ったデバイスはRegistered Instructionが1であれば0になりますが、0であったデバイスはエラーを返します。
例)
INST:ID=1に対しACTIONを発行。
0xFF 0xFF ...Header
0x01 ...ID
0x03 ...Length
0x05 ...Instruction
0xF6 ...Checksum
STAT:Registered Instructionが1であった場合の正常時の返信。
0xFF 0xFF ...Header
0x01 ...ID
0x02 ...Length
0x00 ...Error
0xFC...Checksum
特定IDのデバイスを出荷時の状態にします。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。
例)
INST:ID=0にRESETを発行。
0xFF 0xFF ...Header
0x00 ...ID
0x02 ...Length
0x06 ...Instruction
0xF7 ...Checksum
STAT:正常時の返信
0xFF 0xFF ...Header
0x00 ...ID
0x02 ...Length
0x00 ...Error
0xFD
Parameterに共通のアドレス・共通のバイトサイズ(16bit幅)・複数のIDと各データを指定した1回のインストラクションパケットで、複数のデバイスのコントロールテーブルへ書き込みます。
インストラクションパケットのIDは254固定、パラメータ内のIDは重複しない0~253の範囲をとります。
Param byte No. | Description | |
1 | 開始アドレス | |
2 | バイトサイズ(N) (1以上) | |
3 | 1stデバイス | ID (0~253) |
4 | DATAa[0] | |
5 | DATAa[1] | |
... | ... | |
N+3 | DATAa[N-1] | |
N+4 | 2ndデバイス | ID (0~253) |
N+5 | DATAb[0] | |
N+6 | DATAb[1] | |
... | ... | |
2*N+4 | DATAb[N-1] | |
2*N+5 | 3rdデバイス | ID (0~253) |
2*N+6 | DATAc[0] | |
2*N+7 | DATAc[1] | |
... | ... | |
3*N+5 | DATAc[N-1] | |
... | ... | ... |
0xFF 0xFF ...Header
0xFE ...ID(254固定)
0x18 ...Length
0x83 ...Instruction
0x1E ...開始アドレス
0x04 ...バイトサイズ
0x00 0x10 0x00 0x50 0x01 ...1st ID, DATAs
0x01 0x20 0x02 0x60 0x03 ...2nd ID, DATAs
0x02 0x30 0x00 0x70 0x01 ...3rd ID, DATAs
0x03 0x20 0x02 0x80 0x03 ...4th ID, DATAs
0x12 ...Checksum