- 追加された行はこの色です。
- 削除された行はこの色です。
『2013b/Member/ニックネーム/Mission1』
*ロボットの紹介 [#c17bbfd1]
ライントレーサー。紙の上に書かれた黒い線を自動でたどってゆくロボットです。
#ref,around(robotics3.jpg);
#ref(robotics3.jpg);
~四輪モデルでは半径が1.5cmのカーブがスムーズに曲がり切れなかったため、小回りの利く三輪のモデルに改良しました。
前の二つのタイヤはそれぞれ独立したモーターで動かし、前輪どうしを結んだ線の中点を軸として回転します。回転軸とセンサーライトまでの距離が短いためセンサーが大きく左右にふられて線を見失ってしまう事が少なくなりました。後輪はロボット全体を支えるための補助となっています。
*プログラム [#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 ]-|
#define conr_4 400 ]-|
交差点近くになるまでの時間は、ライントレースで急なカーブを曲がったりするとき、交差点と判断してしまうため定義しました。この時間条件をif文に入れることで交差点付近でのみ conrringのプログラムが動きます。
-サブルーチン
sub conrring()
{PlaySound(SOUND_DOWN);
SetPower(OUT_AC,5);
{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の値がうまく決まらず一番初めの直角が曲がれなかった事が大きかったと思います。交差点への侵入角度によってあらぬ方向へ行く事もありました。今度からは確実性も高めていきたいです。
はじめに説明書に書いてあるとうりに作った四輪のロボットでは、二つ目の交差点を横切るところまではうまくいきましたが、ロボットを二輪に改良してからセンサーライトの感受性が変わり一番初めの直角が曲がれなくなってしまいました。一時は自分の影でセンサーライトの値が変わっていることに気づかずプログラムを書き換えてしまい無駄な時間を使ってしまったこともありました。