[[ロボティクス入門ゼミ]]

[[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]
 自分としてはできるだけ簡略化したつもりでしたが、もう少し簡単にできる気がします。一番簡単にできるのは缶を渡すところと、缶をつかむところです。サブルーチンをもう一つ使ってまとめようと思います。このプログラムはまだ実際に動かしてないので、しっかりと動くかわかりませんが、その動き具合によって調節していこうと思います。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS