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>
}} }}


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom