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

[[2006a/MemberOnly/進行状況C]]

[[2006a/C5/ロボコン]]

[[2006a/C5/ロボコン/本体編]]

[[2006a/C5/ロボコン/プログラム編]]

[[2006a/C5/ロボコン/プログラム編/左]]

[[2006a/C5/ロボコン/プログラム編/完成改]]

*プログラム  制作者:藤巻、坂口 [#ob812c9f]
 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;//
 OnFwd(OUT_A+OUT_B);
 until((SENSOR_2<40)&&(SENSOR_30<40));//
 line_number=line_number+1; //
 }
 sub back()//
 {
 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);
 ClearMessage();
 while(Message() !=0) //向こうから何かのメッセージを受け取る    まで続けます。
 {
 SendMessage(1);
 Wait(50); //メッセージ1を送り続けます。
 }
 until(Message() !=0); //何かのメッセージを受けたら、
 OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
 OnRev(OUT_B);Wait(1000); //腕を上げ、
 OnRev(OUT_A+OUT_C);
 until(SENSOR_1==1); //タッチセンサーに触るまで(缶にあたるまで)します。
 OnFwd(OUT_A+OUT_C);Wait(50); 
 OnFwd(OUT_B);Wait(1000); //少し後退し、腕をおろします。
 OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
 line_number=0; //はじめに変数に0を代入します。
 go(); //この動作が終わった後「line_number」は2なので
 until(line_number==2); //交差を2回すぎた後、
 OnFwd(OUT_A);OnRev(OUT_C);Wait(200); //90°旋回します。
 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);
 OnRev(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を送り続けます。
 }



**ロボコンで使用したプログラム [#se18bd32]
 製作者:水

 int line_number;
 #define arm_up OnRev(OUT_B);Wait(50);
 #define arm_down OnFwd(OUT_B);Wait(50);
 #define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(70);
 #define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(70);
 #define R_turn_360 OnFwd(OUT_A);OnRev(OUT_C);Wait(280);
 #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();until(Message() !=0) SendMessage(1);Wait(50);until(Message() !=0);
 int line_number; //線の数を変数にしておきます。
 #define arm_up OnRev(OUT_B);Wait(50); //腕を上げる
 #define arm_down OnFwd(OUT_B);Wait(50); //腕を下げる
 #define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(70); //右に90°旋回
 #define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(70); //左に90°旋回
 #define R_turn_180 OnFwd(OUT_A);OnRev(OUT_C);Wait(140); //180°回転
 #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; //黒線に感知するまで直進し、変数を+1する
 #define back_line  back light line_number=line_number+1; //黒線まで後退し、変数を+1する
 #define message ClearMessage();until(Message() !=0) SendMessage(1);Wait(50);until(Message() !=0); //メッセージの送信、受信
 
 sub GO()
 sub GO()  //何度も使うのでサブルーチンにしました
 {
 go
 Wait(50);Off(OUT_A+OUT_C);
 Wait(50); //1つ目の直線を超えるまで直進
 Off(OUT_A+OUT_C);
 Wait(1);
 
 go
 light
 R_turn_90
 light //二つ目の直線まで直進
 R_turn_90 //右に90°旋回
 go_line
 go
 Wait(10);
 go_line
 go_line //線を2本越えるまで直進する
 }
  
 sub BACK()
 sub BACK() //基本は行きと同じ、直進が後退になっただけ
 {
 back
 Wait(50);
 Off(OUT_A+OUT_C);
 Wait(1);
 back
 light
 R_turn_90
 back_line
 back
 Wait(10);
 back_line
 }
 
 task main()
 {
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー1をタッチセンサーに設定
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2,3を光センサーに設定
 
 line_number=0;
 until(Message() !=0);
 until(Message() !=0); //何かメッセージを受け取るまで待機 
 until(SENSOR_2==1); //缶がタッチセンサーに触ったら
 arm_down //腕を下げる
 
 until(SENSOR_2==1);
 arm_down
 
 GO();
 until(line_number==2);
 L_turn_90
 until(line_number==2); //2本目の線まできたら
 L_turn_90 //90°左旋回
 Wait(50);
 
 arm_up
 
 Wait(10);
 go
 Wait(10); //腕を上げ、缶をゴールに入れる
 
 BACK();
 R_turn_90
 back Wait(50);
 BACK(); //帰る
 R_turn_90 //受け取り位置の前まできたら
 back Wait(50); //少し前進して待つ
 
 message
 message //メッセージの送信、受信
 
 go
 Wait(50);
 R_turn_360
 until(SENSOR_2==1);
 arm_down
 Wait(50); //少し下がり
 R_turn_180 //180°回転
 until(SENSOR_2==1); //缶がセンサーに触れたら
 arm_down //腕を下ろす
 
 R_turn_360
 R_turn_180 //180°回転
 
 GO();
 GO(); //残りは1回目と同様の行動を2回繰り返す
 until(line_number==6);
 L_turn_90
 Wait(50);
 
 arm_up
 go
 Wait(10);
 
 BACK();
 R_turn_90
 back Wait(50);
 
 message
 
 go
 Wait(50);
 R_turn_360
 R_turn_180
 until(SENSOR_2==1);
 arm_down
 
 R_turn_360
 R_turn_180
 
 GO();
 until(line_number==10);
 L_turn_90
 Wait(50);
 
 arm_up
 go
 Wait(10);
 
 BACK();
 R_turn_90
 back Wait(50);
 
 message
 
 go
 Wait(50);
 R_turn_360
 R_turn_180
 until(SENSOR_2==1);
 arm_down
 
 R_turn_360
 
 R_turn_180
 }

**課題と反省 [#e0752922]
このプログラムは製作者が左と同じため課題と反省は左に載せておきます。


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