#contents
*課題 [#g2ac3d5d]
#ref(./2015a-mission21.png,70%)
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
•A地点からB地点へ (P三叉路およびQ交差点はともに直進)
•B地点からA地点へ (Q交差点では直進、P三叉路では直進)
•C地点からA地点へ (Q交差点では直進、P三叉路では右折)

そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。

可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。

自分はC地点からA地点へ行く経路を選んだ。
*ロボットの説明、アームの動かし方 [#sb5ebfdd]
#ref(./DSC_00071.jpg,70%)
#ref(./DSC_00051.jpg,90%)
このようにアームを上下に動かし、光センサと横につけたブロックの間にボールを入れ上からアームをかぶせるようにしてボールをキャッチする。
そして、シュートするときはアームを上げて、後退し、アームを下げて前進することでボールを前に押すようにした。
*プログラムの説明 [#if20647d]

 #define BLACK 40      //  これ以下は黒
 #define WHITE 50      //  これ以上は白
 #define SPEED 35     
 #define speed 25
 #define go_forward OnFwd(OUT_BC,SPEED);    //   直進
 #define turn_left OnFwd(OUT_B,speed);Off(OUT_C);     //   左折
 #define turn_right Off(OUT_B);OnFwd(OUT_C,speed);    //   右折
 #define STEP 1      // 一回の判断で動作させる時間
 #define nMAX 200  
 #define short_break Off(OUT_BC);Wait(2000);      //   小休止
 #define arm_down OnFwd(OUT_A,SPEED);Wait(500);Off(OUT_A);      //    アームを下げる
 #define CROSS_TIME 500        //   交差点を通過する時間
 #define cross_line OnFwd(OUT_BC,SPEED);Wait(CROSS_TIME);short_break;   //   交差点の通過
 #define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);   //    アームを上げる
 task main()
 {
 SetSensorLight(S3); 
 int nOnline=0;     //    続けて黒になった回数(カウンタ)
 if (true) {
 while (nOnline < nMAX) {
 if (SENSOR_3 < BLACK) {
 turn_left;         //   黒の時は左に曲がる
 nOnline++;     //  カウンタを増やす
 } else if (SENSOR_3 < WHITE) { 
 go_forward;      //    黒と白の間の時は直進する
 } else {
 turn_right;     //    白の時は右に曲がる
 nOnline=0;     //    カウンタリセット
 }
 Wait(STEP);
 }
 short_break;    //   小休止
 turn_right; Wait(nMAX*STEP);
 cross_line;          //     交差点を渡る
 arm_down;          //    アームを下す
 nOnline=0;           //   カウンタをリセットする
 }      ///////////////////////////////////////////スタート 〜 一つ目の交差点、ボールのキャッチ
 if (true) {            //    再びライントレースに戻る
 while (nOnline < nMAX) {
 if (SENSOR_3 < BLACK) {
 turn_left;         //    黒の時は左に曲がる
 nOnline++;         //    カウンタを増やす
 } else if (SENSOR_3 < WHITE) { 
 go_forward;          //    黒と白の間の時は直進する
 } else {
 turn_right;       //    白の時は右に曲がる
 nOnline=0;       //     カウンタをリセットする
 }
 Wait(STEP);
 }
 short_break;     //    小休止
 turn_right; Wait(nMAX*STEP);
 cross_line;    //    交差点を渡る
 nOnline=0;    //     カウンタをリセットする
 }      /////////////////////////////////////////一つ目の交差点、ボールのキャッチ〜二つ目の交差点
 if (true) {          //      再びライントレースに戻る
 while (nOnline < nMAX) {
 if (SENSOR_3 < BLACK) {
 turn_left;     //    黒の時は左に曲がる
 nOnline++;     //    カウンタを増やす
 } else if (SENSOR_3 < WHITE) { 
 go_forward;         //     黒と白の間の時は直進する
 } else {
 turn_right;        //      白の時は右に曲がる
 nOnline=0;        //     カウンタをリセットする
 }
 Wait(STEP);
 }
 short_break;        //     小休止        ///////////////////////////
 turn_left; Wait(nMAX*STEP);
 arm_up;          //         アームを上げる
 OnRev(OUT_BC,SPEED);Wait(600);    //    後退する        シュートを
 Off(OUT_BC);
 arm_down;        //       アームを下げる            する
 OnFwd(OUT_BC,SPEED);Wait(600);     //    前進する
 Off(OUT_BC);
 nOnline=0;       //    カウンタをリセットする ////////////////////////////
 }
 }
*改善点 [#r6cf5c7e]
三回に一回はカーブを交差点として認識してしまうので、そのようなミスが出ないようにプログラミングを改善する必要があるが、その改善の仕方がわからなかってので、もっと資料を読み込む必要があった。また、シュート時にボールが転がってしまって上手くシュートできないことが多々あったので、ボールを話した瞬間にシュートできるようにプログラミングするべきだった。
*感想 [#m43caad8]
今回の課題は、ライントレースはさほど苦労なくいけたが、ボールをキャッチするプログラミングを作るうえで、タイマーを使おうとしたが、タイマーがうまく作動せず何回やってもボールをキャッチできなかったので、タイマーを使うことをやめ、交差点を渡ったあとタイミングよくアームを下げることでボールをキャッチするようにすることで、上手くキャッチすることができてよかった。また、使いこなせない式もたくさんあるので、それらを使いこなして次の課題に生かしたいです。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS