[[2016a/Member]] 目次 #contents *はじめに [#n3636552] &ref(2016a-mission2.png); 課題は上に示したコースをライントレースするロボットを製作することである。 今回は A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点 の道のりでロボットを動かした。 *ロボットの説明 [#rf66a08c] &ref(image1.JPG); &ref(image2.JPG); ロボットの前方に光センサーを取り付けた。~ 両前輪と等距離の位置にセンサーがあるので、動きやすい構造になっている。 *プログラムについて [#q3188f88] **交差点の判断 [#bd9c9500] 交差点は次のような方法で判別した。 定義した「nMAX」を利用し、光センサーが連続で黒を認識した回数に制限を付けることで交差点と判断する。 [1]黒を認識した回数が最大値250以上の時 そこを交差点と判断して、別の動作に切り替える。 [2]黒を認識した回数が最大値250以下の時に白を計測したとき 交差点ではないと判断して、プログラムに従ってライントレースを行う **メインプログラム [#f21586e9] task main() { SetSensorLight(S1); line_follow(); cross_straight(); line_follow(); cross_straight(); line_follow(); cross_straight(); line_follow(); cross_turn_left(); left_spin; trace_end(); } 通常のライントレース用と交差点用のプログラムの組み合わせから成っている。走行は常に黒線の左境界線を走るようにした。 **定義とサブルーチンの説明 [#lc7a5c6e] #define THRESHOLD 45 //光センサーの基準値 #define SPEED 50 #define go_forward OnFwd(OUT_BC,SPEED); #define turn_left OnFwd(OUT_A,SPEED); Off(OUT_C); //左折 #define left_spin OnFwd(OUT_A,70); OnRev(OUT_C,60); //左旋回 #define turn_right Off(OUT_B); OnFwd(OUT_C,SPEED); //右折 #define right_spin OnRev(OUT_A,70); OnFwd(OUT_C,60); //右旋回 #define nMAX 250 //光センサーが黒であると判断したカウンターの最大値。この値を超えると交差点と判断している。 #define short_break Off(OUT_AC);Wait(2000); //機体の小休止 void line_follow() { int nOnline=0; //カウンターを定義する。続けて黒になった回数をカウントしていく。 while(nOnline<nMAX) //黒を続けてnMAX回繰り返さなければライントレースをする { if(SENSOR_1<THRESHOLD-15) //白の部分 { turn_right; nOnline++; //カウンターを増やす、交差点認識 } else { if(SENSOR_1<THRESHOLD+10) //やや黒の部分 { go_forward; } else if(SENSOR_1<THRESHOLD+20) //黒の部分 { turn_left; nOnline=0; //カウンターをリセット } } } } 通常のライントレースをするときのプログラムである。カウンターを導入することで交差点判別も出来るようにした。~ 白と認識すれば右折、中間付近で直進、黒と認識すれば左折し、交差点と判断すると次のサブルーチンに移行するようにしている。 void cross_straight() { short_break; PlaySound(SOUND_UP); //交差点と判断した合図 right_spin; //交差点を判断した時点で機体は左を向いてるため go_forward; Wait(2000); //直進して交差点を通過 Off(OUT_AC); } 交差点を直進するときのプログラムである。 交差点を認識した後、右旋回→直進で黒線まで辿り着かせることで、交差点を直進している。 void cross_turn_left() { short_break; PlaySound(SOUND_UP); //交差点と判断した合図 while(SENSOR_1<THRESHOLD){ while(SENSOR_1<THRESHOLD) { go_forward; //境界線に戻る } } 交差点を左折するときのプログラムである。~ なお、交差点と判断したときは機体が左に傾いているものとしている。 void trace_end() { right_spin; //右に旋回してゴール内に入りやすくするため go_forward; //ゴール内に入る Wait(1000); Off(OUT_AC); PlaySound(SOUND_DOUBLE_BEEP); //終了の合図 } ライントレースを終了するときのプログラムである。 メインプログラムに統一性を持たせるため、単純なプログラムであるがサブルーチン化して一纏めにした。 *感想と反省 [#tf8a7616] ・最初はライントレースの仕方やプログラムの意味すら分からなかったが、相方に教えてもらいながらなんとか理解できたので良かった。 ・プログラミングに時間をかけすぎて実走行にあまり時間をかけられなかった。次からはもっと早めにプログラミングを終わらせたい。 ・メインプログラムに同じサブルーチンが繰り返されている部分があるので、repeatを使って簡潔にまとめようと思ったが、上手くいかなかった。 ・次回は2つのロボット間で通信するものなので、大人数で協力しながら頑張っていきたい。