#contents
*課題 [#y81382c6]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016b%2FMission2&openfile=2016b-mission2.png)
ルート1を担当する。

「A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点においたゴールへシュートする 

Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S左折 → Dへシュート

ただし、

なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。

ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい

可能であればC,Dのゴールエリアライン上からシュートする」

*ロボット [#bd99d88b]
*ロボット本体 [#bd99d88b]
**本体 [#jeb0d1df]
**プログラム [#e14514df]
***定義 [#d37083b9]
***サブルーチンプログラム [#fea0d26a]
***メインプログラム [#ua9900a3]
*プログラム [#e14514df]
**定義 [#d37083b9]
**サブルーチンプログラム [#fea0d26a]
***線を追う [#c3b5760e]

 #define turn_right      OnRev(OUT_B,40);
 #define turn_right_slow OnRev(OUT_B,40); OnFwd(OUT_C,30);
 #define turn_left       OnRev(OUT_C,40);
 #define turn_left_slow  OnRev(OUT_C,40); OnFwd(OUT_B,30); 
 #define go              OnRev(OUT_BC,40);
 #define MAX_TIME 500

 sub FOLLOW_LINE()
 {
   long t0=CurrentTick();
 
   while(CurrentTick()-t0<MAX_TIME){
     if(SENSOR_1<=42){        //線上黒なら右折
       turn_right;
     }else if(SENSOR_1<=48){
       turn_right_slow;
       t0=CurrentTick();
     }else if(SENSOR_1<=58){
       go;
       t0=CurrentTick();
     }else if(SENSOR_1<=65){
       turn_left_slow;
       t0=CurrentTick();
     }else{
       turn_left;             //線外白なら左折
       t0=CurrentTick();
     }
   }
   Off(OUT_BC);
   PlaySound(SOUND_UP);
  Wait(2000);
 }

・QR間の急なカーブを曲がる

 #define kokizami_right  OnRev(OUT_B,50); OnFwd(OUT_C,40);
 #define kokizami_left   OnRev(OUT_C,50); OnFwd(OUT_B,40);

 sub FOLLOW_LINE_KOKIZAMI()
 {
   long t0=CurrentTick();
 
   while(CurrentTick()-t0<MAX_TIME){
     if(SENSOR_1<=42){        //線上黒なら右折
       kokizami_right;
     }else if(SENSOR_1<=48){
       turn_right_slow;
       t0=CurrentTick();
     }else if(SENSOR_1<=58){
       go;
       t0=CurrentTick();
     }else if(SENSOR_1<=65){
       turn_left_slow;
       t0=CurrentTick();
     }else{
       kokizami_left;             //線外白なら左折
       t0=CurrentTick();
     }
   }
   Off(OUT_BC);
   PlaySound(SOUND_UP);
   Wait(2000);
 }

***右折・左折・直線 [#nede7519]

 sub USETSU()
 {
   OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
   OnRev(OUT_C,50); Wait(1500); Off(OUT_C);
 }

 sub SASETSU()
 {
   OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
   OnRev(OUT_B,50); Wait(1500); Off(OUT_B);
 }

 sub CROSS()
 {
   go; Wait(800); Off(OUT_BC); 
 }

***ゴールにシュート [#m3d8c6fb]
**メインプログラム [#ua9900a3]

 task main()
 {
   SetSensorLight(S1);
   SetSensorLowspeed(S2);
 
   FOLLOW_LINE();
   CROSS();         //直進P
   FOLLOW_LINE();
   CROSS();         //直進Q
   go;
   until (abs(SensorUS(S2)-13)>=4);
   if(abs(SensorUS(S2)-13)>=4){
     Off(OUT_BC);
     CATCH_BALL;
   }
   FOLLOW_LINE();
   CROSS();         //直進Q
   FOLLOW_LINE_KOKIZAMI();
   USETSU();        //右折R
   FOLLOW_LINE();
   CROSS();         //直進P
   FOLLOW_LINE();
   SASETSU();       //左折S
   FOLLOW_LINE();
   GOAL();
 }

*実演の反省 [#t2e538f8]
*学んだこと [#r6b9eff9]
*感想 [#p819a847]


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