[[2017b/Member/Alex/Mission2]]
#contents

*概要 [#sb67315a]
 今回の課題は黒い線の経路にそって動くロボットを作成します。
**コース [#bcc3e6be]
#ref(2017b/Member/Alex/Mission2/333.jpg,100%)
    Dをスタート
    Cを直進
    Bを左折
    Pを左折(一時停止)
    Qを直進
    Rを左折
    Fを左折
    Sを直進(一時停止)
    Y地点の紙コップを取得してコースに戻る
    Sを直進(一時停止)
    Qを左折(一時停止)
    Rを直進
    X地点に紙コップを置いてコースに戻る
    Pを左折
    B を左折(一時停止)
    A地点へ(ゴール)
*ロボット [#g4850692]
#ref(2017b/Member/Alex/Mission2/3.jpg,70%)
 コップが光センサーの邪魔にならないように、間にものを置きました。
#ref(2017b/Member/Alex/Mission2/2.jpg,70%)
 右側にモーターをつけて、手の上げ下げを起動します。
#ref(2017b/Member/Alex/Mission2/3.png,30%)
 左側は対応して、コープをつかむ手が形成されました。
#ref(2017b/Member/Alex/Mission2/9999.JPG,10%)
#ref(2017b/Member/Alex/Mission2/777.png,40%)
 このような形の手でコップをつかみます。
**ライントレースする仕組み [#w3b0d660]
#ref(2017b/Member/Alex/Mission2/667.png,70%)
`それぞれの場所の光強さを示す
*プログラミング概要 [#ed200de2]
**定義 [#s3e1a511]
 #define t_l1 OnFwd(OUT_A,45); OnRev(OUT_C,10);  //急左折
 #define t_l2 OnFwd(OUT_A,55); OnFwd(OUT_C,10);  //左折
 #define t_l3 OnFwd(OUT_A,35); OnRev(OUT_C,30);  //回転左折
 #define go_forward OnFwd(OUT_AC,40);       //前進
 #define r_b OnRev(OUT_AC,40);          //後退
 #define t_r1 OnRev(OUT_A,10); OnFwd(OUT_C,45);  //急右折
 #define t_r2 OnFwd(OUT_A,10); OnFwd(OUT_C,55);  //右折
 #define t_r3 OnRev(OUT_A,30); OnFwd(OUT_C,35);  //回転右折
 #define DO  523       
 #define STEP 1                    
 #define t_off OnFwd(OUT_B,50); Wait(300); Off(OUT_B); //手落とし
 #define t_on OnRev(OUT_B,50); Wait(300); Off(OUT_B); //手挙げる
**サブルーチン [#w607bf28]
 sub DM()
 {
  int BT=0;                                  //BTは続けて暗いときになった回数
  while(BT < 140){                           //回数が140以下の時ライントレースを繰り返す
   if (SENSOR_2 < 38) {                       //光強さが38以下の時に急左折する
     t_l1;
     BT++;                  //回数増加する
     }else{
      if (SENSOR_2 < 47) {          //光強さが38〜47の間の時に左折する
        t_l2;
      } else if (SENSOR_2 < 55) {      //光強さが47〜55の間の時に前進する
        go_forward;
      } else if (SENSOR_2 < 60) {      //光強さが55〜60の間の時に右折する
        t_r2;
      } else {                //光強さが60以上の時に急右折する
        t_r1;
       }
       BT=0;                                 //回数を初期化する              
    }
	Wait(STEP);
  }
   Off(OUT_AC);
   PlayTone(DO,100); Wait(100);
   PlayTone(DO,100); Wait(100);              //交差点で鳴らす
   Wait(1000);
   BT = 0;                  
 }
 sub CM()
 {
  int BP=0;                 //BPは続けて暗いときになった回数
  while(BP < 140){                          //回数が140以下の時ライントレースを繰り返す
   if (SENSOR_2 < 48) {           //光強さが48以下の時に急左折する
     t_l1;
     BP++;                                  //回数増加する
      } else{
      if (SENSOR_2 < 55) {         //光強さが48〜55の間の時に前進する
        go_forward;
      } else if (SENSOR_2 < 60) {      //光強さが55〜60の間の時に回転右折する
        t_r3;
      } else {               //光強さが60以上の時に急右折する
        t_r1;
       }
       BP=0;                                //回数を初期化する
    }
	Wait(STEP);
 }
   Off(OUT_AC);
   PlayTone(DO,100); Wait(100);
   PlayTone(DO,100); Wait(100);      //交差点で鳴らす
   Wait(1000);
   BP = 0;                                   
 }
 CMはDMより交差点を反応しやすいです。
 左側に沿って動いてます。
**task main [#t592df51]
 task main()
 {
  SetSensorLight(S2);
  DM();
  t_r2;                 //Cでちょっと右折する
  Wait(200);
  DM();
  OnFwd(OUT_A,55);           //Bで90度左折する
  Wait(1900);
  DM();
  t_l2;                //Pで左折する
  Wait(1200);
  CM();
  t_r2;                //Qで右折する
  Wait(300);
  CM();
  t_l2;                //Rで左折する
  Wait(300);
  DM();
  OnFwd(OUT_A,55);          //Eで90度左折する 
  Wait(1900);	
  DM();
  OnFwd(OUT_A,55);          
  Wait(3800);
  CM();
  OnFwd(OUT_A,50);          //Fで90度左折する
  Wait(1800);	
  Wait(STEP);
  OnFwd(OUT_C,35);OnFwd(OUT_A,5);  //Fのところで紙コップを探す
  Wait(200);
  Wait(STEP);
  t_on;               //手を下げる
  Wait(STEP);
  OnFwd(OUT_C,50);OnRev(OUT_A,15);   //軌道へ戻る
  Wait(1500);
  DM();
  t_r1;               //Sのところでちょっと右折する
  Wait(300);
  DM();
  go_forward;            //Qのところで反応して前にちょっと進む
  Wait(300);
  t_off;              //手を上げる
  r_b;               //後退して元の場所へ戻る
  Wait(1100);         
  t_l2;              //Qのところで左折する  
  Wait(1100);
  DM();
  t_r2;              //Rのところで右折する
  Wait(300);
  CM();
  t_l1;              //Pのところで左折する
  Wait(800);
  DM();
  OnFwd(OUT_A,50);        //Bのところで90度左折する
  Wait(1400);
  DM();
  t_r1;             //Aの前の交差点で反応してちょっと右折する
  Wait(200);
  go_forward;          //Aに入る
  Wait(500);
 }
*結果 [#c922b252]
 テストの時はうまく行けたけど、最後の時、電池が消耗されて、思ったより変わったので、成功できませんでした。
*反省 [#k0a18516]
 電池の消耗をもっと注意すべきです。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS