目次
コースの黒い線に沿って決められた道順で進む。ルートはEで右折するルート。(詳しくは課題2を参照。)
今回の課題ではロボットの小回りの効きが重要ということなのでタイヤ間の距離を短くし、ロボットを回転させる時四輪だと引きずってしまうタイヤが出てくるので二輪にしました。二輪だとマシーン自体を引きずってしまうので後ろに柱を一本建てその下は滑りをよくするために丸い部品をつけました。
線に沿って進むwhileの中で使う両輪を使った回転(migisenkai,hidarisenkai)、一輪を使った回転(usetu,sasetu)、この4つのdefineの最初にOffを短時間いれ動きを少しかくつかせることで動きすぎないようにしました。
交差点にさしかかったときの行動として
直角に右折(tyokkakumigi)、直角に左折(tyokkakuhidari)、直進(tyokusin)
#define migisenkai Off(OUT_AC);Wait(2);OnFwd(OUT_A);OnRev(OUT_C); ClearTimer(0); // 右旋回 #define hidarisenkai Off(OUT_AC);Wait(2);OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define usetu Off(OUT_AC);Wait(2);OnFwd(OUT_A)// 右折 #define sasetu Off(OUT_AC);Wait(2);OnFwd(OUT_C);// 左折 #define tyokkakumigi OnFwd(OUT_AC);Wait(25);Off(OUT_AC);OnFwd(OUT_A);OnRev(OUT_C);Wait(60);Off(OUT_AC);//直角旋回 右 #define tyokkakuhidari OnFwd(OUT_AC);Wait(25);Off(OUT_AC);OnFwd(OUT_C);OnRev(OUT_A);Wait(75);Off(OUT_AC);//直角旋回 左 #define tyokusin OnFwd(OUT_AC);Wait(30);Off(OUT_AC);//交差点を直進
線に沿って進むwhileのプログラムで交差点を判別する方法は光センサーの値が30より多く40より小さい時の場合をカウントする方法をとっています。タイマーを使う方法も試しましたがカウントする方が判別しやすかったのでこの方法をとりました。だがカウントで判定すると交差点間ごとにwhileの条件数値を設定しないといけないからプログラムが重くなってしまったがその分安定して交差点を判別できる。
task main(){ SetPower(OUT_AC,3); SetSensor(SENSOR_2,SENSOR_LIGHT); int n=0;
while( n < 5 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; n++; } }//Eまで
PlaySound(SOUND_UP); tyokkakumigi; int l=0;
while( l < 4 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 35 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; l++; } }//Pまで
Off(OUT_AC);Wait(100); PlaySound(SOUND_DOWN); tyokkakuhidari; int k=0;
while( k<4 ){ if(SENSOR_2 > 50){ migisenkai; } else if(SENSOR_2 > 45 ){ usetu; } else if(SENSOR_2 > 35 ){ sasetu; } else if(SENSOR_2 > 30 ){ hidarisenkai; k++; } }//Qまで
tyokusin; int m=0;
while( m<4 ){ if(SENSOR_2 > 50){ migisenkai; } else if(SENSOR_2 > 45 ){ usetu; } else if(SENSOR_2 > 35 ){ sasetu; } else if(SENSOR_2 > 30 ){ hidarisenkai; m++; } }//Rまで
tyokusin; int s=0;
while( s < 5 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; s++; } }//Tまで
PlaySound(SOUND_DOWN); tyokusin; int a=0;
while( a < 7 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; a++; } }//一周してT
PlaySound(SOUND_DOWN); tyokusin; int b=0;
while( b < 10 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; b++; } }//Hまで PlaySound(SOUND_UP); tyokkakumigi; int c=0;
while( c < 65 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; c++; } }//Gまで
PlaySound(SOUND_UP); tyokkakumigi; int d=0;
while( d < 3 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; d++; } }//Sまで
PlaySound(SOUND_DOWN); Off(OUT_AC);Wait(100); tyokkakuhidari; int e=0;
while( e<5 ){ if(SENSOR_2 > 50){ migisenkai; } else if(SENSOR_2 > 45 ){ usetu; } else if(SENSOR_2 > 35 ){ sasetu; } else if(SENSOR_2 > 30 ){ hidarisenkai; e++; } }//Pまで
PlaySound(SOUND_UP); tyokusin; int f=0;
while( f<4 ){ if(SENSOR_2 > 50){ migisenkai; } else if(SENSOR_2 > 45 ){ usetu; } else if(SENSOR_2 > 35 ){ sasetu; } else if(SENSOR_2 > 30 ){ hidarisenkai; f++; } }//Qまで
PlaySound(SOUND_UP); tyokusin; int g=0;
while( g < 5 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; g++; } }//Fまで
PlaySound(SOUND_UP); tyokkakumigi; int h=0;
while( h < 12 ){ if(SENSOR_2 > 50){ hidarisenkai; } else if(SENSOR_2 > 45 ){ sasetu; } else if(SENSOR_2 > 40 ){ usetu; } else if(SENSOR_2 > 30 ){ migisenkai; h++; } }//ゴール
Off(OUT_AC); PlaySound(SOUND_DOWN); }
安定してコースを一周することができた。だが、プログラムがだいぶおもくなってしまった。 線に沿って進むwhileの条件数値が似ているところはsubでまとめてプログラムを軽くすべきだった。
ロボットについては光センサーの位置を低くすることで光センサーの値の誤差を少なくすることができた。また、タイヤを二つにし、タイヤ間の距離を短くしたことで小回りの効きうまく曲がることができた。
最初は全然わからなくて線に沿って進むことすらできなかった。だが、試行錯誤し、少しずつ進むようになっていくとうれしく大変だったが楽しく作業ができた。プログラミングも楽しかったがやはり自分には、ロボットを作るために試行錯誤している方が向いていると思った。