2009a/A2右/課題2?
目次♪
課題2
†
ライントレースをするロボットを作ろう!!
かつ以下の条件をそなえたプログラムをそれぞれ作ること!
- 障害物にぶつかったら避けて進む
- 障害物にぶつかったら障害物を次の交差点まで運ぶ
ロボット †
↑車輪を極力本体に近づけることで小回りが利くようにした。
前方の腕は障害物を挟み込む役目を果たす。
↑このパーツは四角形の部品を重ね、底面に滑りをよくするために丸い部品を接続している。
初めは車輪を使おうとしたが安定性や強度、機動性面でこちらの方が優れていたためこのパーツを使った。
↑解説書のパーツをベースに作った。
障害物が軽いのでより繊細な衝撃も感知できるように作用点をできるだけ支点から遠ざけた。
コース †
↑交差点を3つ作りそれぞれの交差点を直交するようにした。
これは交差点でロボットが混乱しないようにするための配慮だ。
プログラム †
避ける方のプログラム byひろ †
int kosaten = 0;
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサーは1と3を光に、2をタッチにしました。
while(kosaten < 6) //kosatenの値が6より小さいときは以下のプログラムに従う
{while(SENSOR_2==1) //交差点で牛乳パックとぶつかったら発動
{OnRev(OUT_A+OUT_C);
Wait(60);
Off(OUT_A+OUT_C); //とりあえずバック
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
Off(OUT_A+OUT_C); //右に方向転換
OnFwd(OUT_A+OUT_C);
Wait(90);
Off(OUT_A+OUT_C); //前進
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
Off(OUT_A+OUT_C); //左に方向転換
OnFwd(OUT_A+OUT_C);
Wait(180);
Off(OUT_A+OUT_C); //前進
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(50);
Off(OUT_A+OUT_C); //左に方向転換
OnFwd(OUT_A+OUT_C);
Wait(92);
Off(OUT_A+OUT_C); //前進
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(35);
Off(OUT_A+OUT_C); //右に方向転換
kosaten++; //ここまで動作を完了したらkosatenに1加える
}
if (SENSOR_1 > 40&&SENSOR_3 < 45) //ロボの右側が白、左側が黒と認識したとき発動
{OnFwd(OUT_A);
OnRev(OUT_C);} //右側に曲がる
if (SENSOR_1< 40&&SENSOR_3 > 45) //ロボの右側が黒、左側が白と認識したとき発動
{OnFwd(OUT_C);
OnRev(OUT_A);} //左に曲がる
if (SENSOR_1 > 40&&SENSOR_3 > 45) //ロボの両側とも白と認識したとき発動
{OnFwd(OUT_A+OUT_C);} //前進
if (SENSOR_1 < 40&&SENSOR_3 < 45) //ロボの両側とも黒と認識したとき発動
{OnFwd(OUT_C+OUT_A);} //前進
}
Off(OUT_A+OUT_C); //kosatenの値が6以上になったら停止
}
運ぶ方のプログラム by T.I †
#define LINE 45 //線の明るさが45以下
int t; //変数t -動作時間を定義
int i; // 変数iを定義
task main()
{
t=0;
i=0;
SetSensor(SENSUR_1,SENSOR_LIGHT); //センサー1,3を光センサー
SetSensor(SENSUR_2,SENSOR_TOUCH); //センサー2をタッチセンサー
SetSensor(SENSUR_3,SENSOR_LIGHT);
while(t<18){ //t<=18で行動
if(SENSOR_2==1){ //タッチセンサーが作動するとき
if(SENSOR_1>LINE){ センサー1が白
if(SENSOR_3>LINE){ センサー3が白
OnFwd(OUT_A+OUT_C); 直進
}
else{ センサー3が黒
OnFwd(OUT_A);OnRev(OUT_C); 左折
}
if(SENSOR_1<LINE){ センサー1が黒
if(SENSOR_3>LINE){ センサー3が白
OnFwd(OUT_C);OnRev(OUT_A); 右折
}
else{ センサー3が黒
t++; 交差点と認識しt=t+1
if(i=0){ i=0のとき
OnFwd(OUT_A+OUT_C);
Wait(30); 線を越える
i++; i=i+1
}
else{ iが0でないとき 次の動作で障害物をどけてから元に戻す
OnFwd(OUT_A+OUT_C); 直進
Wait(100);
OnFwd(OUT_A);OnRev(OUT_C); 反転
Wait(120);
OnRev(OUT_A+OUT_C); 後退
Wait(120);
OnFwd(OUT_A);OnRev(OUT_C); 反転
Wait(120);
i=0; i=0を代入
}}}}
else{ タッチセンサーが作動しないとき
if(SENSOR_1>LINE){ センサー1が白
if(SENSOR_3>LINE){ センサー3が白
OnFwd(OUT_A+OUT_C); 直進
}
else{ センサー3が黒
OnFwd(OUT_A);OnRev(OUT_C); 左折
}
if(SENSOR_1<LINE){ センサー1が黒
if(SENSOR_3>LINE){ センサー3が白
OnFwd(OUT_C);OnRev(OUT_A); 右折
}
else{ センサー1,3が黒
t++;
OnFwd(OUT_A+OUT_C); 直進
Wait(30);
}}}}
Float(OUT_A+OUT_C); 緩やかに停止
}
最後に・・・ †
コメントよろしくお願いします♬
- プログラムを部分に分けてつくっていることはよいと思います。ただ、同じ命令の繰り返しが多いので、サブルーチンや関数を使ってください。また、工夫した点を書いてください -- FI?
- コースもわかりやすいものを作れています。プログラムは、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか?
- あと、プログラムにインデント(ifなどの階層ごとに行う字下げ)を入れたほうが、格段に見やすくなると思います。 -- こさか?