[[DYNAMIXEL2シリーズ>Dynamixelシリーズ 他#m101b537]]共通の通信プロトコルです。~ 異なるデバイスであっても、IDが重複しなければ同一ネットワークでの運用が可能です。 **パケット [#y962006c] ホスト(マスター)及びデバイス(スレーブ)はパケット単位で通信を行い、ホストからデバイスへ送信する「インストラクションパケット」、デバイスからホストへ送信する「ステータスパケット」の2種類あります。 #ref(DxProt1.png,80%) **ID [#i70fa31a] 複数のデバイスを同じノードに接続して運用するには、各々を区別するIDを使用します。ホストは任意のIDを持ったインストラクションパケットにて通信するデバイスを指定でき、またそのIDに従ったデバイスのみがステータスパケットをホストへ返信し、必要な命令を実行します。 #ref(DxProt2.png,80%) 複数のデバイスに同じID値が付けられているとパケットの衝突が起こり、通信障害が生じます。そのため、1つのネットワークノード内には同一IDを持つデバイスが複数存在してはなりません。 **インストラクションパケット構成 [#f7c5cc11] インストラクションパケットはホストからデバイスへ命令するためのパケットです。パケット構造は以下の通りです。なお、コントロールテーブル、使用可能なインストラクションセットに関しては後述します。~ ~ &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFD}; &color(#000,#DDD){0x00}; &color(#000,#DDD){ID}; &color(#000,#DDD){LENGTH_L}; &color(#000,#DDD){LENGTH_H}; &color(#000,#DDD){INSTRUCTION}; &color(#000,#DDD){PARAMETER 1};・・・&color(#000,#DDD){PARAMETER N}; &color(#000,#DDD){CRC_L}; &color(#000,#DDD){CRC_H};~ ~ -&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFD}; &color(#000,#DDD){0x00};~ 先頭に位置している4バイトはパケットの始まり(ヘッダ)を意味します。 -&color(#000,#DDD){ID};~ 送信先のデバイスのIDを指定します。DynamixelのIDは通常0x00~0xFDまで(254台)指定できます。~ また、0xFEは接続されている全デバイスを指定するBroadcast IDとなり、IDを0xFEに設定したパケットは全てのデバイスにて処理されます。なお、ブロードキャスト送信時はステータスパケットが返信されません。~ -&color(#000,#DDD){LENGTH_L}; &color(#000,#DDD){LENGTH_H};~ 「Parameter数(N) + 2」を16bitで指定します。~ -&color(#000,#DDD){INSTRUCTION};~ インストラクションを指定します。~ -&color(#000,#DDD){PARAMETER 1~N};~ インストラクションに従った追加情報を指定します。~ -&color(#000,#DDD){CRC_L}; &color(#000,#DDD){CRC_H};~ ヘッダからパラメータ末尾までのチェックサム値(CRC-16-IBM)を指定します。 **ステータスパケット構成 [#a1058504] ステータスパケットはデバイスがインストラクションパケットを受信した後、その応答としてホストへ返信するパケットです。パケット構造は以下の通りです。~ ~ &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFD}; &color(#000,#DDD){0x00}; &color(#000,#DDD){ID}; &color(#000,#DDD){LENGTH_L}; &color(#000,#DDD){LENGTH_H}; &color(#000,#DDD){0x55}; &color(#000,#DDD){ERROR}; &color(#000,#DDD){PARAMETER 1};・・・&color(#000,#DDD){PARAMETER N}; &color(#000,#DDD){CRC_L}; &color(#000,#DDD){CRC_H};~ ~ -&color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFF}; &color(#000,#DDD){0xFD}; &color(#000,#DDD){0x00};~ 先頭に位置している4バイトはパケットの始まり(ヘッダ)を意味します。~ -&color(#000,#DDD){ID};~ パケットを返信するDynamixelのIDです。~ -&color(#000,#DDD){LENGTH_L}; &color(#000,#DDD){LENGTH_H};~ 「Parameter数(N) + 3」を16bitで返します。 -&color(#000,#DDD){ERROR};~ デバイスの動作中に生じたアラームの状態を表します。該当アラームがある場合はそのビットが1になります。 | 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 |電源電圧が指定動作電圧の範囲を超えた| -&color(#000,#DDD){PARAMETER 1~N};~ インストラクションに従った追加情報を返します。~ -&color(#000,#DDD){CRC_L}; &color(#000,#DDD){CRC_H};~ ヘッダからパラメータ末尾までのチェックサム値(CRC-16-IBM)を返します。~ **コントロールテーブル [#xbe6b522] デバイスの内部機能及び設定はメモリマップとして提供され、インストラクションパケットを使用して操作されます。デバイスはコントロールテーブルに値を書くことで操作され、状態はコントロールテーブルから値を読むことで確認します。 -[[Dynamixel DX,RX,AXシリーズ用コントロールテーブル >Dynamixelコントロールテーブル(DX,RX,AXシリーズ用)]] -[[Dynamixel EXシリーズ用コントロールテーブル>EX Series Control table]] -[[AX-S1 Control table]] -[[USS3コントロールテーブル]] **インストラクションセット [#j7c4ce31] 以下が使用可能なインストラクションです。 | Instruction | Function | Value | Number of Parameter | | PING |デバイスの死活確認 | 0x01 | 0 | | READ |コントロールテーブルからの読み込み | 0x02 | 4 | | WRITE |コントロールテーブルへの書き込み(即時反映) | 0x03 | 3~ | | REG WRITE |コントロールテーブルへの書き込み(保留) | 0x04 | 3~ | | ACTION |REG WRITEで保留された値を反映 | 0x05 | 0 | | FACTORY RESET |デバイスのコントロールテーブルの値を出荷時デフォルト化 | 0x06 | 1 | | REBOOT |デバイスの再起動 | 0x08 | 0 | | SYNC READ |複数デバイスの同一コントロールテーブルから読み込み | 0x82 | 5~ | | SYNC WRITE |複数デバイスの同一コントロールテーブルへ書き込み | 0x83 | 6~ | | BULK READ |複数デバイスの異なるコントロールテーブルから読み込み | 0x92 | 6~ | | BULK WRITE |複数デバイスの異なるコントロールテーブルへ書き込み | 0x93 | 6~ | ***WRITE_DATAインストラクション [#za2d7929] コントロールテーブルへデータを書き込みます。~ Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。 ~&color(#000,#DDD){LENGTH}; : Parameter数(N) + 2~ &color(#000,#DDD){INSTRUCTION}; : 0x03~ &color(#000,#DDD){PARAMETER 1}; : 書き込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 2}; : 書き込む最初のデータ~ &color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~ ~ 例)接続されているDynamixelのIDを1に設定~ コントロールテーブルのAddress3に1を書き込みます。IDはBroadcast ID(0xFE)を使って送信します。~ ~ ''インストラクションパケット : 0xFF 0xFF 0xFE 0x04 0x03 0x03 0x01 0xF6''~ ~ Broadcast ID(0xFE)で送信したため、ステータスパケットは返ってきません。 ***READ_DATAインストラクション [#f183fe48] コントロールテーブルのデータを読み出します。~ Dynamixelの場合コントロールテーブルのStatus Return Level(Adress16)が2に設定されている場合にのみステータスパケットを送信します。 ~&color(#000,#DDD){LENGTH}; : 0x04~ &color(#000,#DDD){INSTRUCTION}; : 0x02~ &color(#000,#DDD){PARAMETER 1}; : 読み込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 2}; : 読み込むデータの長さ ~例) IDが1のDynamixelの内部温度(Address 0x2B 1byte)を読み込む~ ~ ''インストラクションパケット : 0xFF 0xFF 0x01 0x04 0x02 0x2B 0x01 0xCC''~ ~ ''ステータスパケット : 0xFF 0xFF 0x01 0x03 0x00 0x20 0xDB''~ ~ ***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){PARAMETER 1}; : 書き込むデータの先頭アドレス~ &color(#000,#DDD){PARAMETER 2}; : 書き込む最初のデータ~ &color(#000,#DDD){PARAMETER 3}; : 書き込む2番目のデータ~ &color(#000,#DDD){PARAMETER N+1}; : 書き込むN番目のデータ~ ***ACTIONインストラクション [#v7f41414] REG_WRITEで格納されたインストラクションを実行します。~ ~ &color(#000,#DDD){LENGTH}; : 0x02~ &color(#000,#DDD){INSTRUCTION}; : 0x05~ &color(#000,#DDD){PARAMETER}; : なし ***PINGインストラクション [#ya8e46c6] ノード中にある特定IDを持つDynamixelの存在を確認するときに使用します。指定されたIDを持ったDynamixelは、Broadcast IDを使用している、またはStatus Return Level(Adress16)に関わらず常にステータスパケットを返します。~ ~ &color(#000,#DDD){LENGTH}; : 0x02~ &color(#000,#DDD){INSTRUCTION}; : 0x01~ &color(#000,#DDD){PARAMETER}; : なし~ ~ 例) IDが1のDynamixelへPINGを行なう~ ~ ''インストラクションパケット : 0xFF 0xFF 0x01 0x02 0x01 0xFB''~ ~ ''ステータスパケット : 0xFF 0xFF 0x01 0x02 0x00 0xFC''~ ~ ***RESETインストラクション [#d80745da] デバイスのコントロールテーブルの値を出荷時の初期値に戻します。~ ~ &color(#000,#DDD){LENGTH}; : 0x02~ &color(#000,#DDD){INSTRUCTION}; : 0x06~ &color(#000,#DDD){PARAMETER}; : なし~ ~ 例) IDが0のDynamixelを出荷時の設定に戻す~ ~ ''インストラクションパケット : 0xFF 0xFF 0x00 0x02 0x06 0xF7''~ ~ ''ステータスパケット : 0xFF 0xFF 0x00 0x02 0x00 0xFD''~ ~ 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を使ったのでステータスパケットは返ってきません。
(This host) = https://www.besttechnology.co.jp