今回のロボットは、ピンポン玉発射時とピンポン玉を取りに行くときの正確さを上げるような構造にしました。
文字の定義
#define off Off(OUT_BC); #define BLACK 31 #define WHITE 62 #define go OnFwd(OUT_BC,30); #define left OnFwd(OUT_B,30);Off(OUT_C); #define right OnFwd(OUT_C,30);Off(OUT_B); #define THRESHOLD 46 #define lleft OnFwd(OUT_B,30);OnRev(OUT_C,30); #define rright OnFwd(OUT_C,30);OnRev(OUT_B,30); #define fire OnRev(OUT_A,55); #define catch OnFwd(OUT_A,40); #define back OnRev(OUT_BC,30); #define off1 Off(OUT_BC); #define off2 Off(OUT_A); #define CONN 1
メインプログラム
task main() {//1 カッコの数が分からなくなるので数字をつけて区別 {}で1対応 SetSensorLight(S1);//光センサー定義 int n=0;//変数1 int m=0;//変数2 int msg;
球をとるまでのプログラム
while(n<600)//ライントレース(交差点判断含む) {//2 if (SENSOR_1 < 35){left;n++; } else {//3 if(SENSOR_1 < 42){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} n=0; }//3 }//2
交差点にきたらwhileを抜け次のプログラムへ
back//体制を整えるため一旦距離をとる Wait(1250); right Wait(980);//球の方向へ go Wait(500);//進む catch Wait(500);//球を抑える Off(OUT_A); rright Wait(1500);//元の方向へ go//進む Wait(2450); while(SENSOR_1 > 50){left}//黒線がくるまで左回転
球を排出するまでのプログラム
long t0 = CurrentTick();//時間指定 while(CurrentTick()-t0 <= 4850)//ライントーレス {//4 if (SENSOR_1 < 37){left} else {//5 if(SENSOR_1 < 45){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} }//5 }//4
時間が来たら玉をパスするための行動に移行する
lleft Wait(1040); Off(OUT_BC); Wait(2000); SendRemoteNumber(CONN,MAILBOX1,11);相手に信号を送る fire//玉発射 Wait(1200); Off(OUT_A); rright Wait(400); while(SENSOR_1 > 50){rright}//方向改善 go//次の地点へ Wait(2050);
玉を受け取るプログラム
lleft//受け取る体勢 Wait(1040); Off(OUT_BC); Wait(5000); SendRemoteNumber(CONN,MAILBOX1,12); 玉を打たせる信号を送る Wait(3000); catch//玉をとる Wait(350); Off(OUT_A); while(SENSOR_1 > 50){rright}
球を排出するまでのプログラム
long t3 = CurrentTick(); while(CurrentTick()-t3 <= 2400) {//6 if (SENSOR_1 < 37){left} else {//7 if(SENSOR_1 < 45){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} }//7 }//6 lleft//球排出 Wait(1040); Off(OUT_BC); Wait(5000); SendRemoteNumber(CONN,MAILBOX1,13); fire Wait(1000);//1回目終了 Off(OUT_A);
相手が終わるまで待機
Wait(30000);
玉受け取り
SendRemoteNumber(CONN,MAILBOX1,13); Wait(800); catch Off(OUT_A); Wait(500); while(SENSOR_1 > 50){lleft}
球を排出するまでのプログラム
long t4 = CurrentTick(); while(CurrentTick()-t4 <= 2500) {//8 if (SENSOR_1 < 37){left} else {//9 if(SENSOR_1 < 45){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} }//9 }//8 rright Wait(1000); Off(OUT_BC); fire Wait(500); Off(OUT_A); while(SENSOR_1 > 50){lleft}
球を受け取るプログラム
long t5 = CurrentTick(); while(CurrentTick()-t5 <= 2500) {//10 if (SENSOR_1 < 37){left} else {//11 if(SENSOR_1 < 45){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} }//10 }//11 rright Wait(1000); Off(OUT_BC); catch Wait(500); Off(OUT_A); while(SENSOR_1 > 50){lleft} long t6 = CurrentTick();
ゴール用
while(CurrentTick()-t6 <= 5000) {//12 if (SENSOR_1 < 35){left} else {//13 if(SENSOR_1 < 42){lleft} else if (SENSOR_1 < 50){go} else if (SENSOR_1 < 56){right} else {rright} }//13 }//12
時間が来たら発射
fire Wait(1000); Off(OUT_A);
}//1
とても難しかった。特に相手とのBluetooth通信による連携は困難を極めた。他にも、ロボットの形が相手とは違っていたのでパスのやり取りがしずらかったことも反省すべき点であった。だが、なんとか2回のパスを本番で通すことができたのは僥倖だった。
また、電池の残量によりロボットの挙動が大分変ってしまうので、試験当日に電池が切れ、交換をしなければならなくなったことで、調整に余計に時間を使ったことが特に悔やまれる。