2: 2011-07-13 (水) 13:00:57 yoshida | 3: 2011-07-14 (木) 12:26:06 yoshida | ||
---|---|---|---|
Line 35: | Line 35: | ||
地面に向けた右側と正面の赤外線反射センサの値を取得します。 | 地面に向けた右側と正面の赤外線反射センサの値を取得します。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush:c"> | + | <pre class="brush:c;highlight:[3,4]"> |
- | int CenterData, RightData; | + | uint8_t CenterData, RightData; |
while (!fd_GetPB ()) { | while (!fd_GetPB ()) { | ||
DX_ReadByteData (100, 27, &CenterData, 10, NULL); | DX_ReadByteData (100, 27, &CenterData, 10, NULL); | ||
Line 47: | Line 47: | ||
AX-S1の右側は地面を向いているので、RightDataは常に255になります。もし、AX-S1を反対に取り付けていた場合は、以下のように左側のデータを取得して下さい。 | AX-S1の右側は地面を向いているので、RightDataは常に255になります。もし、AX-S1を反対に取り付けていた場合は、以下のように左側のデータを取得して下さい。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush:c"> | + | <pre class="brush:c; highlight:[3,4]"> |
- | int CenterData, LeftData; | + | uint8_t CenterData, LeftData; |
while (!fd_GetPB ()) { | while (!fd_GetPB ()) { | ||
DX_ReadByteData (100, 26, &LeftData, 10, NULL); | DX_ReadByteData (100, 26, &LeftData, 10, NULL); | ||
Line 82: | Line 82: | ||
正面のセンサで相手を見つけたら、100%の出力で直進します。見つからない場合は出力を50%に落として直進します。 | 正面のセンサで相手を見つけたら、100%の出力で直進します。見つからない場合は出力を50%に落として直進します。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush:c"> | + | <pre class="brush:c; highlight:[4, 6]"> |
- | short CenterData; | + | short Speed; |
+ | uint8_t CenterData; | ||
+ | DX_ReadByteData (100, 27, &CenterData, 10, NULL); | ||
if (CenterData > 30) { | if (CenterData > 30) { | ||
Speed = 1023; | Speed = 1023; | ||
Line 91: | Line 93: | ||
fd_DXSetSpeed (1, (1<<10) & Speed); | fd_DXSetSpeed (1, (1<<10) & Speed); | ||
fd_DXSetSpeed (2, Speed); | fd_DXSetSpeed (2, Speed); | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | **相手を探す [#k9fd5152] | ||
+ | 暫くしても相手が見つからない場合は、旋回して辺りを探してみましょう。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | int cnt, i; | ||
+ | short Speed = 512; | ||
+ | uint8_t CenterData; | ||
+ | while (!fd_GetPB ()) { | ||
+ | cnt = 0; | ||
+ | while (cnt++ > 100 && Speed != 1023) { | ||
+ | fd_DXSetSpeed (1, (1<<10) & Speed); | ||
+ | fd_DXSetSpeed (2, (1<<10) & Speed); | ||
+ | for (i = 0; i < 500; i++) { | ||
+ | DX_ReadByteData (100, 27, &CenterData, 10, NULL); | ||
+ | if (CenterData > 30) break; | ||
+ | } | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | **プログラム完成 [#s3a81913] | ||
+ | ではプログラムをまとめてみましょう。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | // 旋回ルーチン | ||
+ | int SearchTurn (int lmax) { | ||
+ | int result = 0, i; | ||
+ | uint8_t CenterData; | ||
+ | short Speed = (1<<10) & 512; | ||
+ | fd_DXSetSpeed (1, Speed); // ID1は右回り | ||
+ | fd_DXSetSpeed (2, Speed); // ID2も右回り(その場で回転) | ||
+ | for (i = 0; i < lmax; i++) { | ||
+ | DX_ReadByteData (100, 27, &CenterData, 10, NULL); | ||
+ | if (CenterData > 30) { // 正面に敵発見 | ||
+ | result = 1; | ||
+ | break; | ||
+ | } | ||
+ | fd_Wait (1); | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | void main (void) { | ||
+ | int cnt = 0; | ||
+ | short Speed; | ||
+ | uint8_t CenterData, RightData; | ||
+ | |||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | fd_DXSetEndlessTurn (1, true); | ||
+ | fd_DXSetEndlessTurn (2, true); | ||
+ | |||
+ | while (!fd_GetPB ()) { | ||
+ | DX_ReadByteData (100, 27, &CenterData, 10, NULL); | ||
+ | DX_ReadByteData (100, 28, &RightData, 10, NULL); | ||
+ | Speed = 512; | ||
+ | if (RightData < 200) { | ||
+ | fd_DXSetSpeed (1, Speed); | ||
+ | fd_DXSetSpeed (1, (1<<10) & Speed); | ||
+ | fd_Wait (2000); | ||
+ | SearchTurn (2000); | ||
+ | } else { | ||
+ | if (CenterData > 30) Speed = 1023; | ||
+ | fd_DXSetSpeed (1, (1 << 10) & Speed); // 右回転 | ||
+ | fd_DXSetSpeed (2, Speed); // 左回転(直進) | ||
+ | } | ||
+ | if (cnt++ > 100 && CenterData <= 30) { | ||
+ | SearchTurn (500); | ||
+ | cnt = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
</pre> | </pre> | ||
}} | }} |