[[2014a/Member]] 目次 #contents *課題の説明 [#q316f020] 詳しい説明は[[2014a/Mission1]]を見てください。 *メンバー [#n5ce0733] dai mame * ロボット[#db4e1456] ** drive base [#v4772f44] &ref(2014a/Member/dai/Mission1/S__2228285.jpg,30%); &ref(2014a/Member/dai/Mission1/S__2228284.jpg,30%); 光センサーで黒線を認識し、トレースする 超音波センサーでボールを認識して、アームのモーターを回しボールを捕球する。 **arm [#z3d76455] &ref(2014a/Member/dai/Mission1/_S__2228287.jpg,30%); アームのモーターを正の方向に回転させるとボールをつかんで運び、ゴール前でモーターを逆回転させることでシュートを打つ。 **light sensor [#uc7ab4ed] &ref(2014a/Member/dai/Mission1/S__2228286.jpg,30%); 元の設計を改良して、光センサーと車輪をできる限り近づける工夫をした。 *プログラム [#j9f1fbc4] **定義 [#kde021a6] ***ライントレースに関する定義 [#yd120976] #define THRESHOLD 45 //しきい値 #define SPEED_H 40 //高速 #define SPEED_L 30 //低速 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR); OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); //直進 #define turn_left1 OnRL(SPEED_L,-SPEED_L); //左旋回 #define turn_left0 OnRL(SPEED_L,0); //左折 #define turn_right0 OnRL(0,SPEED_L); //右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L); //右旋回 #define STEP 1 //1回の判断で動作させる時間 #define nMAX 140 //通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC); Wait(1000); //小休止 #define CROSS_TIME 250 //交差点通過にかかる時間 #define cross_line OnRL(SPEED_L,SPEED_L); Wait(CROSS_TIME); short_break; //交差点通過 ***ボールシュートに関する定義 [#d001a097] #define Catch Off(OUT_BC);OnFwd(OUT_A,60);Wait(500);Off(OUT_A);//ボールキャッチ #define Shot Off(OUT_BC);OnRev(OUT_A,100);Wait(500);Off(OUT_A);//シュート **ライントレース [#g70a799c] ***設定 [#vcd192ef] task main() { SetSensorLowspeed(S4); //超音波センサーをセット// SetSensorLight(S1); //光センサをセット// int nOnline=0 ; //続けて黒になった回数を数える(カウンター)// ***始めに黒線まで移動 [#fd06e0e6] OnFwd(OUT_BC);Wait(500) コースの最初はラインがなくトレースできないため、始めに0.5秒前進させる ***ライントレース [#ee038801] while (true) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-20}{ turn_left1; //最も暗いとき左旋回// nOnline++; //カウンターを増やす// } else { if (SENSOR_1 < THRESHOLD-13) { turn_left0 ; //2番めに暗いとき左折// } else if(SENSOR_1 < THRESHOLD-3) { go_forward; //黒と白の中間で直進// } else if (SENSOR_1 < THRESHOLD+4) { turn_right0; //2番めに明るいとき右折// } else { turn_right1; //最も明るいとき右旋回// } nOnline=0; //カウンターをリセット// } Wait(STEP); } 黒線の真ん中に来るとき「最も暗い」と判断、黒線の端にいるとき「2番めに暗い」と判断、白と黒の境界にいるとき「白と黒の中間」と判断、黒線の近くの白いところにいるとき「2番めに暗い」と判断、黒線から離れたところの白い部分にいるとき「最も明るい」と判断する。 左旋回したときカウンターを1増やす カウンターがnMAXを越えない限りカーブであると認識し、曲がる。 ***交差点通過させるプログラム [#k6a6c70d] short_break; //小休止// turn_right1; Wait(nMAX*STEP); //進行方向修正// cross_line; //交差点通過// nOnline=0; //カウンターをリセット// } } カウンターがnMAXを越えると交差点だと認識し、交差点通過する。 ***シュートを打つプログラム [#w5d9e132] long t0=CurrentTick(); //現在の時刻を得る// if (SensorUS(S4)<=8) {Catch;} //超音波センサーの8センチ以内にボールが入ると捕球// if(CurrentTick()-t0>=35000) //35秒たったことを認識// {Shot;} //シュートを打つ// 超音波センサーでボールを認識するとモーターを回転させボールを掴む。 開始35秒でシュートを打つ。 *反省・感想 [#g085b8ca] ・アームはうまく作れたと思うが、プログラミングができず苦労した。 ・ライトセンサーをより車輪に近づけるよう工夫した。 ・前方が重すぎた。ロボットの組み立ては、より小さくすることが難しいと実感した。 ・電池残量が少ないと性能が落ちるので注意が必要だった。 ・細かい数値などの調節がむずかしかった。 ・成功率が低く、どうすれば確実にうまくいくか考えるべきだった。 ・交差点認識がうまくいかなかった。1つ1つの動作を部品化してどこがいけないのか把握するべきだった。 ・シュートまでの時間測定をより正確にするために、最後の交差点を認識した後時間を測り始めるプログラムなどにすべきだった。