目次
#contents
*課題2 [#e5271ba3]
コースに沿ってロボットを走らせる。
**コース [#e89dea7e]
#ref(./2017a-mission2.png,75%,コース)
-・E地点右折コース
-- E右折(SOUND_UP)
-- P一時停止(SOUND_DOWN)&左折
-- Q(SOUND_UP)&直進
-- R(SOUND_UP)&左折
-- T一時停止(SOUND_DOWN)&直進
-- T一時停止(SOUND_DOWN)&直進
-- H(SOUND_UP)
-- G(SOUND_UP)
-- S一時停止(SOUND_DOWN)&左折
-- P直進(SOUND_UP)
-- Q左折(SOUND_UP)
-- F(SOUND_UP)
-- E直進
-- A停止(SOUND_DOWN)
*ロボットの説明 [#t824368f]
**ロボット全体 [#mab73167]
タイヤとセンサーの距離をできるだけ近づけられるようにコンパクトにしようとしましたが縦に大きくなり不格好にはなりましたが、特に問題はなかったのでそのままにしました。
#ref(./unna1.jpg,75%,全体)unna1.jpg
また横移動が多いということで摩擦を減らすため後輪をなくし滑らせる形にしました。
#ref(./usiro1.jpg,75%,後ろ)
*プログラム [#pa7f0a65]
最初に細かい部分の定義を行ってからプログラムをくみました。
黒線上にセンサーが反応する時間の長さから交差点やT字路を判断した上で交差点とT字路をカウントし今何番目の交差点かT字路なのかを判断しました。
**プログラム本体 [#n47d8fad]
# define TMAX 29
# define forward OnFwd(OUT_AC);
# define back OnRev(OUT_AC);
# define t_left OnRev(OUT_A);OnFwd(OUT_C); //左旋回
# define turn_left Off(OUT_A);OnFwd(OUT_C); //左回転
# define t_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
# define turn_right OnFwd(OUT_A);Off(OUT_C); //右回転
# define stop(t) Off(OUT_AC);Wait(t);
# define power(s) SetPower(OUT_AC,s);
# define KOUON PlaySound(SOUND_UP);
# define TEION PlaySound(SOUND_DOWN);
ここまでが定義
場所によって数値が違ったりして失敗が多発してしまいましたがなんとか調整しました。
int n=0;
sub right(){
while(FastTimer(0)<TMAX){
if(SENSOR_2<42){
OnFwd(OUT_A);OnRev(OUT_C);
}else if(SENSOR_2<47){
OnFwd(OUT_A);Off(OUT_C);
}else if(SENSOR_2<52){
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_2<55){
Off(OUT_A);OnFwd(OUT_C);
} else {
OnRev(OUT_A);OnFwd(OUT_C);
}
if(SENSOR_2>42){
ClearTimer(0);
}
}
n++;
}
sub left(){
while(FastTimer(0)<TMAX){
if(SENSOR_2<42){
OnRev(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_2<47){
Off(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_2<52){
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_2<55){
OnFwd(OUT_A);Off(OUT_C);
} else {
OnFwd(OUT_A);OnRev(OUT_C);
}
if(SENSOR_2>40){
ClearTimer(0);
}
}
n++;
}
サブで線の濃さによって曲がり方を変える左右の定義付をしました。
ここからがメイン
task main(){
power(0);
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while(n<=13){
� ̄�折
一つ目のT字路を認識した後次の交差点で左折をするのでライントレースを左側に変更します。
if(n==0){ //T字路
right();
KOUON;
t_left;Wait(10);
forward;Wait(40); //0.1秒停止して0.4秒前進 左へ
ClearTimer(0); //タイマーリセット
}
��一時停止のち左折
T字路を認識させて左周りに進ませるのですがセンサーが線を越えてあらぬ方向に進むことが多発した。
else if(n==1){
left();
back;Wait(20);
stop(80);
TEION;
t_left;Wait(30);
forward;Wait(50);
ClearTimer(0);
}
�D梢�
T字路を認識したあとで、左折せず直進させる。
else if(n==2){
left();
KOUON;
t_right;Wait(15);
forward;Wait(50);
ClearTimer(0);
}
�ず言�
T字路を認識し、右側ラインへ移動最終の円状交差点のために、この時に移動。この時点で移動することで次の円も楽になった。
else if(n==3){
left();
KOUON;
t_right;Wait(15);
forward;Wait(50);
ClearTimer(0);
}
�グ貉�停止のち直進
�ァ↓Δ脇韻�
右側に移動することで少し楽になりました。
else if(n==4){
right();
TEION;
t_left;Wait(25);
stop(80);
forward;Wait(50);
ClearTimer(0);
}
�Π貉�停止のち直進
else if(n==5){
right();
t_left;Wait(25);
stop(80);
TEION;
forward;Wait(50);
ClearTimer(0);
}
�П�折
�А↓┐論�に沿って移動するだけでしたので特に難しくありませんでした。
else if(n==6){
right();
KOUON;
t_right;Wait(50);
forward;Wait(50);
turn_right;Wait(15);
ClearTimer(0);
}
�┻泪�ーブ
else if(n==7){
right();
forward;Wait(15);
t_right;Wait(70);
forward;Wait(50);
turn_right;Wait(10);
t_right;Wait(40);
ClearTimer(0);
}
��右折
��、��、��は一回目の円状と同じ動きでしたので、似たようなミスも連発した。
else if(n==8){
right();
KOUON;
t_left;Wait(10);
forward;Wait(40);
ClearTimer(0);
}
��一時停止のち左折
else if(n==9){
left();
back;Wait(20);
stop(80);
TEION;
t_left;Wait(30);
forward;Wait(50);
ClearTimer(0);
}
��直進
else if(n==10){
left();
KOUON;
t_right;Wait(15);
forward;Wait(50);
ClearTimer(0);
}
��左折
ここからはほぼ直進だったので問題はなし
else if(n==11){
left();
KOUON;
t_right;Wait(15);
forward;Wait(50);
ClearTimer(0);
}
��右折
else if(n==12){
right();
KOUON;
t_right;Wait(50);
forward;Wait(40);
turn_right;Wait(10);
ClearTimer(0);
}
��直進
else if(n==13){
right();
KOUON;
t_left;Wait(25);
forward;Wait(250);
}
Off(OUT_AC);
}
サブなどで定義した内容をメインで呼び起こす形なのでメインタスクは少し短くできたかなと思います。また曲がり角やT字路をカウントし現在地を推定させていたので、カウントしなかったときにすぐに暴走してしまいました。
**まとめ [#kc5b400b]
曲がり角やT字路を認識しカウントすることで位置を確認するようにしましたが、認識してくれないこともあり上手くいかない時がありました。
*感想 [#b7496b56]
今回線の濃さや黒い部分に反応する時間など細かい計測をしたうえで、プログラムを組む必要がありましたがその時に正確な時間などを計測できなっかたり場所によって異なったりしていてなかなか上手くいかなかった。もう少しじっくりと色んな場所で計測したうえで細かくプログラムすればよかったと思います。