2: 2010-07-06 (火) 20:01:22 sho ソース 3: 2010-07-07 (水) 12:41:54 sho ソース
Line 1: Line 1:
-只今編集中です。 
- 
*プログラミング [#tb098c25] *プログラミング [#tb098c25]
前進したり、相手を探したり、土俵際に来たらバックしたりする車輪ロボットのプログラムを作成します。 前進したり、相手を探したり、土俵際に来たらバックしたりする車輪ロボットのプログラムを作成します。
Line 109: Line 107:
プログラムはfd_Wait関数で2秒間待機し、その間バックし続けます。 プログラムはfd_Wait関数で2秒間待機し、その間バックし続けます。
-バックした後、直進するとまた土俵際に来てしまうので、旋回します。+バックした後、直進するとまた土俵際に来てしまうので旋回します。
fd_Wait関数の後に fd_Wait関数の後に
     fd_DXWriteWordData (1, 32, (1 << 10) + 500);      fd_DXWriteWordData (1, 32, (1 << 10) + 500);
Line 131: Line 129:
正面のセンサの値が30より大きければ回転速度を1023、それ以外は500となります。 正面のセンサの値が30より大きければ回転速度を1023、それ以外は500となります。
-プログラムを実行してみましょう+プログラムを実行してみましょう。
**相手を探す [#ha0d0d54] **相手を探す [#ha0d0d54]
Line 137: Line 135:
暫く直進しても相手が見つからない場合は、旋回して辺りを探します。 暫く直進しても相手が見つからない場合は、旋回して辺りを探します。
「暫く」を「while文が100周したら」に置き換えて考えます。 「暫く」を「while文が100周したら」に置き換えて考えます。
-while文のループ回数をカウントする変数coutnを宣言します。+while文のループ回数をカウントする変数countを宣言します。
main関数の最初に main関数の最初に
   int count = 0;    int count = 0;
Line 144: Line 142:
   count++;    count++;
と入力します。while文が一回処理される毎に変数countが1増加します。 と入力します。while文が一回処理される毎に変数countが1増加します。
 +
 +while文が100回ループしたら旋回して相手を探すことにします。
 +while文の中に
 +   if (count > 100 && CenterData < 31) {
 +     fd_DXWriteWordData (1, 32, (1 << 10) + 500);
 +     fd_DXWriteWordData (2, 32, (1 << 10) + 500);
 +   }
 +と入力します。A&&BはAかつBを表します。countが100より大きいかつCenterDataが31より小さい場合、if文の中を実行します。
 +CenterData < 31は、相手を見つけて突進している最中に旋回してしまわないようにするためです。
 +
 +暫く旋回しながら相手を探します。
 +
 +この時、fd_Wait関数で暫く旋回させても意味がありません。何故ならfd_Wait関数で待機している間は、プログラムは他の処理を行えないからです。
 +
 +for文で適当な回数ループさせながら、正面センサの値をチェックします。
 +旋回の指令の後に
 +     for (i = 0; i < 500; i++) {
 +       fd_DXReadByteData (100, 27, &CenterData);
 +       if (CenterData > 30) i = 500;
 +     }
 +と入力します。for文を500回ループさせ、for文内では正面センサ値の取得を繰り返します。もし正面センサの値が30より大きければ、iを500にして即座にfor文を抜けます。
 +
 +**プログラム完成 [#ba482b2d]
 +
 +最後にwhile文の最後にKEY_QUIT;を入れて完成です。
 + #include <fd.h>
 + #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}
 +
 + void main (void) {
 +   uint8_t LeftData, CenterData, RightData;
 +   int count = 0, i;
 +
 +   fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);
 +   fd_DXSetEndlessTurn (1, 1);
 +   fd_DXSetEndlessTurn (2, 1);
 +
 +   while (1) {
 +     fd_DXReadByteData (100, 26, &LeftData);
 +     fd_DXReadByteData (100, 27, &CenterData);
 +     fd_DXReadByteData (100, 28, &RightData);
 +     fd_printf ("%3d %3d %3d %6d\r", LeftData, CenterData, RightData,  count);
 +     if (RightData < 200) {
 +       fd_DXWriteWordData (1, 32, 500);
 +       fd_DXWriteWordData (2, 32, (1 << 10) + 500);
 +       fd_Wait(2000);
 +       fd_DXWriteWordData (1, 32, (1 << 10) + 500);
 +       fd_DXWriteWordData (2, 32, (1 << 10) + 500);
 +       fd_Wait(2000);
 +     } else {
 +       if (CenterData > 30) {
 +         fd_DXWriteWordData (1, 32, (1 << 10) + 1023);
 +         fd_DXWriteWordData (2, 32, 1023);
 +       } else {
 +         fd_DXWriteWordData (1, 32, (1 << 10) + 500);
 +         fd_DXWriteWordData (2, 32, 500);
 +       }
 +     }
 +     if (count > 100 && CenterData < 31) {
 +       fd_DXWriteWordData (1, 32, (1 << 10) + 500);
 +       fd_DXWriteWordData (2, 32, (1 << 10) + 500);
 +       for (i = 0; i < 500; i++) {
 +       fd_DXReadByteData (100, 27, &CenterData);
 +       if (CenterData > 30) i = 500;
 +       }
 +       count = 0;
 +     }
 +     count++;
 +     KEY_QUIT;
 +   }
 + }
 +
 +#html(<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/LOJX6F4pJOk&hl=​ja_JP&fs=1?rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/LOJX6F4pJOk&hl=​ja_JP&fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>)
 +
 +[[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter8.4]]~
 +
 +[[FDIII-HC Starter Kit Guide]]に戻る


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