- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013a/Member]]
*課題2:ロボコン[#fc3e4d1d]
#define off Off(OUT_BC);
#define TURN_TIME 500 //1/4回転の時間
#define BLACK 31
#define WHITE 62
#define SPEED 100
#define go OnFwd(OUT_BC,50);
#define left OnFwd(OUT_B,50);Off(OUT_C);
#define right OnFwd(OUT_C,50);Off(OUT_B);
#define THRESHOLD 46
#define lleft OnFwd(OUT_B,50);OnRev(OUT_C,50);
#define rright OnFwd(OUT_C,50);OnRev(OUT_B,50);
#define fire OnRev(OUT_A,75);
#define catch OnFwd(OUT_A,50);
#define back OnRev(OUT_BC,50);
#define off1 Off(OUT_BC);
#define off2 Off(OUT_A);
#define CONN 1
task main ()
{//1
int msg;
*ロボットの紹介 [#n619a93f]
今回のロボットは、ピンポン玉発射時とピンポン玉を取りに行くときの正確さを上げるような構造にしました。
http://www.dotup.org/uploda/www.dotup.org4406378.jpg
*コースの攻略法 [#y4d4ac72]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission2&openfile=robocon2013a.png
**先行(ピンポン玉をとりに行くほう) [#h952dd39]
+ライントレースをし交差点まで行く
+交差点まできたと判断したら、ピンポン玉の方向へロボットの進行方向の調節をするプログラムを起動させる
+ピンポン玉を取りもと来た道に戻るようにする
+相互にパスをする体勢を整えてからパスをやり取りする
+最後のパスが来たライントレースをし、時間指定で所定位置まで行きゴールにシュートする
long t0 = CurrentTick();//時間指定
while(CurrentTick()-t0 <= 500)//球を排出するまでのプログラム
{//5
if (SENSOR_1 < 37){left}
else
{//6
if(SENSOR_1 < 45){lleft}
else if (SENSOR_1 < 50){go}
else if (SENSOR_1 < 56){right}
else {rright}
}//6
}//5
rright
Wait(1000);
off1
while(!(msg == 11)){ReceiveRemoteNumber(MAILBOX1,true,msg);}
catch
Wait(1000);
off2
while(SENSOR_1 > 50){rright}
*プログラムの説明 [#e15a1eb1]
文字の定義
#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
long t1 = CurrentTick();//時間指定
while(CurrentTick()-t1 <= 1500)//球を排出するまでのプログラム
{//5
if (SENSOR_1 < 37){left}
else
{//6
if(SENSOR_1 < 45){lleft}
else if (SENSOR_1 < 50){go}
else if (SENSOR_1 < 56){right}
else {rright}
時間が来たら玉をパスするための行動に移行する
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
}//5
lleft
Wait(1000);
off1
while(!(msg == 12)){ReceiveRemoteNumber(MAILBOX1,true,msg);}
fire
Wait(1000);
off2
while(SENSOR_1 > 50){rright}
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);
long t2 = CurrentTick();//時間指定
}//1
while(CurrentTick()-t2 <= 1500)//球を排出するまでのプログラム
{//5
if (SENSOR_1 < 37){left}
else
{//6
if(SENSOR_1 < 45){lleft}
else if (SENSOR_1 < 50){go}
else if (SENSOR_1 < 56){right}
else {rright}
}//6
}//5
lleft
Wait(1000);
off1
while(!(msg == 13)){ReceiveRemoteNumber(MAILBOX1,true,msg);}
catch
Wait(1000);
off2
while(SENSOR_1 > 50){rright}
*まとめ [#yd2e7fd2]
とても難しかった。特に相手とのBluetooth通信による連携は困難を極めた。他にも、ロボットの形が相手とは違っていたのでパスのやり取りがしずらかったことも反省すべき点であった。だが、なんとか2回のパスを本番で通すことができたのは僥倖だった。
~また、電池の残量によりロボットの挙動が大分変ってしまうので、試験当日に電池が切れ、交換をしなければならなくなったことで、調整に余計に時間を使ったことが特に悔やまれる。
long t3 = CurrentTick();//時間指定
while(CurrentTick()-t3 <= 8500)//球を排出するまでのプログラム
{//5
if (SENSOR_1 < 37){left}
else
{//6
if(SENSOR_1 < 45){lleft}
else if (SENSOR_1 < 50){go}
else if (SENSOR_1 < 56){right}
else {rright}
}//6
}//5
}//1