2020年6月19日金曜日

ICS_IPをつくる〜その1仕様検討

ジオニックテクニクスで使用しているサーボモータのKRS-3204と、KRS-3302をシリアルコントロールする話です。
通信インターフェースのICSに対応したIPが落ちていないのでこれを自作していきます。
せっかくの題材なのでこれまであまり本格的にやっていなかった高位合成を試していくこととします。
とりあえずは仕様を検討していきます。

ICSの仕様はここです。日本語なので楽勝。必要そうな情報は以下の通り。

最大接続数:
 Max 32個(ID:0〜31)
定周期送信データ:
 ポジション設定 14bit(周期0)x32
定周期受信データ:
 現在ポジション 14bit(周期0)x32
 現在電流値 7bit(周期1)x32
 現在温度 7bit(周期2)x32
オンデマンド送信データ:
 ストレッチ 7bit
 スピード 7bit
 電流制限 7bit
 温度制限 7bit
 EEPROM 64byte
オンデマンド受信データ:
 EEPROM 64byte
 (角度取得 14bit => ソフトで初期処理時に定周期送信データのポジション設定に反映する)
 
ポジションと電流値は制御に使いそうなので早い周期で回しておきます。
温度は比較的に急変しにくいと思うので少しゆっくりした周期で取得します。
オンデマンドの送信はそれほど多く発生しないと思われるので、全体で共有します。
ROSのサービスで使われることを想定します。
設定が反映されているかどうかはオンデマンドでEEPROMのデータを取得して確認します。
角度取得は初期化時にオンデマンドで取得できるようにしておきます。
定周期送信データは32ch分を一括で転送できるように連続して配置します。
定周期受信データも一括して取得できるようにポジション、電流値、温度毎に連続して配置します。

とりあえずレジスタマップはこんな感じかな。

offsetnamebitR/Winitial valuedescription
0x0010baud_rate[3:0]R/W0b00000:115200bps
1:625000bps
2:1152000bps
other:禁止


[31:4]R0x0000000RSV
0x0018number_of_servos[7:0]R/W0x01ICSで通信するサーボの数を書くこと


[31:8]R0x000000RSV
0x0020cyclic0_config[15:0]R/W0x000Acyclic0で通信する周期をms単位で指定


[30:16]R0x0000RSV


[31]R/W0b00:cyclic0の通信停止
1:cyclic0の通信開始
0x0028cyclic1_config[15:0]R/W0x000Acyclic1で通信する周期をms単位で指定


[30:16]R0x0000RSV


[31]R/W0b00:cyclic1の通信停止
1:cyclic1の通信開始
0x0030cyclic2_config[15:0]R/W0x03E8cyclic2で通信する周期をms単位で指定


[30:16]R0x0000RSV


[31]R/W0b00:cyclic2の通信停止
1:cyclic2の通信開始
0x0038ondemand_cmd[7:0]R/W0x00送信サイズをバイト単位で指定


[30:8]R0x00RSV


[31]R0b0ondemand通信ステータス
0:通信完了
1:通信中


[31]W0b0ondemand通信コマンド
0:変化なし
1:通信指示
0x0040RSV[31:0]R/W0x00000000RSV





0x07FCRSV[31:0]R/W0x00000000RSV
0x0800cyclic0_tx_0[7:5]R/W0b100ポジション設定コマンド(0b100)を書くこと


[4:0]R/W0b00000対象となるサーボのIDを書くこと


[15:8]R/W0x00RSV


[31:16]R/W0x0000設定舵角14bit(bit31,bit30は0固定)
0x0804cyclic0_tx_1[31:0]R/W0x00000080cyclic0_tx_0同様
0x0808cyclic0_tx_2[31:0]R/W0x00000080cyclic0_tx_0同様





0x087Ccyclic0_tx_31[31:0]R/W0x00000080cyclic0_tx_0同様
0x0880cyclic1_tx_0[7:5]R/W0b10115


[4:0]R/W0b00000対象となるサーボのIDを書くこと


[15:8]R/W0x03サブコマンドとして電流値を指定すること(0x03)


[23:16]R/W0x00RSV


[31:24]R/W0x00RSV
0x0884cyclic1_tx_1[31:0]R/W0x000003A0cyclic1_tx_0同様





0x08FCcyclic1_tx_31[31:0]R/W0x000003A0cyclic1_tx_0同様
0x0900cyclic2_tx_0[7:5]R/W0b101パラメータ読み出しコマンド(0b101)を書くこと


[4:0]R/W0b00000


[15:8]R/W0x04サブコマンドとして温度を指定すること(0x04)


[23:16]R/W0x00RSV


[31:24]R/W0x00RSV
0x0904cyclic2_tx_1[31:0]R/W0x000004A0cyclic2_tx_0同様





0x097Ccyclic2_tx_31[31:0]R/W0x000004A0cyclic2_tx_0同様
0x0980ondemand_tx_0_wd0[7:5]R/W0b000ICSの任意のコマンドを指定すること


[4:0]R/W0b00000対象のIDを記載すること


[15:8]R/W0x00ICSの2byte目を書くこと


[23:16]R/W0x00ICSの3byte目を書くこと


[31:24]R/W0x00ICSの4byte目を書くこと
0x0984ondemand_tx_0_wd1[7:0]R/W0x00ICSの5byte目を書くこと


[15:8]R/W0x00ICSの6byte目を書くこと


[23:16]R/W0x00ICSの7byte目を書くこと


[31:24]R/W0x00ICSの8byte目を書くこと





0x09C0ondemand_tx_0_wd17[7:0]R/W0x00ICSの65byte目を書くこと


[15:8]R/W0x00ICSの66byte目を書くこと


[23:16]R/W0x00RSV


[31:24]R/W0x00RSV
0x09C4RSV[31:0]R/W0x00RSV





0x0C00cyclic0_rx_0[7:5]R/W0x0000cyclic0_tx_0に対応する返信コマンド(0b000)


[4:0]R/W0b00cyclic0_tx_0に対応する返信データに記載されているサーボID


[15:8]R/W0x00受信カウンタ


[31:16]R/W0x00現在角度の取得結果。通信データと異なり14bitのデータに復元する
0x0C04cyclic0_rx_1[31:0]R/W0x00000000cyclic0_rx_0同様





0x0C7Ccyclic0_rx_31[31:0]R/W0x00000000cyclic0_rx_0同様
0x0C80cyclic1_rx_0[7:0]R/W0x00cyclic1_tx_0に対応した返信コマンドとIDが保存される


[15:8]R/W0x00cyclic1_tx_0に対応したサブコマンドが保存される


[23:16]R/W0x00読み出した電流値が保存される


[31:24]R/W0x00受信カウンタ
0x0C84cyclic1_rx_1[31:0]R/W0x00000000cyclic1_rx_0同様





0x0CFCcyclic1_rx_31[31:0]R/W0x00000000cyclic1_rx_0同様
0x0D00cyclic2_rx_0[7:0]R/W0x00cyclic1_tx_0に対応した返信コマンドとIDが保存される


[15:8]R/W0x00cyclic1_tx_0に対応したサブコマンドが保存される


[23:16]R/W0x00読み出した温度値が保存される


[31:24]R/W0x00受信カウンタ
0x0D04cyclic2_rx_1[31:0]R/W0x00000000cyclic2_rx_0同様





0x0D7Ccyclic2_rx_31[31:0]R/W0x00000000cyclic2_rx_0同様
0x0D80ondemand_rx_0_wd0[7:5]R/W0b000ondemand_tx_0_wd0に対応した返信コマンドが保存される


[4:0]R/W0b00000ondemand_tx_0_wd0に対応した返信コマンドのIDが保存される


[15:8]R/W0x00ondemand_tx_0の返信データ2byte目が保存される


[23:16]R/W0x00ondemand_tx_0の返信データ3byte目が保存される


[31:24]R/W0x00ondemand_tx_0の返信データ4byte目が保存される





0x0DC0ondemand_rx_0_wd17[7:0]R/W0x00ondemand_tx_0の返信データ65byte目が保存される


[15:8]R/W0x00ondemand_tx_0の返信データ66byte目が保存される


[23:16]R/W0x00RSV


[31:24]R/W0x00受信カウンタ
0x0DC4RSV[31:0]R/W0x00000000RSV





0x0FFCRSV[31:0]R/W0x00000000RSV