†A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する(他のメンバーとは別の経路になるようにする)。A地点に入る(ゴール)交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。私は下のコースをやりました。†できるだけ小さくすることが出来ました。はじめは小さくしすぎたため、バッテリーの重みに耐えることが出来ませんでした。耐えることが出来るようになりました。†モーターとアーム部分はゴムによってつながっています。簡単な構造に出来たため重量も小さく済みました。アーム部分と本体はバッテリーのところでつながっています。そのため、取れやすいですが、ミッションに支障は来さなかったので良かったです。†モーターを直列につなげることにより車体を小さくすることが出来ました。前輪が弱かったため写真のように2✕1のパーツをつけて、モーターの高さに近づけて外れにくいようにすることが出来ました。†ボールを掴んでいるときの写真です。ボールを掴むことに支障を来すことがないように本体とアーム部分の距離を何度か試してから決めました。OnFwd(OUT_C);Off(OUT_A);これらのプログラムは移動に関するものです。大きく曲がるプログラムです。実際に値を測って設定しました。交差点と認識するためには、連続して黒、又は黒よりの灰色、と認識している時間が、ある時間よりも大きくなることが必要です。その時間の測り方は、黒、黒寄りの灰色が連続して感知されるとFastTimer(0)が増えます。follow_line()では、FastTimer(1)<tの条件下では、ClearTimer(0)というものが働き、FastTimer(0)がリセットされます。FastTimer(1)>tで、光センサーが黒と認識したときには、ClearTimer(0)が働かずに、FastTimer(0)が増えます。黒寄りの灰色のときも同じです。灰色よりも薄い色のときには、移動したあとにClearTimer(0)が働きFastTimer(0)がリセットされます。上記のようにするときに、FastTimer(0)がある時間を超えると、交差点と認識します。円形のときの交差点と直角の交差点とでは交差点と認識するために必要な時間が異なるため、時間を変える必要がありました。最初に実行されるものをメインルーチン、そのメインルーチンから呼び出させるものをサブルーチンと呼びます。sp;Wait(WT);}これは、線の左側をライントレースするために用いたサブルーチンです。・センサー1が41よりも小さい値なら、左旋回。・センサー1が41以上45よりも小さい値なら、左。・センサー1が45以上47よりも小さい値なら、直進。・センサー1が47以上51よりも小さい値なら、右。・それ以外なら右旋回。↓また、&&(FastTimer(1)<t)を用いることにより、FastTimer(1)がtを超えるまではカーブを交差点と認識しないようにすることができました。ST()を用いました。このサブルーチンは、最初はSENSOR1がblack以下のときにだけFastTimer(1)が増えるようにしていましたが、交差点と認識してほしいときに認識してくれないことが多かったため、b_gray以下でもFastTimer(1)が増えるようにしました。したら、交差点と認識しやすくなりました。turn_right;Wait(turn_t);go;Wait(FT);sp;}これは、交差点と認識してから、交差点を直進したいときに使うプログラムです。右に曲がり、直進するというものです。ここでFTを用いたのは、回転の具合によって前に進む時間を変える必要があったからです。sp;Wait(WT);}これは、線の右側をライントレースするために用いたプログラムです。・センサー1が41よりも小さい値なら、右旋回。・センサー1が41以上45よりも小さい値なら、右。・センサー1が45以上47よりも小さい値なら、直進。・センサー1が47以上51よりも小さい値なら、左。・それ以外なら左旋回。↓このサブルーチンの目的は、FからDの区間を曲がり切ることです。それは、FからDの区間を曲がり切ることができなかったからです。それを改善するために、Gに着いたら線の右側に出て、その後は線の右側を走行できるようにしました。これにより、FからDの区間を曲がり切ることができました。変数なども気にすることなく、プログラムを書くことができました。turn_right;Wait(turn_t-10);go;Wait(FT);sp;}これは、JからGのカーブを曲がるために作りました。この区間では交差点の認識がうまく出なかったためfollow_line()よりも交差点と認識しやすいように、SENSOR1がgrayよりも小さい値である時間が長ければ交差点と認識するように設定しました。これにより、うまく回ることが出来るようになりました。}}これは、ボールをつかむためのものです。follow_l_r()と同じです。それから、ボールを掴むものです。KからLの区間の秒数を測り、その時間をtとしました。それによりKからLまでライントレースすることができ、ボールの位置に合わせやすくなりました。連続してモーターを動かすと強く回りすぎてしまったため、少しずつ回るようにしました。OnRev(OUT_B);Wait(10);sp;}モーターを逆に動かして、ボールを離すためのものです。FT=25;ST();これは、線の左側を走行してKで交差点と認識するというものです。この区間では、turn_tがどれぐらいにだと丁度いいか、ということを何度か試行してみて決めました。t=250;ball_c();これはボールに近づき、ボールをつかむというものです。Kに到達したときに、Lの方に思っていたよりも進んでいたため、tの値を短めにしました。go;Wait(240);sp;何度か実際に試して、回る時間と直進する時間を決めました。}ここでは、繰り返しを使うことにより何度も同じプログラムを書く必要を無くすことができました。follow_l_r();これは、線の右側に出るようにしてから、線の右側を沿うようにしました。turn_left;Wait(turn_t-10);sp;Dで一時停止してから直進し、そのままBまで沿って行くというものです。Bでゴールの方向を向くというプログラムです。go;Wait(150);sp;ボールを離して、ゴールに押し込み、Aに入るというプログラムです。・カーブ、線を沿うプログラムを変数を駆使して一つにすることが出来るのではないかと思います。・もっと簡単に、交差点と認識するためには、光センサーをより近づける必要があったのではないかとおもいました。