2: 2011-07-05 (火) 19:17:42 yoshida[6] [7] | 3: 2011-07-06 (水) 12:54:27 yoshida[6] [8] | ||
---|---|---|---|
Line 27: | Line 27: | ||
合わせて、不要になる変数も削除します。~ | 合わせて、不要になる変数も削除します。~ | ||
#ref(gcc_edit_1.png,100%) | #ref(gcc_edit_1.png,100%) | ||
- | AX-12+のホーンを回転させれば手は開きますので、fd_DXSetPositionを使用します。~ | + | AX-12+のホーンを回転させれば手は開きますので、[[fd_DXSetPosition>FDIIILIB#nbe84864]]を使用します。~ |
#ref(AX12Hone.png,100%) | #ref(AX12Hone.png,100%) | ||
Line 39: | Line 39: | ||
先ずAX-12+から読み込んだ負荷の値を保存するための変数を宣言します。負荷は、AX-12+コントロールテーブルのアドレス40と41の値で表されることから、読み込んだ負荷の値を入れる変数も、16ビットのデータサイズである必要があります。 | 先ずAX-12+から読み込んだ負荷の値を保存するための変数を宣言します。負荷は、AX-12+コントロールテーブルのアドレス40と41の値で表されることから、読み込んだ負荷の値を入れる変数も、16ビットのデータサイズである必要があります。 | ||
- | #ref(RobotHand_p6.png, 100%) | + | #ref(gcc_edit_2.png, 100%) |
変数名のLoadDataは、負荷データという意味です。変数名は何でも構いませんが、後で見直した時に、何のための変数なのかが直ぐ分るような名前にしましょう。 | 変数名のLoadDataは、負荷データという意味です。変数名は何でも構いませんが、後で見直した時に、何のための変数なのかが直ぐ分るような名前にしましょう。 | ||
Line 50: | Line 50: | ||
fd_DXGetLoad関数の後に読み込んだ負荷の値を表示します。 | fd_DXGetLoad関数の後に読み込んだ負荷の値を表示します。 | ||
- | 負荷の値は[[コントロールテーブル>DXTABLE1#k921f4f9]]で10ビットまで使用することになっていますので、4桁表示としています。(10ビットで表現できる最大数は2047) | + | 負荷の値は[[コントロールテーブル>DXTABLE1#k921f4f9]]で11ビット使用することになっていますので、4桁表示としています。(11ビットで表現できる最大数は2047) |
---- | ---- | ||
Line 65: | Line 65: | ||
閉じる方向へ力を加えると、負荷の値は50や100といった値になります。開く方向へ力を加えると、少し力を加えただけで1050や1100といった値になります。開く方法へ力を加えた場合、何故急に大きな値になるのでしょうか。 | 閉じる方向へ力を加えると、負荷の値は50や100といった値になります。開く方向へ力を加えると、少し力を加えただけで1050や1100といった値になります。開く方法へ力を加えた場合、何故急に大きな値になるのでしょうか。 | ||
- | AX-12+の負荷の値は下表のように2バイト=16ビットで表されます。 | + | AX-12+の負荷の値は下表のように16ビットで表されますが、上位5ビットは使用していません。 |
| ビット | Bit15~11 | Bit10 | Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 | | | ビット | Bit15~11 | Bit10 | Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 | | ||
Line 77: | Line 77: | ||
**手を少しづつ閉じる [#mdb3661c] | **手を少しづつ閉じる [#mdb3661c] | ||
- | ゴールポジションの値を少しづつ増やしながら、AX-12+に逐次書き込むことで、手を少しづつ閉じる動作を実現します。 | + | 負荷の値によりゴールポジションの値を少しづつ増やしながら、AX-12+に逐次書き込むことで、手を少しづつ閉じる動作を実現します。 |
#ref(RobotHand_p11.png, 100%) | #ref(RobotHand_p11.png, 100%) | ||
先ずゴールポジションを保存する変数を宣言します。 | 先ずゴールポジションを保存する変数を宣言します。 | ||
- | uint16_t PresentLoad;の下に | + | uint16_t GoalPositon = 300は、変数宣言時に予め300という値を入れておくという意味です。 |
- | uint16_t GoalPositon = 300; | + | |
- | と入力します。 | + | |
- | GoalPositon = 300は、変数に予め300という値を入れておくという意味です。 | + | |
---- | ---- | ||
- | #ref(RobotHand_p12.png, 100%) | + | 次に負荷の閾値を決めます。~ |
- | + | 手を閉じて物を挟んだ時、負荷は手が開く方向にかかるので、負荷の方向1024と負荷の値を足した値が閾値となります。~ | |
- | AX-12+にゴールポジションを書き込みます。 | + | ここでは負荷の値を100として、閾値を1124とします。 |
- | fd_printf文の後に | + | |
- | fd_DXWriteWordData (1, 30, GoalPosition); | + | |
- | と入力します。 | + | |
---- | ---- | ||
- | #ref(RobotHand_p13.png, 100%) | + | 閾値を超えたらfd_DXSetPositionで1加算したゴールポジションを指定します。~ |
- | + | ||
- | ゴールぽシジョンの値を1増やします。 | + | |
- | fd_printf文の後に | + | |
- | GoalPosition++; | + | |
- | と入力します。GoalPositionに1足すという意味です。 | + | |
- | + | ||
- | *負荷の値によって分岐 [#m50c25ac] | + | |
- | + | ||
- | 負荷の値が、ある閾値より小さい場合だけ、ゴールポジションの値に1足し、そのゴールポジションをAX-12+へ書き込みます。 | + | |
- | + | ||
- | #ref(RobotHand_p14.png, 100%) | + | |
- | + | ||
- | ゴールポジションに1足す行とゴールポジションを書き込む行をif文で囲みます。if文の条件は、「負荷の値が1124より下だったら」とします。手を閉じて物を挟んだ時、負荷は手が開く方向にかかります。よって、負荷の方向1024と負荷の値100を足した値の1124としました。 | + | |
- | + | ||
- | if(PresentLoad < 1124) { | + | |
- | GoalPosition++; | + | |
- | fd_DXWriteWordData (1, 30, GoalPosition); | + | |
- | } | + | |
**動作確認 [#x3a5a029] | **動作確認 [#x3a5a029] | ||
- | #include <fd.h> | + | #html{{ |
- | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | + | <pre class="brush: c"> |
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | uint16_t LoadData; | ||
+ | uint16_t GoalPosition = 300; | ||
- | void main (void) { | + | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); |
- | uint16_t PresentLoad; | + | fd_SetUVThreshold (7.4); |
- | uint16_t GoalPosition = 300; | + | DX_ChangeBaudrate (1000000); |
- | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | + | fd_DXSetTorqueLimit (1, 154); |
- | fd_DXWriteWordData (1, 34, 200); | + | fd_DXSetPosition (1, 300); |
- | fd_DXWriteWordData (1, 30, 300); | + | |
- | while (1) { | + | while (!fd_rx_buff () && !fd_GetPB ()) { |
- | fd_DXReadWordData (1, 40, &PresentLoad); | + | fd_DXGetLoad (1, &LoadData); |
- | fd_printf("%6d\r",PresentLoad); | + | fd_printf ("%4d\r", LoadData); |
- | if(PresentLoad < 1124) { | + | if (LoadData < 1124) { |
- | GoalPosition++; | + | fd_DXSetPosition (1, ++GoalPosition); |
- | fd_DXWriteWordData (1, 30, GoalPosition); | + | } |
- | } | + | fd_Wait (10); |
- | KEY_QUIT; | + | } |
- | } | + | } |
- | } | + | </pre> |
+ | }} | ||
プログラムが完成しました。プログラムを書き込んで動かしてみましょう。 | プログラムが完成しました。プログラムを書き込んで動かしてみましょう。 |
(This host) = http://www.besttechnology.co.jp