- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*今回の課題 [#d8f15565]
**コース [#ib97dc57]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(2017b/Mission2/2017b-mission2.png,50%,課題2のコース)
**ミッション [#i6f1e63b]
次のコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。
自分は以下の第1コースを担当した。
+Aをスタート
+Bを直進
+Cを右折
+Fを直進
+Rを左折(一時停止)
+Pを直進
+X地点の紙コップを取得してコースに戻る
+Qを左折
+Sを直進(一時停止)
+Y地点に紙コップを置いてコースに戻る
+Sを直進(一時停止)
+Fを左折(一時停止)
+Cを右折(一時停止)
+D地点へ(ゴール)
* ロボット本体の説明 [#feff4d29]
コップをつかむアームを図のように作った。片方のアームにギアをつけてモーターにつなぐことで動かし、挟むようにした。
#ref(im2.jpg);
コップをつかむアーム部分を車体の前に出し、取りやすくした。
#ref(im1.jpg);
トレースのための光センサは車体とアームの間につけ、小回りが利くようにした。
#ref(im3.jpg);
トレースが安定する光センサの位置を探し、図の高さにつけることにした。
#ref(im4.jpg);
*プログラム[#sb3f8163]
#define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define rightMAGARU OnFwd(OUT_A);Off(OUT_C);//右折
#define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define leftMAGARU OnFwd(OUT_C);Off(OUT_A);//左折
#define middle 41 //閾値
#define ch OnFwd(OUT_B);Wait(10);Off(OUT_B);//コップをつかむ
#define re OnRev(OUT_B);Wait(5);Off(OUT_B);//コップを放す
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//t秒前進
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//t秒後退
#define cross_stop Off(OUT_AC);Wait(100);//交差点停止
基本的なラインの右側トレースを以下のように定義した。また、左右を逆にしたものをl()として左側トレースも定義した。
基本的なラインの右側トレースを以下のように定義した。また、左右を逆にしたものをl()として左側トレースも定義した。また、連続して黒線上の右旋回の経過時間を測定し、0.2以上になった時には交差点と判断させた。
sub r()
{
SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを2にセット
ClearTimer(0);
while(FastTimer(0)<=20) //0.2秒より小さければ以下をループ、それ以上で交差点と判断。
SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを端子2にセット
ClearTimer(0); //タイマーリセット
while(FastTimer(0)<=20) //0.2秒以内黒の線を連続して感知した場合ループ、それ以上は次の動作へ
{
if(SENSOR_2>middle+5) //閾値より大きい時左旋回
if(SENSOR_2>middle+5) //閾値より5大きい時左旋回
{
leftSENKAI
ClearTimer(0);
ClearTimer(0);
}
else if(SENSOR_2>middle+3) //閾値より少し大きい時左折
else if(SENSOR_2>middle+3) //閾値より3大きい時左折
{
leftMAGARU
ClearTimer(0);
ClearTimer(0);
}
else if(SENSOR_2>middle) //閾値の時直進
{
OnFwd(OUT_AC);
ClearTimer(0);
ClearTimer(0);
}
else if(SENSOR_2>middle-3) //閾値より少し小さい時右折
else if(SENSOR_2>middle-3) //閾値より3小さい時右折
{
rightMAGARU
ClearTimer(0);
ClearTimer(0);
}
else
{
rightSENKAI //閾値より小さい時右旋回
}
rightSENKAI //上記の条件以外の時右旋回
} //この時タイマーをリセットしていないので右旋回の時間が0.2以上で交差点と判断。
}
Off(OUT_AC); //0.2秒以上の時停止
Off(OUT_AC);
}
task main ()
{r(); //AB間
cross_stop; //一時停止
go(35); //位置合わせ
r(); //BC間
cross_stop; //一時停止
leftSENKAI; //位置合わせ
Wait(30);
r(); //CF間
Wait(30);
r(); //CF間
cross_stop; //一時停止
go(35); //位置合わせ
r(); //FE間
cross_stop;//一時停止
go(25); //ラインの左側へ移動
go(35); //位置合わせ
r(); //FE間
cross_stop; //一時停止
go(25); //ラインの左側へ移動
l(); //ER間
cross_stop;// 一時停止
rightSENKAI;// 位置合わせ
cross_stop; //一時停止
rightSENKAI; //位置合わせ
Wait(30);
l(); //RP間
cross_stop;//一時停止
l(); //RP間
cross_stop; //一時停止
ch; //コップをつかむ
go(25); //位置合わせ
l();// PQ間
go(20);//ラインの右側へ移動
r(); //QS間
cross_stop;//一時停止
go(30);//位置合わせ
r();//円Yの外周
cross_stop;//一時停止
go(50);//位置合わせ
leftSENKAI;//ラインの左側へ移動
l(); //PQ間
go(20); //ラインの右側へ移動
r(); //QS間
cross_stop; //一時停止
go(30); //位置合わせ
r(); //円Yの外周
cross_stop; //一時停止
go(50); //位置合わせ
leftSENKAI; //ラインの左側へ移動
Wait(65);
l(); //SF間
cross_stop;//一時停止
ch;//コップの持ち直し
leftSENKAI;//コップを円に入れる
l(); //SF間
cross_stop; //一時停止
ch; //コップの持ち直し
leftSENKAI; //コップを円に入れる
Wait(160);
re; //コップを放す
back(45); //後退
rightSENKAI; //元に戻す
re; //コップを放す
back(45); //後退
rightSENKAI; //元に戻す
Wait(160);
r(); //FC間
cross_stop;//一時停止
r(); //FC間
cross_stop; //一時停止
rightSENKAI; //Dに入るため回転
Wait(90);
go(90); //ゴール
}
*反省と結果 [#ic41d110]
ライントレースにおいて重要な役割を果たす光センサーの位置調整に苦労したが、本番ではうまくいった。アームの力が少し弱かったため何度かつかむプログラムを入れたが途中で放してしまって残念だった。ミッションを成功させることができてよかった。