- 追加された行はこの色です。
- 削除された行はこの色です。
2019a/Member/Nove/Mission1
2019a/Member/Nove/Mission2
#contents
*課題について [#u98283e0]
指定されたコースを進み、ミッションを遂行するロボットの作成。
**コースとその図 [#dcd3dc2f]
交差点では一秒停止し、T字路では直角に侵入するときのみ一時停止すること。
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
*ロボット本体の説明 [#j9fb7d00]
小回りがきくよう基本のロボットのサイズを小さくした。その写真を載せる。
#ref(2019a/Member/Nove/Mission2/s_IMG_1.jpg)
ピンポン玉を掴むバンパーを付けた。バンパーと光センサーの部品で玉を固定し持ち運ぶ。その写真を載せる。
#ref(2019a/Member/Nove/Mission2/s_IMG_2.jpg)
*プログラムの説明 [#g4641d93]
**defineについて [#f719bc92]
RUN_TIMEはそれぞれ以下で示すsubルーチンの中で使われている。
交差点、T字路時に曲がるので旋回の定義も加えた。
#define THRESHOLD 43
#define RUN_TIME1 50
#define RUN_TIME_GHIJ 480
#define RUN_TIME_LM 1500
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);
**subルーチンについて [#h2c0d192]
交差点判断をするにあたり、黒を検知する時間を測る方法をとった。
具体的に説明する。
まず、通常のライントレースに支障が出ず、かつその後直進あるいは曲がる時に余り大きな動きにならない時間を測った。それがRUN_TIMEの時間である。この時間以上センサーが黒を検知した場合に一秒停止するようにした。それをD,Gの二つの地点で行った。
D地点までのプログラム
sub line_trace1() //Dの交差点で止まるまでライントレースし続けるプログラム
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while(FastTimer(0)<=RUN_TIME1){//RUN_TIME以下ならライントレース
if(40<SENSOR_2){
OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);//白で右
}else if(35<SENSOR_2<40){
Off(OUT_A);OnFwd(OUT_C);//中間(グレー)で左
}else{
OnRev(OUT_A);OnFwd(OUT_C);//黒で旋回
}
}
Off(OUT_AC);Wait(100);
}
DからGまでライントレースするプログラム
sub line_trace2()
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while(FastTimer(0)<=RUN_TIME1){//RUN_TIME以下ならライントレース
if(40<SENSOR_2){
OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);//白で右
}else if(35<SENSOR_2<40){
Off(OUT_A);OnFwd(OUT_C);//中間(グレー)で左
}else{
OnRev(OUT_A);OnFwd(OUT_C);//黒で旋回
}
}
Off(OUT_AC);Wait(100);
}
ライントレースは区間ごとにかかる時間を測り、その時間内では定めた閾値を基準に動作するようプログラムを組んだ。
GHIJ間のライントレース(内側)
sub line_trace_GHIJ()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (FastTimer(0) <= runtime) { //4.8秒でGからJまで動き続ける
if (SENSOR_2 < THRESHOLD){ // 線上なら
turn_left; // 左へ
} else { // 線上でなければ
turn_right; // 右へ
}
Wait(100);
}
}
LM間のライントレース
sub line_trace_LM() //LM間のライントレース
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (FastTimer(0) <= runtime) { //15秒でLからMまで動き続ける
if (SENSOR_2 < THRESHOLD){ // 線上なら
turn_left; // 左へ
} else { // 線上でなければ
turn_right; // 右へ
}
Wait(100);
}
}
**task main について [#rde24ec5]
task main(){
OnFwd(OUT_AC);Wait(100);//Aからライン上(外側)まで動かす
line_trace1();//D地点の交差点までライントレース
turn_right;Wait(45);OnFwd(OUT_AC);Wait(15);//停止後、右に旋回して位置調整し、少し前に進んで次のライントレースに備える
line_trace2();//DEFGのライントレース
turn_right;Wait(45);OnFwd(OUT_AC);Wait(25);//内側をライントレースするために位置調整
line_trace_GHIJ();Off(OUT_AC);//
turn_right;Wait(100);OnFwd(OUT_AC);Wait(15);//J点で右に90度旋回し、まっすぐ進んで黒線を超える
line_trace2();//交差点用ライントレース
OnFwd(OUT_AC);Wait(15);//外側を通りたいので、少しまっすぐ動く
turn_left;Wait(70);OnFwd(OUT_AC);Wait(100);//左に旋回しKLのセント車体を平行に、その後L地点まで移動
OnFwd(OUT_B);Wait(15);//バンパーを閉じ、たまをキャッチ
turn_right;Wait(200);//180度旋回
line_trace_LM();Off(OUT_AC);
turn_right(15);Off(OUT_AC);//車体を真っ直ぐにし、停止
OnRev(OUT_B);Wait(15);//バンパーを開く
OnRev(OUT_AC);Wait(300);//車体を後ろに下げる
OnFwd(OUT_B);Wait(15);//バンパーを閉じる
OnFwd(OUT_AC);Wait(300);//直進してたまをシュートする
}
*まとめ [#w31b85e4]
交差点判断に当たり、うまく作動するときとしないときがあった。最後うまく行ったが、何故判断をせずにライントレースをし続けてしまうことがあったのかわからなかった。時間が足らず、その点の改善等が十分にできなかった。
プログラムに関してだが、今回自分は決めた区間内をトレースするのにかかる時間を測り、subルーチンをつくった。そのためsubルーチンの個数が多くなってしまった。これを一個で済ませられるようなプログラムにできないかを考えてみようと思う。