*課題内容 [#k9ecb6da] 課題は線に沿って進むロボットを作成し下図のコースに沿って走行させること。 #ref(2016a-mission2.png) 黒線は幅2cm 今回はB地点からC地点、までB→R→Q→Q(環状部分を一周)→P→S→Cの順に走るコースを選んだ。 *機体について [#h9838ab3] センサについては光センサを使用する。 今回は課題内容上ハード関係については殆ど工夫の仕様がないので写真の様な機体、説明書そのままのものを作成した。 ・上から見たもの #ref(s_DSC_1463.JPG) ・横から見たもの #ref(s_DSC_1464.JPG) *プログラムについて [#b3ac0d72] **定義内容 [#b6c161b5] #define RAIGHT_ANGLE 600 //機体が直角にまがる角度 #define THRESHOLD 45 //光センサの基準値。シード値は30付近で黒、70付近で白となるため中間付近の45を基準として和と差で書くようにした。 #define SPEED 50 #define go_stright OnFwd(OUT_AC,SPEED); #define cros_line OnFwd(OUT_AC,SPEED); Wait(1000); Off(OUT_AC); #define turn_right OnFwd(OUT_C,SPEED); #define turn_left OnFwd(OUT_A,SPEED); #define right_senkai OnRev(OUT_A,70); OnFwd(OUT_C,60); Wait(2000); #define left_senkai OnFwd(OUT_A,70); OnRev(OUT_C,60); Wait(2000); #define nMAX 400 //カウンタの最大値。光センサが黒であると判断したときをカウントし、それが最大値を超えたときを交差点であると判断するため。 #define short_break Off(OUT_AC); Wait(2000); 基本的に直訳かローマ字読み。 一部使ってないものもあるが、コース次第で使う可能性があるのであえて残してある。 task main() { SetSensorLight(S1); repeat(2){ line_follow(); clos_stright(); } repeat(2){ line_follow(); clos_turn_R(); } line_follow(); tres_end(); } メインのプログラム部分。 通常のライントレース用と交差点用のサブルーチンを作り、基本的にはその組み合わせである。 通常のライントレース用と交差点用のサブルーチンを作り、基本的にはその組み合わせでゴールまで進む。 走行は常に線の右境界線を通るように設定した。これにより交差点通過用サブルーチンが二つ(場合によっては三つ)になった。しかし、その分管理やメインプログラムの構築が楽になっている。 因みにスペルミスはこちらの英語力の問題なのである。 sub tres_end() { left_senkai; go_stright; Wait(1000); Off(OUT_AC); PlaySound(SOUND_DOUBLE_BEEP); } 終点用サブルーチン。 終点地点手前ではロボットは交差点と判断してしまうため作成した。 **通常ライントレース用 [#ha08d347] sub line_follow() { int nOnline=0; while(nOnline<nMAX){ int nOnline=0; //カウンタを定義 while(nOnline<nMAX){ if(SENSOR_1<THRESHOLD-15){ turn_right; nOnline++; turn_right; //黒の時右折 nOnline++; //1回カウント else{ if(SENSOR_1<THRESHOLD+10){ go_stright; go_stright; //中間のとき前進 } else{ while(SENSOR_1<THRESHOLD+20){ turn_left; nOnline=0; turn_left; //白の時左折 nOnline=0; //カウンタをリセット } } } } } 上で述べたように右境界線を走るためのもの。これで右急旋回以外のコースは走れる。また式中にカウンタを入れることで交差点判別も出来るようにした。 黒で右折、中間付近で直進、白で左折し、交差点と判断するとこのサブルーチンは終了する。 上で述べたように右境界線を走るためのもの。これで右急旋回以外のコースは走れる。また式中にカウンタを入れることで交差点判別も出来るようにした。急旋回のコースは交差点と区別出来ないため。ただし、試してはいないが右境界線をはしるため左折の急旋回は出来る可能性がある。これは左折の急旋回では機体が白と判断する回数が増え、黒と判断する回数は減ると予想出来るからである。もしこれができるのであれば急旋回の前に走る境界線を左右変えることで急旋回も走れると言えるようになるであろう。 交差点と判断するとこのサブルーチンは終了する。 交差点の判断はセンサが黒と連続で判断した回数が、下記の定義部分における「nMax」の回数を超える場合を交差点である、と判断する ようにした。 **交差点用 [#xca5bb79] sub clos_stright() { short_break; PlaySound(SOUND_UP); left_senkai; PlaySound(SOUND_UP); //交差点と判断した合図 left_senkai; //右境界線を走るため機体は交差点と判断した時点で右を向いてるため。(この事も踏まえてnMAX値は少し多めにしてある) go_stright; Wait(1000); Wait(1000); //直進して交差点を通過 Off(OUT_AC); } 交差点を直進するサブルーチン。 sub clos_turn_R() { short_break; PlaySound(SOUND_UP); PlaySound(SOUND_UP); //交差点と判断した合図 while(SENSOR_1<THRESHOLD){ go_stright; go_stright; //交差点内で機体は右を向いているため中間付近になるまで直進し境界線にもどる。 } } 交差点を右折するためのサブルーチン。 交差点と判断した時点である程度右に機体が向いてると判断して作成した。 **定義内容 [#b6c161b5] #define RAIGHT_ANGLE 600 //直角 #define THRESHOLD 45 #define SPEED 50 #define go_stright OnFwd(OUT_AC,SPEED); #define cros_line OnFwd(OUT_AC,SPEED); Wait(1000); Off(OUT_AC); #define turn_right OnFwd(OUT_C,SPEED); #define turn_left OnFwd(OUT_A,SPEED); #define right_senkai OnRev(OUT_A,70); OnFwd(OUT_C,60); Wait(2000); #define left_senkai OnFwd(OUT_A,70); OnRev(OUT_C,60); Wait(2000); #define nMAX 400 #define short_break Off(OUT_AC); Wait(2000); sub tres_end() { left_senkai; //終点はロボットから見て交差点の形なため、左旋回で立て直し go_stright; //ゴール内にはいる Wait(1000); Off(OUT_AC); PlaySound(SOUND_DOUBLE_BEEP); //終了の音声 } 基本的に直訳かローマ字読み。 一部使ってないものもあるが、コース次第で使う可能性があるのであえて残してある。 終点用サブルーチン。 終点地点手前ではロボットは交差点と判断してしまうため作成した。 *感想と反省 [#m55a00ac] 最初は交差点のプログラムがどういうことを意味してるのかが全く分からず苦労した。それと今回はハード関係が全く工夫できなかったのが残念である。 反省点は検証(実走行)があんまり出来なかったこと。