- 追加された行はこの色です。
- 削除された行はこの色です。
[[2012b/Member]]
*ピンポン玉を持ちながらライントレース後ピンポンゴール [#hc48c2e1]
**ロボット [#yaa408ee]
ロボット製作もプログラミングも相方が頑張ったので僕はその集大成を頑張ってレポートしてみようと思います。
見てください、シンプルなロボットを。世の常ではsimple is the bestですよね。
#ref(./robo01.jpg,26379 bytes,シンプルなロボット)
これは初期型のロボットにピンポン玉を取るための”手”をつけて、後はほとんど変わりません。”手”はモーターとピンポン玉を囲むカゴでできています。これはOUT_Aで動かし、右タイヤがOUT_B左タイヤがOUT_Cとなっています。
#ref(./robo02.jpg,26622 bytes,”手”主人公)
今度はちゃんと自分で考えて作る。
では次にプログラムの解説です。
*プログラム [#n3748e5e]
#define left01 OnFwd(OUT_B,40);OnRev(OUT_C,20);
#define THRESHOLD 45
#define STEP 10
#define left00 OnFwd(OUT_B,30);OnFwd(OUT_C,-30);Wait(1200);
#define mae00 OnFwd(OUT_BC,20);Wait(600);
#define right00 OnFwd(OUT_C,30);OnFwd(OUT_B,-30);Wait(400);
#define short_break00 Off(OUT_BC); Wait(1000);
#define mae01 OnFwd(OUT_BC,20);Wait(400);
#define short_break01 Off(OUT_BC); Wait(500);
#define right01 OnFwd(OUT_C,40);OnRev(OUT_B,20);
#define right03 OnFwd(OUT_C,30);OnFwd(OUT_B,-30);Wait(500);
#define left01 OnFwd(OUT_B,40);OnRev(OUT_C,20); //ライントレース時の左旋回
#define THRESHOLD 45 //しきい値
#define STEP 10 // 一回の判定で進む時間
#define left00 OnFwd(OUT_B,30);OnFwd(OUT_C,-30);Wait(1200); //初めにピンポンとるときに左向く
#define mae00 OnFwd(OUT_BC,20);Wait(600); //ピンポンをとるために前身
#define right00 OnFwd(OUT_C,30);OnFwd(OUT_B,-30);Wait(400); //left00の反対でライントレースするために右を向く
#define short_break00 Off(OUT_BC); Wait(1000); //小休止
#define mae01 OnFwd(OUT_BC,20);Wait(400); //黒のラインへ進む
#define short_break01 Off(OUT_BC); Wait(500); //小休止
#define right01 OnFwd(OUT_C,40);OnRev(OUT_B,20); //右旋回
#define right03 OnFwd(OUT_C,30);OnFwd(OUT_B,-30);Wait(500); //右旋回
task main()
{
left00;
mae00;
short_break00;
OnFwd(OUT_A,20);Wait(300);Off(OUT_A);
mae01;
right00;
SetSensorLight(S3);
SetSensorLight(S3); //光センサー
short_break01
long time1,timeA;
long time1,timeA=0;
time1 = CurrentTick();
while(5000 >= timeA){
while(5000 >= timeA){ //交差点を避けるためタイマーで反対車線に渡る
timeA = CurrentTick()-time1;
if(SENSOR_3 < THRESHOLD){
left01;
}else{
right01;
}
Wait(STEP);
}
short_break01
OnFwd(OUT_C,30);Wait(300);
long time2,timeB;
time2 = CurrentTick();
long time2,timeB=0;
time2 = CurrentTick(); ////交差点を避けるためタイマーで反対車線に渡る
while(9000 >= timeB){
timeB = CurrentTick()-time2;
if(SENSOR_3 < THRESHOLD){
right01;
}else{
left01;
}
Wait(STEP);
}
short_break01
OnFwd(OUT_B,30);Wait(300);
long time3,timeC;
time3 = CurrentTick();
long time3,timeC=0;
time3 = CurrentTick(); ////交差点を避けるためタイマーで反対車線に渡る
while(26000 >= timeC){
timeC = CurrentTick()-time3;
if(SENSOR_3 < THRESHOLD){
left01;
}else{
right01;
}
Wait(STEP);
}
short_break01;
right03;
OnFwd(OUT_BC,50);Wait(1000);Off(OUT_BC);
Off(OUT_BC);Wait(600);
OnFwd(OUT_A,-50);Wait(300);Off(OUT_A);
OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC);
OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); //ここの4、5行はピンポンをゴールするため調整
OnFwd(OUT_BC,-100);Wait(400);Off(OUT_BC);
}
*解説 [#qbb963d1]
#ref(./2012b-mission1.png,コース)
基本的にこの全ての交差点を避けるために変数を使い、時間を測ってライントレースを行う。
相方とはコースが逆だが、ライントレースで交差点を避けるところはほぼ同じなので変えなくても大丈夫だった。だが、最後の小休止からのゴールが少し届かなかったので最後の小休止の後、少し前に行ってから”手”を上にボールが逃げないように素早く挙げ、勢い良くゴールするために速いスピードで押し出し、万一枠の中に入らないようにバックする。
さて、交差点の避け方だが、小休止を合図に交差点にぶち当たる前に交差点のある道の向こう側に渡るのだ。詳しくは↓画像より。
#ref(./sen.png,30分間かけて描きました)
**最後に [#d2de8f9e]
色々大変でっていうのは言い訳だけど、ロボット製作にはあんまし参加できなかった。
カウントでやってみたいと思いつつ意味がわからず断念してしまったり。
今度は積極的に参加し、創作の技術をあげたいです。