- 追加された行はこの色です。
- 削除された行はこの色です。
[[ロボティクス入門ゼミ]]
[[2006a/MemberOnly/進行状況C]]
[[2006a/C5/ロボコン]]
[[2006a/C5/ロボコン/本体編]]
[[2006a/C5/ロボコン/プログラム編]]
[[2006a/C5/ロボコン/プログラム編/右]]
プログラム制作者:水
int line_number;
sub go() //行きのサブルーチンです。何度も使いそうなのでまとめました。
{
OnRev(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40)); //はじめの交差している線まで後退します。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //そこで左に旋回
OnFwd(OUT_A+OUT_B);
until((SENSOR_2<40)&&(SENSOR_3<40)); //一本目の交差している線まで前進します。
line_number=line_number+1; //線についたら変数「line_number」のはじめの数に1を足します。
OnFwd(OUT_A+OUT_B);
until((SENSOR_2<40)&&(SENSOR_30<40)); //次の線まで前進します。
line_number=line_number+1; //変数にさらにもう1足します。これで2足したことになります。
//缶をとる位置まで2回線が交差しているので2数えさせます。
}
sub back() //帰りのサブルーチンです。
//基本はsub go()と同じです。前進と後退が逆になっています。
{
OnFwd(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40));
OnRev(OUT_A);OnFwd(OUT_C);Wait(200);
OnRev(OUT_A+OUT_B);
until((SENSOR_2<40)&&(SENSOR_3<40));
line_number=line_number+1;
OnRev(OUT_A+OUT_B);
until((SENSOR_2<40)&&(SENSOR_3<40));
line_number=line_number+1;
}
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
line_number=0; //はじめに変数に0を代入します。
go(); //この動作が終わった後「line_number」は2なので
until(line_number==2); //交差を2回すぎた後、
OnFwd(OUT_A);OnRev(OUT_C);Wait(200); //90°右旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==1); //タッチセンサーに触るまで(缶にあたるまで)前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //少し後退し、腕をおろします。
back(); //缶をつかんだ後、そのままスタート地点まで戻ります。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //90°左旋回し後ろ向きになって
OnRev(OUT_A+OUT_C);Wait(100); //スタート地点まで戻ります。
ClearMessage();
while(Message() !=0) //向こうから何かのメッセージを受け取るまで続けます。
{
SendMessage(1);
Wait(50); //メッセージ1を送り続けます。
}
until(Message() !=0); //何かのメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50); //少し後退して、
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
OnRev(OUT_B);Wait(1000); //腕を上げ、
OnFwd(OUT_A+OUT_B);Wait(50); //少し缶を押します。
go(); //2つ目の缶をとりにいきます。
until(line_number==6) //今まですべてで6つの交差をすぎたら、つまり2回目で
OnRev(OUT_C);Wait(200); //2つ交差をすぎたら、少し右目に右旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==1); //缶にあたるまで前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //缶をつかみ、
back(); //そのまま帰ります。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //スタート地点前まで行ったら、後ろ向きにします。
OnRev(OUT_A+OUT_C);Wait(100); //そのまま前進します。
ClearMessage(); //今まで受けたメッセージをなしにします。
while(Message() !=0) //一回目同様何かのメッセージを受けるまで続けます。
{
SendMessage(1); //メッセージ1を送ります
Wait(50);
}
until(Message() !=0); //何かメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //前を向くように旋回します。
OnRev(OUT_B);Wait(1000);
OnFwd(OUT_A+OUT_B);Wait(50); //腕を上げ、缶を押し出します
go(); //3つ目の缶をとりにいきます。
until(line_number==10); //今まですべてで10の交差をすぎたら、つまり2回目で
OnFwd(OUT_A);Wait(200); //2つ交差をすぎたら、少し左目に左旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==10); //缶にあたるまで前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //缶をつかみ、
back(); //そのままきた道を戻ります
OnRev(OUT_A);OnFwd(OUT_C);Wait(200);
OnRev(OUT_A+OUT_C);Wait(100); //後ろを向いてスタート地点まで出ます。
ClearMessage(); //2回目までに受けたメッセージをなしにします。
while(Message() !=0) //何かのメッセージを受けるまで続けます。
{
SendMessage(1);
Wait(50); //メッセージ1を送り続けます。
}
until(Message() !=0); //何かのメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //前向きになり、
OnRev(OUT_B);Wait(1000);
OnFwd(OUT_A+OUT_B);Wait(50); //缶を押し出します。
}
*課題 [#m4a51c7b]
自分としてはできるだけ簡略化したつもりでしたが、もう少し簡単にできる気がします。一番簡単にできるのは缶を渡すところと、缶をつかむところです。サブルーチンをもう一つ使ってまとめようと思います。このプログラムはまだ実際に動かしてないので、しっかりと動くかわかりませんが、その動き具合によって調節していこうと思います。