2台のロボットの構造は同じだが、プログラミングは別のものにした。ボールの受け渡しは、2台の角度のズレを無くすため、コースに対し垂直に行った。また、受け取る体勢の時間を長くとることで、受け取りやすくした。今回は通信は使用せず、時間で受け取るタイミングを調整した。
#define BLACK_01 27
#define BLACK_02 35
#define WHITE_01 50
#define WHITE_02 58
#define SPEED 38
#define SPEED_H 50
#define SPEED_L 30
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED,SPEED);
#define turn_right OnRev(OUT_C,SPEED);OnFwd(OUT_A,SPEED);
#define turn_left OnFwd(OUT_C,SPEED);OnRev(OUT_A,SPEED);
#define right Off(OUT_C);OnFwd(OUT_A,SPEED);
#define left OnFwd(OUT_C,SPEED);Off(OUT_A);
#define STEP 1
#define MOVE_TIME 8000
#define shoot OnRev(OUT_B,95);Wait(700);
#define go_b OnFwd(OUT_A,-50);OnFwd(OUT_C,-50);
#define go_F OnFwd(OUT_AC,SPEED_H);
#define turn_R Off(OUT_A); OnFwd(OUT_C,SPEED_L);
#define turn_L Off(OUT_C); OnFwd(OUT_A,SPEED_L);
#define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_A,SPEED_L);
#define turn_SR OnRev(OUT_A,SPEED_L); OnFwd(OUT_C,SPEED_L);
#define catch OnFwd(OUT_B,33);Wait(600);Off(OUT_B);
#define nMAX 200
#define CENTER 45
#define short_break Off(OUT_AC);Wait(400);
#define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,SPEED_L);Wait(CROSS_TIME+200);short_break;
#define CROSS_TIME 400
#define white1 39
#define white2 45
#define black1 55
#define black2 63
#define turn_left1 OnFwd(OUT_C,40);Off(OUT_A)
#define turn_left2 OnFwd(OUT_C,40);OnRev(OUT_A,30)
#define turn_right1 OnFwd(OUT_A,40);Off(OUT_C)
#define turn_right2 OnFwd(OUT_A,40);OnRev(OUT_C,20)
#define CCC 14000
#define cross_line OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break;
#define go_R OnFwd(OUT_A,SPEED_H);OnFwd(OUT_C,SPEED_L+10);
#define mMAX 5
sub trace_L() {
int n; while(true) { while(n < nMAX) { if(SENSOR_1 < CENTER-12) {turn_SR;n++;} else { if(SENSOR_1 < CENTER-6) {turn_R;} else if(SENSOR_1 < CENTER+6) {go_forward;} else if(SENSOR_1 < CENTER+12) {turn_L;} else {turn_SL;} n=0; } Wait(STEP); } short_break; turn_SL;Wait(nMAX*STEP); cross; n=0; break; }
}
↑線の左側をトレースしていき、交差点で止まる。
sub trace_L_n() {
if (SENSOR_1<BLACK_01) {turn_left;} else { if (SENSOR_1<BLACK_02) {left;} else if (SENSOR_1<WHITE_01) {go_forward;} else if (SENSOR_1<WHITE_02) {right;} else {turn_right;} } Wait(STEP);
}
↑線の左側をトレースしていくだけ。
sub right_n() {
if (SENSOR_1<BLACK_01) {turn_left;} else if (SENSOR_1<BLACK_02) {left;} else if (SENSOR_1<WHITE_01) {go_forward;} else if (SENSOR_1<WHITE_02) {right;} else {turn_right;}Wait(STEP);
}
↑線の右側をトレースしていくだけ。
sub trace_L_m() {
if (SENSOR_1 < white1) {turn_left2;} else if (SENSOR_1 < white2) {turn_left1;} else if (SENSOR_1 < black1) {go_forward;} else if (SENSOR_1 < black2) {turn_right1;} else {turn_right2;} Wait(STEP);
}
sub trace_L_a() {
int n; if(SENSOR_1 < BLACK_01){turn_left;n++;} else { if(SENSOR_1 < BLACK_02) {left;n++;} else if(SENSOR_1 < WHITE_01) {go_forward;} else if(SENSOR_1 < WHITE_02) {right;} else {turn_right;} n=0; } Wait(STEP);
}
sub trace_R_n() {
int n; if (SENSOR_1<BLACK_01) {turn_right;n++;} else { if (SENSOR_1<BLACK_02) {right;n++;} else if (SENSOR_1<WHITE_01) {go_forward;} else if (SENSOR_1<WHITE_02) {left;} else {turn_left;} n=0; } Wait(STEP);
}
task main() {
SetSensorLight(S1); long timess = 0; int nOnline=0; int n=0;
Wait(40000); long t3 = CurrentTick();
↑ここでt3を現在時刻と同期する。
while(CurrentTick()-t3 < 2000) {trace_R_n();}
↑ここで、現在時刻とさっき設定したt3との差が2000になるまでの間trace_R_nを行うようにすることで、2秒間トレースするようにした。
Off(OUT_ABC); Wait(1000); RotateMotor(OUT_C,70,430);
↑ここで右側の車輪を430回転させることで、ロボットをコースに対し垂直に向けた。
Off(OUT_AC); Wait(10000);
↑ここで10秒間受け取る体勢でロボットを待機させる。
OnFwd(OUT_B,33);
↑ここでボールをキャッチする。
Wait(600); Off(OUT_B); Wait(2000); RotateMotor(OUT_A,-70,430);Off(OUT_ABC);Wait(500);
↑ここでロボットをまたコースの方向に向ける。
go_R;Wait(800); Off(OUT_ABC);Wait(500);
PlaySound(SOUND_CLICK); long t2 = CurrentTick(); while(CurrentTick()-t2 <= 1700){right_n();}
↑ここで1.7秒間ライントレースさせて次のパスの場所までロボットを移動させる。
PlaySound(SOUND_CLICK); Off(OUT_ABC); Wait(1000); RotateMotor(OUT_A,70,430);Off(OUT_ABC);Wait(1000);
↑ここでロボットをコースに対し垂直に向ける。
shoot;
↑ここでパスを出す。
PlaySound(SOUND_CLICK); Off(OUT_ABC); long t1 = CurrentTick(); RotateMotor(OUT_A,-70,430);Off(OUT_ABC);Wait(500); while (CurrentTick()-t1 <= 4800) {trace_L_n();}
↑ここで4.8秒間ライントレースさせて次のパスの場所までロボットを移動させる。
PlaySound(SOUND_CLICK); Off(OUT_ABC);Wait(1000); RotateMotor(OUT_A,70,430);Off(OUT_ABC);Wait(10000);
↑ここでロボットをコースに対し垂直に向けて、ボールを受け取る体勢で10秒間待機させる。
OnFwd(OUT_B,33);Wait(700);Off(OUT_ABC);Wait(1000);
↑ここでボールをキャッチする。
RotateMotor(OUT_A,-70,430);
↑ここでロボットをコースの方向に向ける。
PlaySound(SOUND_CLICK); Off(OUT_ABC); Wait(1000); long t0 = CurrentTick(); while (CurrentTick()-t0 <= MOVE_TIME) {trace_L_n();}
↑ここでMOVE_TIMEの間ライントレースして、シュートする位置までロボットを移動させる。
PlaySound(SOUND_CLICK); Off(OUT_ABC); Wait(1000); shoot;
↑ここでシュートする。
}
今回の課題は自分的にはまあまあでした。前回の課題ではうまくプログラミングが書けなかったことを振り返ると、少しはプログラミングが上達したと実感しました。今回の課題ではボールを取りに行くことと、パスを行うことが特に難しかったです。ボールを取りに行く動作に関しては、ボールが置いてあるとこまでロボットを運び、線上に戻すという動作が難しかったです。パスに関しては、ボールを出す位置と受け取る位置の調整がとても大変でした。それでも、今回2回パスが通って嬉しく思いました。