[[2016a/Member]] 目次 #contents *はじめに [#o5c11742] 今回の課題は、黒い線にそって動くロボットを作成することである。 ただし、なるべく速く正確に動くように工夫し、交差点では1秒間停止しなくてはならない。 *ロボットの説明 [#cc5f4722] 前方に車輪をつけ、後方の車輪は取った。 このことでカーブを曲がる際に、小回りがきくようになった。 車輪のかわりとして高さを前後で同じになるように調節し、摩擦を減らすための部品を取り付けた。 光センサーは前方中央につけている。 #ref(./02.JPG,10%) #ref(./01.JPG,10%) *交差点認識の仕方 [#y8e2ffa2] ライントレースは、白かったら右折し、黒かったら左折するようにしている。 タイマーの時間が20より小さかったらライントレースを続けて、それより大きくなったら交差点にさしかかったとして停止させた。 *プログラミングの説明 [#x90cf611] #define BLACK 35 #define B_GLAY 37 #define W_GLAY 43 #define WHITE 45 #define HIPOWER 7 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L;\ OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 set_power_L;\ OnFwd(OUT_C); Off(OUT_A); #define turn_right0 set_power_L;\ OnFwd(OUT_A); Off(OUT_C); #define turn_right1 set_power_L;\ OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define TIMERTIME 20 交差点を認識して停止する sub crossing_stop() { ClearTimer(0); //タイマーの初期化 while (FastTimer(0) <=TIMERTIME) { if (SENSOR_2 < BLACK) { //黒 turn_left1; //左折 } else if (SENSOR_2 < B_GLAY) { //黒っぽい turn_left0;ClearTimer(0); //右折、タイマーの初期化 } else if (SENSOR_2 < W_GLAY) { //白っぽい go_forward;ClearTimer(0); //直進、タイマーの初期化 }else { turn_right1;ClearTimer(0); //右折、タイマーの初期化 } Wait(STEP); } Off(OUT_AC); Wait(100); //1秒間停止 } sub crossing_stop2() { ClearTimer(0); //タイマーの初期化 ClearTimer(1); while (FastTimer(1) <=600) { if (SENSOR_2 < BLACK) { //黒 turn_left1; //左折 } else if (SENSOR_2 < B_GLAY) { //黒っぽい turn_left0; //左折 } else if (SENSOR_2 < W_GLAY) { //白っぽい go_forward; //直進 }else { turn_right1; //右折 } Wait(STEP); } Off(OUT_AC); Wait(100); //1秒間停止 } 交差点認識後に直進 sub crossing_fwd() { go_forward; Wait(80); } 交差点認識後に右折 sub crossing_right() { go_forward; Wait(50); turn_right1; Wait(70); } task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); go_forward; crossing_stop(); crossing_right(); crossing_stop2(); crossing_stop(); crossing_fwd(); crossing_stop(); crossing_fwd(); crossing_stop(); crossing_right(); crossing_stop(); crossing_right(); crossing_stop(); go_forward; Wait(100); Off(OUT_AC); } *感想・考察 [#w68636b9] 今回は地道に角度や時間を計測していくという作業が少なかった分、前回よりかは手を付けやすいように感じられた。 カーブを曲がる際に大きく回転してしまうことが課題であった。 大きめのカーブだけ時間を計測して動かせた。 次回は無駄な動きのないようにしたい。