3: 2011-07-05 (火) 12:08:36 yoshida | 現: 2013-04-09 (火) 23:44:33 takaboo | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | TITLE:自動ドアのプログラミング | ||
*プログラミング [#k91f3857] | *プログラミング [#k91f3857] | ||
#ref(AutomaticDoor_1.png,100%) | #ref(AutomaticDoor_1.png,100%) | ||
- | 「AX-S1の赤外線反射センサに人が反応したら、AX-12+でバーを開く」というプログラムを作成します~ | + | 「AX-S1の赤外線反射センサに人が反応したら、AX-12Aでバーを開く」というプログラムを作成します~ |
- | Chapter2で「AX-S1の赤外線反射センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作りました。違いはAX-S1のブザーを鳴らすか、AX-12+を動かすかだけです。 | + | Chapter2で「AX-S1の赤外線反射センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作りました。違いはAX-S1のブザーを鳴らすか、AX-12Aを動かすかだけです。 |
**処理の流れを図にする [#e944ad29] | **処理の流れを図にする [#e944ad29] | ||
Line 23: | Line 24: | ||
**ブザーを鳴らすからバーを開けるに変更 [#o54aa8b3] | **ブザーを鳴らすからバーを開けるに変更 [#o54aa8b3] | ||
DX_WriteByteDataを削除し、fd_DXSetPositionに変更します。~ | DX_WriteByteDataを削除し、fd_DXSetPositionに変更します。~ | ||
- | #ref(gcc_edit.png,100%) | + | #html{{ |
+ | <pre class="brush:c"> | ||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | while (true) { | ||
+ | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData > 100) { | ||
+ | DX_WriteByteData (100, 40, 10, 10, NULL); | ||
+ | DX_WriteByteData (100, 41, 10, 10, NULL); | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | #ref(down_arrow.png) | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | while (!fd_rx_buff () ) { | ||
+ | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData > 100) { | ||
+ | fd_DXSetPosition (1, 300); | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
[[fd_DXSetPosition>FDIIILIB#nbe84864]]は指定されたアクチュエータの位置を変更する関数です。~ | [[fd_DXSetPosition>FDIIILIB#nbe84864]]は指定されたアクチュエータの位置を変更する関数です。~ | ||
- | ''第1引数''は、DynamixelのIDです。AX-12+のIDは1です。~ | + | ''第1引数''は、DynamixelのIDです。AX-12AのIDは1です。~ |
''第2引数''は、指令位置([[ゴールポジション>FDIIICHAPTER1.1#xa86a787]])です。 | ''第2引数''は、指令位置([[ゴールポジション>FDIIICHAPTER1.1#xa86a787]])です。 | ||
#ref(AX12_position.png,100%) | #ref(AX12_position.png,100%) | ||
- | AX-12+のホーンは図のように0°から300°まで回転します。ゴールポジションの値は0°なら0、中心の150°なら512、300°なら1023になります。~ | + | AX-12Aのホーンは図のように0°から300°まで回転します。ゴールポジションの値は0°なら0、中心の150°なら512、300°なら1023になります。~ |
|CENTER:BGCOLOR(red):||c | |CENTER:BGCOLOR(red):||c | ||
- | | :idea:|AX-12+のホーンの角度によっては、フレームとAX-12+、又はフレームと自作ケースが干渉します。干渉が起こるようなゴールポジションを指定した場合、機器の破損の原因となります。必ず設定するゴールポジションが干渉が起こらない範囲内にあることを十分確認して下さい。| | + | | :idea:|AX-12Aのホーンの角度によっては、フレームとAX-12A、又はフレームと自作ケースが干渉します。干渉が起こるようなゴールポジションを指定した場合、機器の破損の原因となります。必ず設定するゴールポジションが干渉が起こらない範囲内にあることを十分確認して下さい。| |
**バーを閉じる [#f5a1921e] | **バーを閉じる [#f5a1921e] | ||
バーを閉じるにはバーを開く時の反対の条件が必要になります。~ | バーを閉じるにはバーを開く時の反対の条件が必要になります。~ | ||
バーを開く時の条件がif (ReadData > 100)となっていますので、反対の条件はelseとなります。~ | バーを開く時の条件がif (ReadData > 100)となっていますので、反対の条件はelseとなります。~ | ||
- | #ref(gcc_edit_2.png,100%) | + | #html{{ |
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | uint8_t ReadData; | ||
+ | |||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | fd_DXSetTorqueLimit (1, 154); | ||
+ | |||
+ | while (!fd_rx_buff ()) { | ||
+ | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData > 100) { | ||
+ | fd_DXSetPosition (1, 300); | ||
+ | } else { | ||
+ | fd_DXSetPosition (1, 512); | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
バーを開く/閉じるはゴールポジションを変更するだけで、同じfd_DXSetPositionを使用します。 | バーを開く/閉じるはゴールポジションを変更するだけで、同じfd_DXSetPositionを使用します。 | ||
**待ち時間を増やす [#u417c1fa] | **待ち時間を増やす [#u417c1fa] | ||
自動ドアは一旦開くとしばらく閉まりません。そのため、10msの停止を2000ms(2秒)の停止へ変更します。 | 自動ドアは一旦開くとしばらく閉まりません。そのため、10msの停止を2000ms(2秒)の停止へ変更します。 | ||
- | #ref(gcc_edit_3.png,100%) | + | #html{{ |
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | uint8_t ReadData; | ||
+ | |||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | while (!fd_rx_buff ()) { | ||
+ | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData > 100) { | ||
+ | fd_DXSetPosition (1, 300); | ||
+ | } else { | ||
+ | fd_DXSetPosition (1, 512); | ||
+ | } | ||
+ | fd_Wait (2000); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
**トルクリミットの設定 [#odb4282e] | **トルクリミットの設定 [#odb4282e] | ||
- | これで図に書いた一通りの処理のプログラムを書きましたので、書き込んで実行したいところですが、プログラムを一通り書いた後、初めてAX-12+を動かす時に注意する点があります。~ | + | これで図に書いた一通りの処理のプログラムを書きましたので、書き込んで実行したいところですが、プログラムを一通り書いた後、初めてAX-12Aを動かす時に注意する点があります。~ |
- | プログラムを間違えると、自分が意図していた角度とは異なる角度にAX-12+のホーンが動いてしまうことがあります。ホーンは0~300°まで動きますが、フレームやケースを取り付けた場合、0~300°の範囲で動かそうとしてもフレームやケースにぶつかってそれより狭い範囲でしか動きません。それにも拘らず、干渉する範囲まで動かそうとするとどうなるでしょうか?~ | + | プログラムを間違えると、自分が意図していた角度とは異なる角度にAX-12Aのホーンが動いてしまうことがあります。ホーンは0~300°まで動きますが、フレームやケースを取り付けた場合、0~300°の範囲で動かそうとしてもフレームやケースにぶつかってそれより狭い範囲でしか動きません。それにも拘らず、干渉する範囲まで動かそうとするとどうなるでしょうか?~ |
- | AX-12+に負担が掛かりギアがかけてしまいます。~ | + | AX-12Aに負担が掛かりギアがかけてしまいます。~ |
- | そうならないようにテスト動作の際はAX-12+のトルクリミットを下げます。トルクリミットとはホーンを動かす力の最大値です。ホーンが回りにくい時、AX-12+は頑張ってホーンを回そうと力を入れます。その力を制限することで壊れることを防ぎます。それでもAX-12+に負担になりますので予期せぬ動きをした場合は、直ぐに電源を切るようにしましょう。 | + | そうならないようにテスト動作の際はAX-12Aのトルクリミットを下げます。トルクリミットとはホーンを動かす力の最大値です。ホーンが回りにくい時、AX-12Aは頑張ってホーンを回そうと力を入れます。その力を制限することで壊れることを防ぎます。それでもAX-12Aの負担になりますので予期せぬ動きをした場合は、直ぐに電源を切るようにしましょう。 |
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | uint8_t ReadData; | ||
- | #ref(gcc_edit_4.png,100%) | + | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); |
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | fd_DXSetTorqueLimit (1, 154); | ||
+ | |||
+ | while (!fd_rx_buff ()) { | ||
+ | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData > 100) { | ||
+ | fd_DXSetPosition (1, 300); | ||
+ | } else { | ||
+ | fd_DXSetPosition (1, 512); | ||
+ | } | ||
+ | fd_Wait (2000); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
[[fd_DXSetTorqueLimit>FDIIILIB#u4255df3]]は指定されたアクチュエータのトルクを変更します。 | [[fd_DXSetTorqueLimit>FDIIILIB#u4255df3]]は指定されたアクチュエータのトルクを変更します。 | ||
- | ''第1引数''は、DynamixelのIDです。AX-12+のIDは1です。~ | + | ''第1引数''は、DynamixelのIDです。AX-12AのIDは1です。~ |
- | ''第2引数''は、トルクリミットを指定します。トルクリミットは0~1023まで設定することができます。ここでは154を指定していますので、約15%でトルクが制限されます。 | + | ''第2引数''は、トルクリミットを指定します。トルクリミットは0~1023まで設定することができます。ここでは154を指定していますので、約15%でトルクが制限されます。100%のトルクを得るには1023を指定します。 |
+ | |||
+ | トルク制限を行ってしまうと、必要なトルクが得られないこともあります。その場合は、一旦トルク制限を行い、徐々に制限値を上げていきましょう。 | ||
**動作確認 [#d91d40d3] | **動作確認 [#d91d40d3] | ||
Line 76: | Line 181: | ||
#ref(flow_2.png,100%) | #ref(flow_2.png,100%) | ||
プログラムに反映すると以下のようになります。 | プログラムに反映すると以下のようになります。 | ||
- | #ref(gcc_edit_5.png,100%) | ||
- | |||
- | **再び動作確認 [#lc2b2cb7] | ||
#html{{ | #html{{ | ||
<pre class="brush:c"> | <pre class="brush:c"> | ||
Line 91: | Line 193: | ||
fd_DXSetTorqueLimit (1, 154); | fd_DXSetTorqueLimit (1, 154); | ||
- | while (!fd_rx_buff () && !fd_GetPB ()) { | + | while (!fd_rx_buff ()) { |
DX_ReadByteData (100, 27, &ReadData, 10, NULL); | DX_ReadByteData (100, 27, &ReadData, 10, NULL); | ||
fd_printf ("%3d\r", ReadData); | fd_printf ("%3d\r", ReadData); | ||
Line 105: | Line 207: | ||
</pre> | </pre> | ||
}} | }} | ||
+ | |||
+ | **再び動作確認 [#lc2b2cb7] | ||
修正が完成しました。再びFDIII-HCにプログラムを書き込んで動かしてみましょう。~ | 修正が完成しました。再びFDIII-HCにプログラムを書き込んで動かしてみましょう。~ | ||
如何でしょうか?~ | 如何でしょうか?~ | ||
Line 114: | Line 218: | ||
[[次のチャプターへ>FDIIICHAPTER3.4]]~ | [[次のチャプターへ>FDIIICHAPTER3.4]]~ | ||
- | [[FDIII-HC Learning Guide]]へ戻る | + | [[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]へ戻る |