[[ロボティクス入門ゼミ]] [[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_C); until((SENSOR_2<40)&&(SENSOR_3<40)); //一本目の交差している線まで前進します。 line_number=line_number+1; //線についたら変数「line_number」のはじめの数に1を足します。 OnFwd(OUT_A+OUT_C); 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_C); until((SENSOR_2<40)&&(SENSOR_3<40)); line_number=line_number+1; OnRev(OUT_A+OUT_C); 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] 自分としてはできるだけ簡略化したつもりでしたが、もう少し簡単にできる気がします。一番簡単にできるのは缶を渡すところと、缶をつかむところです。サブルーチンをもう一つ使ってまとめようと思います。このプログラムはまだ実際に動かしてないので、しっかりと動くかわかりませんが、その動き具合によって調節していこうと思います。 ***実際にロボコンで使用したプログラム [#ib8dcf57] 製作者:水 実際に二つのプログラムが完成したのは、一回目のロボコンを保留にして、二回目のロボコンが始まるほんの五分前でした。 しかし、そのプログラムでは缶を取りに行く事すらできなかったので、もう一度プログラムを見直し、このプログラムになりました。(希望者のみ参加の三回目のロボコンにぎりぎりで間に合いました。) しかし、このプログラムでは、缶は取れてももって行く事はできませんでした。そのため、この後に予想で改良したプログラムを載せておきます。 #define arm_up OnFwd(OUT_B);Wait(80); #define arm_down OnRev(OUT_B);Wait(80); #define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(85); #define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(85); #define R_turn_360 OnFwd(OUT_A);OnRev(OUT_C);Wait(340); #define light until((SENSOR_2<40)&&(SENSOR_3<40)); #define touch until(SENSOR_1==1); #define go OnFwd(OUT_A+OUT_C); #define back OnRev(OUT_A+OUT_C); #define go_line go light line_number=line_number+1; #define back_line back light line_number=line_number+1; #define message ClearMessage();while(Message() !=0 {SendMessage(1);Wait(50);} until(Message() !=0); int line_number; sub GO() { go Wait(50); Off(OUT_A+OUT_C); Wait(1); go light R_turn_90 go_line go Wait(10); go_line } sub BACK() { back Wait(50); back light L_turn_90 back_line back Wait(10); back_line } task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); line_number=0; GO(); until(line_number==2); R_turn_90 go touch arm_down BACK(); L_turn_90 back Wait(50); message go Wait(50); R_turn_360 arm_up go Wait(50); back Wait(50); R_turn_360 GO(); until(line_number==6); OnRev(OUT_C); Wait(85); go touch arm_down BACK(); L_turn_90 back Wait(50); message go Wait(50); R_turn_360 arm_up go Wait(50); back Wait(50); R_turn_360 GO(); until(line_number==10); OnFwd(OUT_A);Wait(85); go touch arm_down BACK(); L_turn_90 back Wait(50); message go Wait(50); R_turn_360 arm_down go Wait(50); }