*ライントレーサーの製作 [#gddc2aa3] ''目次'' #contents **はじめに [#va189ab3] やあ、皆さんこんにちは。私です。この間の似顔絵ロボットのページでも述べていたように今回もまた新たなロボット製作の課題が出たので、それについてこのページで紹介していこうと思います。今回の課題は題名にもあるとおり「ライントレーサー」!!かっこつけてみたものの、要は紙の上に描かれた黒線をなぞるように進むロボットですね。ハイ。まあ茶番はこれくらいにして前回同様ルールから順に紹介していきましょう! ~''ルール'' -コースには出入口を4ヶ所、ヘアピンカーブ、直角カーブを1ヶ所以上、交差点を2ヶ所以上設けること -4つの入口のどこかからコースに入り、1周半以上コースを走り、出口から出ること ~今回のルールはこんなところです。意外に単純なルールですが、今回はプログラムに結構苦労しました。その反面、ロボットは結構簡単にできました。(前回とは真逆ですねwww)では前回同様ロボットのほうを紹介していきましょう! **制作したロボット、プログラム [#ef2b121e] ***ロボットの構造 [#kfa89e45] ~&ref(120611_171225.jpg); &ref(120611_171411.jpg); ~左上の写真はロボットを斜め上から見たもので、右上の写真は真下から見たものです。相変わらずロボットがごついなあwww。でも、前回の似顔絵ロボットの反省から、なるべく無駄な部品はなくし、見た目ほど機体は重くなっていません。ロボットの重心も動力源のモーターにかかるようにしました。 ~&ref(120611_171333.jpg); ~上の写真中のSensor_Lightと書かれている2つの青い部品が光センサで、この間に黒線が通ることでライントレースをします。 ~&ref(SENSOR_R.gif); ~上のアニメーションはライントレースの原理を示したものです。アニメーションのほうは、構造がほとんど同じだったので「[[2011b/A1/課題2左:http://yakushi.shinshu-u.ac.jp/robotics/?2011b%2FA1%2F%B2%DD%C2%EA%A3%B2%BA%B8]]」さんからお借りしました。そちらの方もぜひご覧ください。 ~上にあるアニメーションにあるように、右側のセンサが黒線の上に来たらロボットは右旋回し、左側のセンサが黒線の上に来たら左旋回し、黒線が両センサの間にあるときは直進する。これが基本的な原理ですね。光センサを2つ使っているグループはどこもこの原理だと思います。あとはプログラムに一工夫加えてヘアピンカーブや交差点を通れるようにします。 ***プログラム [#u00b7f00] 今回走るコースは下の写真の通りです。 ~&ref(120615_175239.jpg); ~それぞれの出入口には(1)〜(4)の番号が振ってあります。今回は、(1){赤い矢印}からコースに入り、時計回りに1周半走り、(4){青い矢印}からコースを抜けるプログラムを作りました。 #define BRIHGTNESS 45 #define go_straight OnFwd(OUT_A+OUT_C); //直進 #define turn_left OnFwd(OUT_C);Off(OUT_A); //左旋回 #define turn_right OnFwd(OUT_A);Off(OUT_C); //右旋回 int cross = 0; //交差点をまたいだ回数をカウントする関数 sub turn90() { OnFwd(OUT_A);OnRev(OUT_C);Wait(60); } sub hairpin() { SetPower(OUTAC,3); if(SENSOR_1 < BRIGHTNESS) {turn_left;} //左側のセンサーが黒になったら左に曲がる if(SENSOR_3 < BRIGHTNESS) {turn_right;} //右側のセンサーが黒になったら右に曲が る else {go_straight;}//交差点は直進し } sub trace_line() { if(SENSOR_1 < BRIGHTNESS && ) {turn_left;} //左側のセンサーが黒になったら左に曲がる if(SENSOR_3 < BRIGHTNESS) {turn_right;} //右側のセンサーが黒になったら右に曲がる if(SENSOR_1 < BRIGHTNESS && SENSOR_3 < BRIGHTNESS) {go_straight;cross=cross+;}//交差点は直進し if(SENSOR_1 < BRIGHTNESS && SENSOR_3 < BRIGHTNESS) {go_straight;cross=cross+;}//交差点は直進し else {go_straight;} } } task main() { SetPower(OUT_AC,5); SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); go_straight(); until(SENSOR_1 < BRIGHTNESS && SENSOR_3 < BRIGHTNESS); turn_left(); until(SENSOR_3 > BRIGHTNESS);//サーキットに侵入する while(croos!=2){trace_line();}; ClearTimer(0); while(FastTimer(0) < 100){trace_line();}; turn90(); while(SENSOR_1 < BRIGHTNESS) {trace_line();}; go_straight();Wait(50); int cross = 0; while(cross!=1) {trace_line();}; while(SENSOR_3 BRIGHTNESS) {trace_line();}; go_straight();Wait(30); int cross = 0; while(cross!=1) {trace_line();}; ClearTimer(0); while(FastTimer(0) < 500) {trace_line();}; } ***工夫した点、頑張った点 [#p3a19b54] 今回の課題では、やはりロボット本体よりもプログラムのほうに重点が置かれました。ですから、プログラムに色々と工夫を施しました。一番大変だったのは、どうやって交差点を通り過ぎたり、コースから出入口に抜けるタイミングを認識させるかということです。このライントレースの原理をそのまま適用してしまうと、交差点を通ることができなかったり、4つの出入口付近でロボットがコースと出入口の2つのラインを認識してしまい、予想外の動きをしてしまいます。ここで活躍するのがタイマーというものです。私の場合、まずある点から交差点をいくつ通り過ぎたかをカウントし、そのカウントした数があらかじめ決めておいた数になるまで普通にライントレースをさせます。(交差点の通過は、センサが2つとも黒線上にあるという条件をつけることで解消しました)その決められた交差点数を過ぎてから最も近い出入口に到達するまでの時間をを測り、その時間まではまた普通にライントレースをさせ、出入口付近に到達したら、出入口を通り過ぎるまでロボットを直進させるという方法をとりました。少々強引ですが、ただ単にタイマーを使うだけのものよりはトラブルや認識の誤りが少なくなります。 **まとめ [#va199284] 実は今回のロボット制作では、プログラム作りに時間がかかったのと、ちょっとしたトラブルであまり実際に動かすことができませんでした。ですから、今回の課題はとても成功とはいえない結果でしたorz。ですが、前回の似顔絵ロボっトの課題も含め、これまではあくまで練習!本番は、次にあるロボコンです。今少しずつロボコン用のロボットを製作していますが、これがまたホントに一苦労しそうなのです(泣)。でも精一杯頑張るので、よかったら次のロボコンの記事も温かい目で見てやってください。それではまたお会いしましょう!