[[2015a/Member]] *課題 [#r3fead0d] #ref(./2015a-mission2.png,,40%) B地点からA地点へ(Q交差点では直進、P三叉路では直進)黒い線にそって動くロボットを作成する。途中(P地点とQ地点)の間においたボールを目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止する。 *ロボットの説明 [#q736d003] -全体像 右旋回、左旋回をしやすいので、説明書にものっている最も基本的なロボットを用いた。 モーターを2つ使用し、左右のタイヤを別々で稼働できるようにした。 前方に光センサーをつけ、ボールを捕球するためのアームを取り付けた。 #ref(./IMG_1747.jpg,,40%) -アーム モータを使用し、上下運動するアームを作成した。 モータを1つ使用し、モーターを回すことで虫取り網を振るように上下運動するアームを作成した。 アームは、ボールを囲むような「ロ」の字型にした。 シュートする際はアームを上げ、車体でボールを押すような形にした。 #ref(./IMG_1748.jpg,,40%) -センサー センサーは、紙面からの距離が近いほど正確にライントレースできたので、出来る限り紙面に近く した。センサーの位置は前方にしたが、車体の中心にした方がよいと感じた。 #ref(./IMG_1751.jpg,,40%) *プログラム [#z064af71] アームは上げた状態でスタート。 ボールを扱う前後は小休止をはさむことで安定性を増した。 #define BLACK 40 //以下は黒 #define WHITE 45 //以上は白 #define go_forward OnFwd(OUT_AC); //直進 #define turn_right OnRev(OUT_C); OnFwd(OUT_A); //右旋回 #define turn_left OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define STEP 1 // 一回の判定で進む時間 #define short_break Off(OUT_AC); Wait(200); // 小休止 #define CROSS_TIME 20 // 交差点通過にかかる時間 #define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る #define nMAX 8 //通常のカーブとして許容できる繰り返しの最大値 #define DOWN OnFwd(OUT_B);Wait(40);Off(OUT_B); //アームを下ろす #define UP OnRev(OUT_B);Wait(40);Off(OUT_B); //アームを上げる #define shot go_forward;Wait(100); //シュート task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // 続けて黒になった回数 A地点→Q地点 if (true) //黒を続けてnMAX回繰り返さない間、通常のライントレースをする { while (nOnline <nMAX) { if (SENSOR_2 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE )// 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット } if (true) //黒を続けてnMAX回繰り返さない間、通常のライントレースをする { while (nOnline <nMAX) { if (SENSOR_2 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE) // 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); } 交差点、ボール捕球 short_break; //小休止 turn_right;Wait(35); //方向修正 short_break; //小休止 DOWN; //アームを下げ捕球 turn_left;Wait(30); //方向修正 short_break; //小休止 cross_line; //交差点を渡る nOnline=0; //カウンタリセット Q地点→P地点→A地点 if (true) //黒を続けてnMAX回繰り返さない間、通常のライントレースをする { while (nOnline <nMAX) { if (SENSOR_2 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE )// 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット } B地点、シュート short_break; //小休止 turn_right;Wait(35); //方向修正 short_break; //小休止 UP; //アームを上げる shot; //車体でボールを押し、シュート Off(OUT_AC); //停止 nOnline=0; //カウンタをリセット } } *苦労した点 [#nb2f7038] -方向転換や、交差点を渡る時間などを計測し、微調整したこと。 -ラインの左側の境界線をトレースしたため、交差点と左折を区別させたこと。 -シュートする際、ボールの位置が安定せず上手くゴールに入らなかったこと。 *反省[#rd5cbf61] -ロボットの進むスピードが遅く、スムーズなものとは言えなかった。速く正確にやるにはどうすればよいのかを深く考える必要があった。 -ロボもプログラムも、サンプルに頼りがちだった。自分で考え、新たなものを作るようにしていきたい。