目次
交差点を認識するライントレースロボットをプログラミングし、何番目の交差点かによって動作を変えるロボットをつくる。
これはロボット前頭部の写真である。なるべく小回りがきくように、タイヤはバッテリーぎりぎりにはめることにした。
後ろに小さなタイヤを付けることによってスムーズな走行を可能にしている。
反応が鈍く正確でなくなってしまうので、最大限床に近づける形で距離を縮めより正確な測定ができるように改造した。
コースはこのようになっていて、赤(交差点を直進)→黄(交差点を右折)→青(交差点を左折)の順番で進んでいく。
苦労した点は主に二か所あった。
一つ目(緑色のところ)は半径の小さいカーブになっていて、白黒の境界線をきちんと走らせないと交差点認識をしてしまった所が難しかった。
二つ目(ピンクのところ)は、交差点に差し掛かる前の道が少し曲がっているため、早めに交差点を認識してしまい曲がり切れないことが多かった。直角に交わっている交差点を曲がるときとの微調整にとても苦労した。
プログラムは大きく分けて、ライン境界線をすすんでいる時と、交差点に差し掛かった時の二つでできている。
#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); long t0=CurrentTick(); int kousaten=0;
まず黒い線の周囲の明るさをセンサーではかり、しきい値を決定する。
そのあと、±の範囲を調整することによって線上で五段階の明るさを認知するようにする。暗い順に左旋回→左折→直進→右折→右旋回を行うようにした。
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();
上記の五段階認識のうち「もっとも黒い」時が一定期間()続いたときに交差点と認識するようにした。
Off(OUT_BC); Wait(1000); TURN_RIGHT; Wait(300); t0=CurrentTick(); kousaten++;
交差点に対して、「右折する」「左折する」「直進する」の三パターンの動作をしなくてはならないので、カウンターで何回交差点動作をしたかを数えてそれぞれの交差点に見合った行動をするようにプログラミングした。
if(kousaten<=2){ TURN_LEFT; Wait(400); t0=CurrentTick();
}else if(kousaten<=4){ TURN_RIGHT; Wait(300); t0=CurrentTick()
}else{ TURN_LEFT; Wait(1000); t0=CurrentTick();
最初、旋回動作の際のモーターの出力比を1:2にしていたが、どうしても直角や旋回ができないため1:1に変更したところうまく小回りできるようになった。 それぞれの交差点を曲がるときに、それにあった動作をしなくてはならないのが難しく、カウンターを使えば可能になるということに気づくのに少し時間がかかってしまった。
また、プログラムをまとめることによって簡略化に成功した。
前回の書道ロボットのように1パターンの動きをするのではなくカウンターを使うことによって動作を分けることが新しい挑戦であった。今回のプログラムでカウンターの使い方を学習したのでもっとたくさんのパターンや選択肢のあるプログラミングにもチャレンジしてみたい。