1.課題について
2.ロボットについて
3.プログラミングについて
4.感想
○今回の課題
・下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
○コース
○ミッション
・A地点を出発し、次の経路を黒い線にそって動くロボットを作成する。
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
今回作ったロボット
土台は三輪構造にし、スタート地点である20cm×19.4cmの四角形にロボット全体が収まる必要があったので、できるだけ部品を少なくかつシンプルなものにした。また。光センサーも正確に色を測定するために、地面に近づけるぎりぎりまで下げて設置した。
また、ボールを保持するアームはかご型にした。はさむような型も考えたが、こちらの方がより確実にボールを確保できると思い、この形にした。
#define BLACK 30 //色の定義(黒
#define B_GLAY 38 黒と灰色の中間
#define GLAY 45 灰色(しきい値)
#define W_GLAY 53 白と灰色の中間
#define WHITE 63 白)
#define r_right OnFwd(OUT_C,50);Off(OUT_B); //右旋回
#define t_right OnFwd(OUT_C,75);OnFwd(OUT_B,10); //右折
#define go OnFwd(OUT_BC,40); //直進
#define t_left OnFwd(OUT_B,75);OnFwd(OUT_C,10); //左折
#define r_left OnFwd(OUT_B,20);Off(OUT_C); //左旋回
#define MOVE_TIME 500
#define up OnRev(OUT_A,50);Wait(500);b //アームを上げる
#define down OnFwd(OUT_A,50);Wait(500); 下げる
#define u_turn OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(1000); //Uターン
#define short_break Off(OUT_BC);Wait(100); //一時停止 sub follow_line() //交差点を認識するまで黒線に沿って進むプログラム {
SetSensorLight(S3);
long t0 = CurrentTick(); while(CurrentTick()-t0 <= MOVE_TIME){ if (SENSOR_1 < BLACK){ //黒の時だけタイマーをリセットしない→交差点を判別する r_left; } else if (SENSOR_3 < B_GLAY){ t0=CurrentTick(); t_left; } else if (SENSOR_3 < GLAY){ t0=CurrentTick(); go; } else if (SENSOR_3 < W_GLAY){ t0=CurrentTick(); t_right; } else if (SENSOR_3 > WHITE){ t0=CurrentTick(); r_right; } else {go;} } Off(OUT_BC); //黒の時間がMOVE TIMEを超えて交差点とわかれば止まる
} sub cross_line(){ //交差点を渡るプログラム
SetSensorLight(S3);
go; //白を認識するまで進む until (SENSOR_3 > WHITE); →follow_line()を後に続けることで交差点を渡る
}
task main() {
follow_line(); short_break; //Kで一時停止 OnRev(OUT_B,50);Off(OUT_C); //車体を黒線と平行に戻す Wait(100); go; Wait(2000); down; //アームを下げてボールを確保 u_turn; follow_line(); cross_line(); follow_line(); //K地点の交差点通過 short_break; //J地点の交差点で一時停止 cross_line(); //交差点を通過 follow_line(); cross_line(); //I地点の交差点を通過 follow_line(); cross_line(); //H地点の交差点を通過 follow_line(); //G地点の交差点を認識 follow_line(); //cross_lineだと曲がれないのでfollow_lineで通過 follow_line(); //上記と同じ(F地点) follow_line(); //上記と同じ(E地点) cross_line(); //D地点の交差点を通過 follow_line(); cross_line(); //C地点の交差点を通過 follow_line(); OnRev(OUT_B,50);Off(OUT_C); //車体を黒線と平行に戻す Wait(100); short_break; up; //アームを上げる OnFwd(OUT_BC,75); //シュート Wait(100); go; //A地点に入る Wait(1000);
}