今回のロボットもシンプルに仕上げました。 僕が本体を主に作り相方のA.K.416君がボールを取ったり、発射したりする機構を作りました。 本体は前回の時と同じでシンプルにし、いかにボールをどうするかに悩みました。 タイヤのモーターとプログラムを入れる機械にはさむという形に落ち着き、このようにプログラムを入れる機械を上げています。
受け取る機構はA.K.416君のを僕なりに書いてみた。
文字の定義
#define TURN_TIME 500 //1/4回転の時間 #define BLACK 31//黒線は明るさ31 #define WHITE 62//白紙は明るさ62 #define SPEED 100//モーターの出力100% #define go OnFwd(OUT_BC,30);//goで前に出力30%で進む #define left OnFwd(OUT_B,30);Off(OUT_C);//Cのモーターを軸に左に30%で曲がる #define right OnFwd(OUT_C,30);Off(OUT_B);//Bのモーターを軸に右n30%で曲がる #define THRESHOLD 46//線の明るさのしきい値 #define lleft OnFwd(OUT_B,30);OnRev(OUT_C,30);//モーター同士の間を中心に出力30%で左回転 #define rright OnFwd(OUT_C,30);OnRev(OUT_B,30);//モーター同士の間を中心に出力30%で右回転 #define fire OnRev(OUT_A,55);//ボールを発射する #define catch OnFwd(OUT_A,40);//ボールを抑える #define back OnRev(OUT_BC,30);//出力30%で後退する #define off1 Off(OUT_BC);//モーターBCを止める(BCはタイヤを動かすモーター) #define off2 Off(OUT_A);//モーターAを止める(Aは受け取ったり発射したりするモーター) #define CONN 1//通信時の文字定義 task main() {//1 SetSensorLight(S1);//光センサー定義 int n=0;//変数1 int m=0;//変数2 int msg;
球をとるまでのプログラム
while(n<600)//ライントレース(左に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
交差点に来たら
back Wait(1250);//態勢を整えるため後退し距離をとる right Wait(980);//球の方向に角度調整 go Wait(500);//進む catch Wait(500);//球を抑える Off(OUT_A); rright Wait(1500);//Uターンする go Wait(2450);//進む while(SENSOR_1 > 50){left}//黒線になるまで左回転
ボールを発射場までのライントレース
long t0 = CurrentTick();//ここから時間測定をする while(CurrentTick()-t0 <= 4850)//4.85秒間ライントレース {//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)//2.4秒間ライントレースしたら次のプログラムへ {//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); 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)//2.5秒間ライントレース {//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 <= 1500)//1.5秒間ライントレース {//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} }//11 }//10 rright Wait(1000); Off(OUT_BC); catch//ボールを受け取る Wait(500); Off(OUT_A); while(SENSOR_1 > 50){lleft}//方向角度調整
最後のライントレース
long t6 = CurrentTick(); while(CurrentTick()-t6 <= 5000)//5秒間ライントレース {//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通信が特に難しかった。また、ボールの受け取り口が広くはないのでパスのやり取りに苦戦した。本番ではうまくいっていたのは不幸中の幸いだと思う。もう少し改善すべきところもあっただろう。他にも、電池の残量によってロボットの挙動が変わってしまい数値を調節するのに時間がかかってしまい大変だった。