[[2009a]] *課題2 ライントレースロボットを作る [#qcba8fc1] A11L メンバー ダークホース ライス バビロン #contents **ロボット [#h779cce3] ***車体 [#p2c45fc8] 車輪は基本的に最初に作ったものに改良を加えたもの。~ 最初に作ったロボットはなかなか小回りが利くため今回の課題にはもってこいだった。~ またセンサーを組み込みやすかったため比較的はやくロボットを完成させられた。~ #ref(./車体.jpg,130%,車体) ***タッチセンサー [#ibfeb330] シングルバンパーを作成し、その先にアームを取り付けることにした。~ アームによって牛乳パックをキャッチし、運ぶことにしたがしかし、運ぼうと思っても牛乳パックが出てしまうことに気がつき改良を加えた。G型にすることにより、左旋回では出ないようになった、なので右旋回はできない。~ 結果、いい感じに牛乳パックをキャッチできるようになった。~ #ref(./アーム.jpg,130%,アーム) ***光センサー [#s27b9c2c] 最初はかなり悩んだが、先端につけると重心が前になってしまうためタッチセンサーアームより後ろにつけることにした。~ センサー間を狭くすることによって、正確なライントレースが可能になった。~ #ref(./光センサー-1.jpg,130%,光センサー) #ref(./20090612174757.jpg,130%,光センサー2) #ref(./20090612174810.jpg,130%,光センサー3) ***完成 [#x5e75ece] 完成したがクワガタになった。~ なかなかの出来ではないだろうか。~ #ref(./20090612174743.jpg,130%,光センサー3) **コース [#td8c7c25] #ref(course2.JPG)~ コース1~ 交差点:3~ 紙の端や交差点が狭い。 **プロブラム [#ka9d6769] ***1:紙パックをキャッチした後、旋回し元の場所に戻し、また旋回してライントレースに戻る。 [#s1680104] 制作者:ダークホース~ ~ 関数の指定 #define T 40 //闘値を40に設定 #define Run_time 1500 //Run_timeを150秒に設定 #define a OUT_A //OUT_Aをaと定義 #define c OUT_C //OUT_Cをcと定義 #define go_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進 #define go_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退 #define t_l(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); //左旋回 #define t_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //右旋回 メインプログラム task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーを1にセットする。 SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーを2にセットする。 SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサーを3にセットする。 ClearTimer(0); while(Timer(0) <= Run_time){ //150秒たったら止まるループ if(SENSOR_1>T){ //光センサが2個とも白紙上にあるとき、直進 if(SENSOR_3>T){ OnFwd(a+c); } else{ if(SENSOR_1>T){ //左だけ白紙上にあるとき、右にターン OnFwd(a); Off(c); } } } else{ if(SENSOR_3>T){ //右だけ白紙上にあるとき、左にターン OnFwd(c); Off(a); } else{ //両方線上にあるとき 1.0秒止まりし、1.0秒前進する。 Off(a+c); Wait(100); OnFwd(a+c); Wait(100); } } if(SENSOR_2 == 1); //タッチセンサーのが押されるか判断 go_s(50); //押されたら、0,5秒進み t_l(90); //左に180度旋回 go_b(50); //0,5下がり、牛乳パックをおく t_l(90); //左に180度旋回 } ***2:迂回するパターンのプログラム [#c2d98e5f] 制作者:バビロン~ ~ 関数の指定 #define BORDER 40 //闘値を40に設定 メインプログラム task main () { SetSensor ( SENSOR_1, SENSOR_LIGHT ); //光センサーを1にセットする。 SetSensor ( SENSOR_2, SENSOR_TOUCH ); //タッチセンサーを2にセットする。 SetSensor ( SENSOR_3, SENSOR_LIGHT ); //光センサーを3にセットする。 while (true); if ( SENSOR_2 == 1 ){ //タッチセンサーが押されたとき OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(90); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); OnRev(OUT_A); Wait(90); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); OnRev(OUT_A); Wait(90); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(90); } else{ //ライントレース if ( SENSOR_1 > BORDER ){ if ( SENSOR_3> BORDER ){ OnFwd(OUT_A+OUT_C); } else { OnFwd(OUT_A); Off(OUT_C); } } else { if ( SENSOR_3> BORDER ){ Off(OUT_A); OnFwd(OUT_C); } } } } ***3:最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む [#vf690d40] 制作者:ライス~ ~ #define THRESHOLD 44 int a; task main () { a=0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); while (a<20) if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) { if((a==0)||(a==2)||(a==4)||(a==6)||(a==8)|| (a==10)||(a==12)||(a==14)||(a==16)||(a==18)) { Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A); OnRev(OUT_C); Wait(95); OnFwd(OUT_A+OUT_C); Wait(35); } else{ Off(OUT_A+OUT_C); Wait(105); OnFwd(OUT_A+OUT_C); Wait(50); OnFwd(OUT_C); OnRev(OUT_A); Wait(100); OnFwd(OUT_A+OUT_C); Wait(40); }a=a+1; } if (SENSOR_1>THRESHOLD){ if(SENSOR_3>THRESHOLD){ OnFwd(OUT_A+OUT_C); } else{ OnFwd(OUT_A); OnRev(OUT_C); } } else{ if(SENSOR_3>THRESHOLD){ OnRev(OUT_A); OnFwd(OUT_C); } Off(OUT_A+OUT_C); } } *感想 [#m9e9b613] 今回の課題は例年に比べ難しかったと思う。 高校のころにマイコンカーをやっていてライントレースはやっていたが、まったく違う内容だった。まず、牛乳パックをいかに動かすかというところが難しかった。またプログラムもなかなか難しかった。 **コメント [#w23da78b] - ロボットの説明はよくできています。カブトよりクワガタ?あとは、コースの画像が欲しいところです。また、プログラムは一人ひとつお願いします。 -- [[こさか]] &new{2009-07-02 (木) 23:13:19}; #comment