『2013b/Member/ニックネーム/Mission1』 *ロボットの紹介 [#c17bbfd1] ライントレーサー。紙の上に書かれた黒い線を自動でたどってゆくロボットです。 ~四輪モデルでは半径が1.5cmのカーブがスムーズに曲がり切れなかったため、小回りの利く三輪のモデルに改良しました。 ~#ref{robotics3.jpg}; 前の二つのタイヤはそれぞれ独立したモーターで動かし、前輪どうしを結んだ線の中点を軸として回転します。回転軸とセンサーライトまでの距離が短いためセンサーが大きく左右にふられて線を見失ってしまう事が少なくなりました。後輪はロボット全体を支えるための補助となっています。 *プログラム [#x2919ef6] 決められたコースを一周するプログラムです。 -定義文 動作の定義 #define turn_left OnFwd(OUT_C);Off(OUT_A);// 左回り #define turn_right OnFwd(OUT_A);Off(OUT_C);// 右回り 普通の回転では曲がるほうのタイヤを止め #define go OnFwd(OUT_AC);// 直進 小回りでは両タイヤを逆回転させています。 #define tu_le OnFwd(OUT_C);OnRev(OUT_A);// 左小回り #define tu_ri OnFwd(OUT_A);OnRev(OUT_C);// 右小回り #define black 38 // #define white 46 // #define conr_1 700 ]-| それぞれの交差点手前になるまでの #define conr_2 520 | 時間を定義してあります #define conr_3 109 | #define conr_4 400 ]-| 交差点近くになるまでの時間は、ライントレースで急なカーブを曲がったりするとき、交差点と判断してしまうため測りました。この時間条件をif文に入れることで交差点付近でのみ conrringのプログラムが動きます。 &ref{無題 1.gif}; -サブルーチン sub conrring() {PlaySound(SOUND_DOWN); SetPower(OUT_AC,5); tu_le; Wait(20); Off(OUT_AC); go; Wait(20); ClearTimer(0);} ライントレースをするプログラムです task main() { int counts; counts=0; int order; order=0; ・・・・・・交差点ごとに特定のプログラムだけが動くのに使います SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(true) { if ((conr_times>2)&&(FastTimer(0)>conr_4)&&(order==3)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_1)) {conrring;order++;} else if (SENSOR_1>white+1){tu_le;conr_times--;} ]-| ノーマルトレース else if(SENSOR_1<black-1){tu_ri;conr_times++;} | 線の縁をたどって else if(SENSOR_1>=white){turn_left;conr_times--;} | 行きます else if(SENSOR_1<=black){turn_right;conr_times++;} | else {go;} ]-| } } プログラムの説明 -交差点で特定の動きをさせるプログラムの作り方が思いつかなかったのですべての動作をif文に入れて()内の条件を厳しくすることで交差点でのみ特定の動きをするようにした。 -プログラムは上から順に動いていくためif文では個々の条件の順序を考える必要があったが変数orderを入れることで他のプログラムが動かないようにした。 交差点判断一回目。交差点で黒だった回数(conr_times)が2回以上で,且つ 交差点に接近するまでは条件外で動きません。 ((conr_times>2)&&(FastTimer(0)>conr_1)) {conrring;order++;} 交差点を一回渡ったことで初めてorderが1増え二回目の交差点判断の プログラムしか動きません。 ((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1)) {conrring;order++;} 三回目ーーー。 ((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2)) {conrring;order++;} 四回目ーーー。 ((conr_times>2)&&((FastTimer(0)>conr_4)&&(order==3)) {conrring;order++;} *課題 [#m06816f8] 確実に交差点を渡るため4つのプログラムを用意。しかし交差点を渡るプログラムは、交差点に近づくまでの時間が違うだけでほとんど同じプログラム‥。プログラムが見にくく、長くなる原因となった。一つのプログラムで多くの場合に対応できるようにしたい。 *感想 [#mafe0526] 今回のライントレースでは交差点を超えて一周することが出来なかった。問題としてthresholdの値がうまく決まらず一番初めの直角が曲がれなかった事が大きかった。交差点への侵入角度によってあらぬ方向へ行く事もあった。今度からは確実性も高めていきたい。 はじめに説明書に書いてあるとうりに作った四輪のロボットでは、二つ目の交差点を横切るところまではうまくいったが、ロボットを二輪に改良してからセンサーライトの感受性が変わり一番初めの直角が曲がれなくなった。一時は自分の影でセンサーライトの値が変わっていることに気づかずプログラムを書き換えてしまい無駄な時間を使ってしまった。