現: 2017-08-20 (日) 00:32:26 takaboo | |||
---|---|---|---|
Line 1: | Line 1: | ||
+ | TITLE:Dynamixel通信プロトコルV1マニュアル | ||
+ | Dynamixel DX/RX/EX/AX/MXシリーズ共通の通信プロトコルです。また、Dynamixel XシリーズでプロトコルをV1に切り替えた際にも適用されます。 | ||
+ | **基本的な情報 [#v622f8df] | ||
+ | ***ID [#i70fa31a] | ||
+ | Dynamixelでは複数のデバイスを同じネットワークに接続して運用する事を前提としているため、各々のデバイスを区別するためにユニークなID番号を用いる事としています。~ | ||
+ | また、ホストは任意のIDを持ったデバイスを指定して命令し、指定されたIDに一致したデバイスがそれに応答するといったマスタースレーブ方式を採用しています。 | ||
+ | #ref(DXLSHARE/RS485_MX_DifferentID.png) | ||
+ | なお、複数のデバイスに同じID値が付けられている事は前提としていないため、1つのネットワークに同一IDを持つデバイスが複数存在してはなりません。 | ||
+ | |||
+ | ***コントロールテーブル [#xbe6b522] | ||
+ | デバイスの情報はメモリマップでとして提供されており、それをコントロールテーブルと称します。~ | ||
+ | 複数の情報はコントロールテーブル上の異なるアドレスに割り当てられており、必要に応じてホストから任意のIDを持ったデバイスの任意のアドレスへアクセスします。 | ||
+ | |||
+ | ***パケット通信 [#y962006c] | ||
+ | ホストとデバイス間は一般的なシリアル通信を行うハードウェアで接続され、パケット単位で処理される共通の通信プロトコルを用いて相互に情報をやりとりします。~ | ||
+ | ここではホストからデバイスへ送信されるパケットを「インストラクションパケット」、デバイスからホストへ送信されるパケットを「ステータスパケット」と称します。 | ||
+ | #ref(DxProt1.png) | ||
+ | ホストから送信するインストラクションパケットの主な機能はIDの指定とコントロールテーブルの任意のアドレスへのデータの読み書きとなります。そのパケットに対して応答すべきデバイスから返信されるステータスパケットには、ホストから読み出し要求されたコントロールテーブル内のデータや、書き込み要求に対する整合性の結果などが含まれます。 | ||
+ | |||
+ | **パケット詳細 [#j4dde86d] | ||
+ | 以後「0x」が付与された英数字は16進数、そうでないものは10進数とみなします。~ | ||
+ | また、デバイスのコントロールテーブル上のStatus Return Levelによってパケットの有無が異なります。 | ||
+ | |||
+ | ***インストラクションパケット [#f7c5cc11] | ||
+ | インストラクションパケットはホストからデバイスへ命令するためのパケットです。~ | ||
+ | パケット構造は以下の通りで、囲み1つが1byteを意味します。 | ||
+ | #ref(inst.png,75%) | ||
+ | -Header~ | ||
+ | 先頭2バイトは0xFF,0xFFの固定値。 | ||
+ | -ID~ | ||
+ | 送信先のデバイスのID。0~253(0x00~0xFD)の範囲及び254(0xFE)。~ | ||
+ | 254のIDは1回のインストラクションパケットで複数のデバイスに対して命令を発効する際に使用。 | ||
+ | -Length~ | ||
+ | Instruction以後の全てのバイト数。 | ||
+ | -Instruction~ | ||
+ | 以下のいずれかのインストラクション。~ | ||
+ | | Instruction | Function | Value | Number of Parameter |h | ||
+ | | [[PING>#PING]] |デバイスの死活確認 | 0x01 | 0 | | ||
+ | | [[READ>#READ]] |コントロールテーブルから読み出し | 0x02 | 2 | | ||
+ | | [[WRITE>#WRITE]] |コントロールテーブルへ書き込み(即時反映) | 0x03 | 2~ | | ||
+ | | [[REG WRITE>#REGWRITE]] |コントロールテーブルへ書き込み(保留) | 0x04 | 2~ | | ||
+ | | [[ACTION>#ACTION]] |REG_WRITEで保留された値を反映 | 0x05 | 0 | | ||
+ | | [[RESET>#RESET]] |デバイスのコントロールテーブルを出荷時の値に初期化 | 0x06 | 0 | | ||
+ | | [[SYNC WRITE>#SYNCWRITE]] |複数デバイスの同一コントロールテーブルへの一括書き込み(即時反映) | 0x83 | 4~ | | ||
+ | -Parameter~ | ||
+ | Instructionで要求される追加情報(可変長)。~ | ||
+ | -Checksum~ | ||
+ | 計算方法は次の通りです。~ | ||
+ | SUM = ~(id + LEN + INS + Param1 + … + ParamN) | ||
+ | 計算された値が255を超えた場合は下位8ビットをSUMとします。 | ||
+ | |||
+ | ***ステータスパケット [#a1058504] | ||
+ | ステータスパケットはホストから送信されるインストラクションパケットをデバイスが受信した後、その応答としてデバイスからホストへ返信されるパケットです。~ | ||
+ | パケット構造は以下の通りで、囲み1つが1byteを意味します。 | ||
+ | #ref(stat.png,75%) | ||
+ | -Header~ | ||
+ | 先頭2バイトは0xFF,0xFFの固定値。 | ||
+ | -ID~ | ||
+ | デバイスのID。~ | ||
+ | -Length~ | ||
+ | Error以後の全てのバイト数。 | ||
+ | -Error~ | ||
+ | パケット処理中に検出されたデバイスの動作状況等。~ | ||
+ | | Bit | Name | Description |h | ||
+ | | 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 |電源電圧が指定動作電圧の範囲を超えた| | ||
+ | -Parameter~ | ||
+ | インストラクションパケットに従った追加情報(可変長)。~ | ||
+ | -Checksum~ | ||
+ | 計算方法は次の通りです。 | ||
+ | SUM = ~(id + LEN + INS + Param1 + … + ParamN) | ||
+ | 計算された値が255を超えた場合は下位8ビットをSUMとします。 | ||
+ | |||
+ | **インストラクション詳細 [#x0eafb6e] | ||
+ | |||
+ | ***PING [#PING] | ||
+ | 特定のIDを持ったDynamixelの存在を確認します。~ | ||
+ | IDに254を指定してPINGインストラクションを送信すると、ネットワークに存在する全てのDynamixelが順次ステータスパケットを返します。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | なし | ||
+ | -ステータスパケットのParameter~ | ||
+ | なし | ||
+ | |||
+ | 例)~ | ||
+ | INST:ID=1にPINGを発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; '''...Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x01}; ...'''Instruction'''~ | ||
+ | &color(#000,cornflowerblue){0xFB}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:ID=1のDynamixelが応答。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,cornflowerblue){0xFC}; ...'''Checksum'''~ | ||
+ | < | ||
+ | |||
+ | ***READ [#READ] | ||
+ | 特定IDのデバイスへアドレス・バイトサイズを指定してコントロールテーブルのデータを読み出します。IDは0~253の範囲が指定できます。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | |CENTER:|LEFT:|c | ||
+ | |Param byte No.|=Description|h | ||
+ | |1|開始アドレス| | ||
+ | |2|バイトサイズ(N)| | ||
+ | -ステータスパケットのParameter | ||
+ | |CENTER:|LEFT:|c | ||
+ | |Param byte No.|=Description|h | ||
+ | |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を発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x04}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x02}; ...'''Instruction'''~ | ||
+ | &color(#000,peachpuff){0x2B}; ...'''開始アドレス'''~ | ||
+ | &color(#000,peachpuff){0x01}; ...'''バイトサイズ'''~ | ||
+ | &color(#000,cornflowerblue){0xCC}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:8bit幅で現在のPresentTemperature=32(0x20)の値を返信。~ | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x03}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,peachpuff){0x20}; ...'''DATAs'''~ | ||
+ | &color(#000,cornflowerblue){0xDB}; ...'''Checksum'''~ | ||
+ | < | ||
+ | |||
+ | ***WRITE [#WRITE] | ||
+ | 特定IDのデバイスへアドレス・データ(任意バイト数)を指定してコントロールテーブルへ書き込みます。IDは0~252の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | |CENTER:|LEFT:|c | ||
+ | |Param byte No.|=Description|h | ||
+ | |1|開始アドレス| | ||
+ | |2|~| | ||
+ | |3|DATA[0]| | ||
+ | |4|DATA[1]| | ||
+ | |5|DATA[2]| | ||
+ | |...|...| | ||
+ | |N+2|DATA[N-1]| | ||
+ | -ステータスパケットのParameter~ | ||
+ | なし | ||
+ | |||
+ | 例)~ | ||
+ | INST:AX-12A想定。ID=1(0x01)に対しパラメータにAddress=30(0x1E GoalPosition), Data=512(0x0200 16bit幅)を指定してWRITEを発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x05}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x03}; ...'''Instruction'''~ | ||
+ | &color(#000,peachpuff){0x1E}; ...'''開始アドレス'''~ | ||
+ | &color(#000,peachpuff){0x00 02}; ...'''DATAs'''~ | ||
+ | &color(#000,cornflowerblue){0xD7}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:ID=1のDynamixelが応答。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,cornflowerblue){0xFC}; ...'''Checksum'''~ | ||
+ | < | ||
+ | |||
+ | ***REG WRITE [#REGWRITE] | ||
+ | 特定IDのデバイスへアドレス・データ(任意バイト数)を指定してコントロールテーブルへ書き込む点ではWRITEインストラクションと同じですが、その後ACTIONインストラクションが実行されない限りコントロールテーブルへ反映されません。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。~ | ||
+ | なお、REG WRITEを受信したデバイスは、コントロールテーブル上のアイテムRegistered Instructionを1にし、ACTIONインストラクションを待機中である事を示します。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | |CENTER:|LEFT:|c | ||
+ | |Param byte No.|=Description|h | ||
+ | |1|開始アドレス| | ||
+ | |2|DATA[0]| | ||
+ | |3|DATA[1]| | ||
+ | |4|DATA[2]| | ||
+ | |...|...| | ||
+ | |N+1|DATA[N-1]| | ||
+ | -ステータスパケットのParameter~ | ||
+ | なし | ||
+ | |||
+ | 例)~ | ||
+ | INST:AX-12A想定。ID=1に対しパラメータにAddress=30(0x1E GoalPosition), Data=200(0x00C8 16bit幅)を指定してREG WRITEを発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x05}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x04}; ...'''Instruction'''~ | ||
+ | &color(#000,peachpuff){0x1E}; ...'''開始アドレス'''~ | ||
+ | &color(#000,peachpuff){0xC8 0x00}; ...'''DATAs'''~ | ||
+ | &color(#000,cornflowerblue){0x0F}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:ID=1のDynamixelが応答。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,cornflowerblue){0xFC}; ...'''Checksum'''~ | ||
+ | < | ||
+ | |||
+ | ***ACTION [#ACTION] | ||
+ | REG WRITEインストラクションで待機中のデバイスのコントロールテーブルを更新します。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。~ | ||
+ | ACTIONを受け取ったデバイスはRegistered Instructionが1であれば0になりますが、0であったデバイスはエラーを返します。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | なし | ||
+ | -ステータスパケットのParameter~ | ||
+ | なし | ||
+ | |||
+ | 例)~ | ||
+ | INST:ID=1に対しACTIONを発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x03}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x05}; ...'''Instruction'''~ | ||
+ | &color(#000,cornflowerblue){0xF6}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:Registered Instructionが1であった場合の正常時の返信。~ | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0x01}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,cornflowerblue){0xFC};...'''Checksum'''~ | ||
+ | < | ||
+ | |||
+ | ***RESET [#RESET] | ||
+ | 特定IDのデバイスを出荷時の状態にします。IDは0~253の範囲と254が指定でき、254を指定した場合はステータスパケットが返りません。 | ||
+ | -インストラクションパケットのParameter~ | ||
+ | なし | ||
+ | -ステータスパケットのParameter~ | ||
+ | なし | ||
+ | |||
+ | 例)~ | ||
+ | INST:ID=0にRESETを発行。 | ||
+ | > | ||
+ | >&color(#000,silver){0xFF 0xFF}; '''...Header'''~ | ||
+ | &color(#000,aquamarine){0x00}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x06}; ...'''Instruction'''~ | ||
+ | &color(#000,cornflowerblue){0xF7}; ...'''Checksum'''~ | ||
+ | < | ||
+ | STAT:正常時の返信 | ||
+ | >&color(#000,silver){0xFF 0xFF}; '''...Header'''~ | ||
+ | &color(#000,aquamarine){0x00}; ...'''ID'''~ | ||
+ | &color(#000,lemonchiffon){0x02}; ...'''Length'''~ | ||
+ | 0x00 ...'''Error'''~ | ||
+ | &color(#000,cornflowerblue){0xFD};~ | ||
+ | < | ||
+ | |||
+ | ***SYNC WRITE [#SYNCWRITE] | ||
+ | Parameterに共通のアドレス・共通のバイトサイズ(16bit幅)・複数のIDと各データを指定した1回のインストラクションパケットで、複数のデバイスのコントロールテーブルへ書き込みます。~ | ||
+ | インストラクションパケットのIDは254固定、パラメータ内のIDは重複しない0~253の範囲をとります。 | ||
+ | |||
+ | -インストラクションパケットのParameter~ | ||
+ | |CENTER:|LEFT:|<|c | ||
+ | |Param byte No.|=Description|<|h | ||
+ | |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]| | ||
+ | |...|...|...| | ||
+ | 例)~ | ||
+ | INST:AX-12A想定。ID=0へGoalPositionを16(0x0010),GoalSpeedを336(0x0150)、ID=1へGoalPositionを544(0x0220),GoalSpeedを864(0x0360)、ID=2へGoalPositionを48(0x0030),GoalSpeedを368(0x0170)、ID=3へGoalPositionを544(0x0220),GoalSpeedを896(0x0380)を指定してSYNC WRITEを発行。 | ||
+ | >&color(#000,silver){0xFF 0xFF}; ...'''Header'''~ | ||
+ | &color(#000,aquamarine){0xFE}; ...'''ID(254固定)'''~ | ||
+ | &color(#000,lemonchiffon){0x18}; ...'''Length'''~ | ||
+ | &color(#000,peru){0x83}; ...'''Instruction'''~ | ||
+ | &color(#000,peachpuff){0x1E}; ...'''開始アドレス'''~ | ||
+ | &color(#000,peachpuff){0x04}; ...'''バイトサイズ'''~ | ||
+ | &color(#000,peachpuff){0x00}; &color(#000,peachpuff){0x10 0x00 0x50 0x01}; ...'''1st ID, DATAs'''~ | ||
+ | &color(#000,peachpuff){0x01}; &color(#000,peachpuff){0x20 0x02 0x60 0x03}; ...'''2nd ID, DATAs'''~ | ||
+ | &color(#000,peachpuff){0x02}; &color(#000,peachpuff){0x30 0x00 0x70 0x01}; ...'''3rd ID, DATAs'''~ | ||
+ | &color(#000,peachpuff){0x03}; &color(#000,peachpuff){0x20 0x02 0x80 0x03}; ...'''4th ID, DATAs'''~ | ||
+ | &color(#000,cornflowerblue){0x12}; ...'''Checksum'''~ | ||
+ | < |