[[2016a/Member]] #contents *&size(45){ロボティクス入門ゼミ 課題2}; [#n4a4ddb7] *課題の説明 [#e4766088] #ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMission2&openfile=2016a-mission2.png) ~幅2cmの黒い線をなぞります。今回はB地点からC地点までのコースに挑戦しました。 *概要 [#i0e2b99f] 黒の線をライントレースします。光センサーを使って白と黒を認識させ、プログラム通りに動かします。~ 主にこのプログラムは交差点を認識させるのがミソになっていると思います。~ やり方は大きく2つあり、時間を測ってやるやり方と、回数を測ってやるやり方です。~ #ref(ro1.jpg) 逆さになってしまいましたが、、、、 #ref(ro2.jpg) *プログラム [#p16c59f2] -定義 #define THRESHOLD 45 #define go_forward OnFwd(OUT_AC); #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 OnFwd(OUT_C); Off(OUT_A); #define turn_right0 OnFwd(OUT_A); Off(OUT_C); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define STEP1 -交差点の判別 -交差点の判別~ subを使っての交差点判断は大きく分けて、時間による判断と回数による判断があります。~ 自分は回数で定義しました。~ 左右それぞれに大きく旋回する場合と、小さく旋回する場合とでライントレースする線の明るさ~ によって区別されています。今回は10回未満の場合としました。~ 定義した明るさに対して右折の場合、左折の場合でそれぞれ回数が足されていき、定義された数~ までいくとそれぞれのほうに曲がります。~ -前進するサブルーチン sub cross_fwd() { SetSensor(SENSOR_2,SENSOR_LIGHT); { if (SENSOR_2 < THRESHOLD -8) { turn_left1; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; } } Off(OUT_AC); Wait(100); go_forward; } -交差点で右折するサブルーチン sub cross_right() { SetSensor(SENSOR_2,SENSOR_LIGHT); int n=0; while (n<10) { if (SENSOR_2 < THRESHOLD -8) { turn_left1; n=0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; n=0; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; n++; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; n++; } } Off(OUT_AC); Wait(100); turn_right1; } -交差点で左折するサブルーチン sub cross_left() { SetSensor(SENSOR_2,SENSOR_LIGHT); int n=0; while (n<10) { if (SENSOR_2 < THRESHOLD -8) { turn_left1; n++; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; n++; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; n=0; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; n=0; } } Off(OUT_AC); Wait(100); turn_left1; } -最終的に止まるサブルーチン sub cross_stop() { SetSensor(SENSOR_2,SENSOR_LIGHT); { if (SENSOR_2 < THRESHOLD -8) { turn_left1; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; } } Off(OUT_AC); } -時間を決めてライントレースするインライン関数 void line_follow(int t) { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while (Timer(0)<t) { if (SENSOR_2<THRESHOLD -8){turn_left1;} else if (SENSOR_2<THRESHOLD -3){turn_left0;} else if (SENSOR_2<THRESHOLD +3){turn_right1;} else if (SENSOR_2<THRESHOLD +8){turn_right0;} Wait(100); } Off(OUT_AC); } -本文 task main() { line_follow(30); //BからRまで cross_right(); //R line_follow(800); //RからQ cross_fwd(); //Q line_follow(150); //QからQ cross_fwd(); //Q line_follow(800); //QからP cross_right(); //P line_follow(800); //PからSまで cross_right(); //S line_follow(400); //SからCまで cross_stop(); //停止 } *感想 [#zbd84d32] 交差点を認識させるのが難しく、思ったとおりに動いてくれないのが残念でした。~ 時間をかけて作ったつもりですが、毎回やるたびに違うタイミングでコースを走るので、~ 時間を指定したりする時、とても苦労しました。~ 最終的にちゃんと動いてくれなかったのですが、友達に教えてもらったりして、~ ある程度の形ではプログラムを作ることが出来ました。~ 小さい頃遊んだ自分にとって親しみ深いレゴにこんなに苦戦するとは思っても見ませんでした。~ いろいろ失敗して、原因も自分でわかったものもありますが、ほとんど周りの人に教えて~ もらって作りました。チームの友達や周りで助けてくれた人にはとても感謝しています。~