[[2015b/MemberOnly]] 目次 #Contents *今回の目標 [#p845da84] 交差点を認識するライントレースロボットをプログラミングし、何番目の交差点かによって動作を変えるロボットをつくる。 *ロボットの構造について [#tfa68c06] &ref(./robo 1.jpg,20%,ロボット前頭部); これはロボット前頭部の写真である。なるべく小回りがきくように、タイヤはバッテリーぎりぎりにはめることにした。 &ref(./robo 2.jpg,20%,右側面); 後ろに小さなタイヤを付けることによってスムーズな走行を可能にしている。 &ref(./robo 3.jpg,20%,前頭部アップ); 反応が鈍く正確でなくなってしまうので、最大限床に近づける形で距離を縮めより正確な測定ができるように改造した。 *コースについて [#s78e1331] **走行順路 [#ga321ee9] #ref(./コース説明2.png,1%.道順) コースはこのようになっていて、赤(交差点を直進)→黄(交差点を右折)→青(交差点を左折)の順番で進んでいく。 **苦労した部分 [#m14a491d] #ref(./コース2.jpg,40%,苦労したところ) 苦労した点は主に二か所あった。 一つ目(緑色のところ)は半径の小さいカーブになっていて、白黒の境界線をきちんと走らせないと交差点認識をしてしまった所が難しかった。 二つ目(ピンクのところ)は、交差点に差し掛かる前の道が少し曲がっているため、早めに交差点を認識してしまい曲がり切れないことが多かった。直角に交わっている交差点を曲がるときとの微調整にとても苦労した。 *プログラムについて [#c633c72e] プログラムは大きく分けて、ライン境界線をすすんでいる時と、交差点に差し掛かった時の二つでできている。 **使用した定義 [#ba56951f] #define straight OnFwd(OUT_BC,30); #define turn_left OnFwd(OUT_B,30);Off(OUT_C); #define turn_right OnFwd(OUT_C,30);Off(OUT_B); #define TURN_LEFT OnFwd(OUT_B,30);OnRev(OUT_C,30); #define TURN_RIGHT OnFwd(OUT_C,30);OnRev(OUT_B,30); #define THRESHOLD 42 #define TMAX 158 #define straight OnFwd(OUT_BC,30); #define turn_left OnFwd(OUT_B,30);Off(OUT_C); #define turn_right OnFwd(OUT_C,30);Off(OUT_B); #define TURN_LEFT OnFwd(OUT_B,30);OnRev(OUT_C,30); #define TURN_RIGHT OnFwd(OUT_C,30);OnRev(OUT_B,30); #define THRESHOLD 42 #define TMAX 158 SetSensorLight(S3); SetSensorLight(S3); long t0=CurrentTick(); int kousaten=0; **ライン上の走行 [#v6094b36] まず黒い線の周囲の明るさをセンサーではかり、しきい値を決定する。 #ref(./black.jpg,50%,ライン上の明るさ) そのあと、±の範囲を調整することによって線上で五段階の明るさを認知するようにする。暗い順に左旋回→左折→直進→右折→右旋回を行うようにした。 while(CurrentTick()-t0<TMAX){ if(SENSOR_3<THRESHOLD-12){ TURN_LEFT; } else { if(SENSOR_3<THRESHOLD-7){ turn_left; }else if(SENSOR_3<THRESHOLD+7){ straight; }else if(SENSOR_3<THRESHOLD+12){ turn_right; }else{ TURN_RIGHT; } t0=CurrentTick(); **交差点について [#vb8b4087] 上記の五段階認識のうち「もっとも黒い」時が一定期間()続いたときに交差点と認識するようにした。 Off(OUT_BC); Wait(1000); TURN_RIGHT; Wait(300); t0=CurrentTick(); kousaten++; 交差点に対して、「右折する」「左折する」「直進する」の三パターンの動作をしなくてはならないので、カウンターで何回交差点動作をしたかを数えてそれぞれの交差点に見合った行動をするようにプログラミングした。 ***交差点を直進するとき [#j760474f] if(kousaten<=2){ if(kousaten<=2){ TURN_LEFT; Wait(400); t0=CurrentTick(); ***交差点を右折するとき [#d77d958c] }else if(kousaten<=4){ }else if(kousaten<=4){ TURN_RIGHT; Wait(300); t0=CurrentTick() ***交差点を左折するとき [#i1844d0e] }else{ }else{ TURN_LEFT; Wait(1000); t0=CurrentTick(); *最後に [#wca7af2f] **改善した点 [#b6677b02] 最初、旋回動作の際のモーターの出力比を1:2にしていたが、どうしても直角や旋回ができないため1:1に変更したところうまく小回りできるようになった。 それぞれの交差点を曲がるときに、それにあった動作をしなくてはならないのが難しく、カウンターを使えば可能になるということに気づくのに少し時間がかかってしまった。 また、プログラムをまとめることによって簡略化に成功した。 **感想 [#abc12394] 前回の書道ロボットのように1パターンの動きをするのではなくカウンターを使うことによって動作を分けることが新しい挑戦であった。今回のプログラムでカウンターの使い方を学習したのでもっとたくさんのパターンや選択肢のあるプログラミングにもチャレンジしてみたい。