目次
#contents



*課題について [#q200cecb]

詳細はこちら[[2019a/Mission2]]



*ロボットについて [#o583610d]

ロボットの左右の
ため左右のタイヤそれぞれに別のモーターを取り付け別々に稼働するようにした.

#ref(


ピンポン玉はロボット前部のU字型の部分で掬うようにして持ち上げられるようにした.
#ref



*プログラムについて [#ce2b3d7a]
**ピンポン玉を運ぶ [#i94d3817]

ピンポン玉を持ち上げるには
+ アームを下げた状態で近づく
+ ピンポン玉に十分近づいた状態でアームを上げる

この2つの動作が必要である.よってアームが上下するプログラムを以下のように組む.

  OnRev(OUT_C,20);Wait(500);Off(OUT_C);
  Onfwd(OUT_C,20);Wait(500);Off(OUT_C);
    #define up OnRev(OUT_C,20);Wait(500);Off(OUT_C);
    #define down OnFwd(OUT_C,20);Wait(500);Off(OUT_C);



**線に沿っての移動 [#a0f703db]

黒い線に沿って移動するため,線の濃淡や線以外の白紙上を光センサーで調べて5つの区画に分けた.
まずロボットの基本的な動きを以下のように定義する


線の黒い(暗い)箇所は最低値41,また白紙の箇所では70だった.光センサの数値はとなったためこの範囲を5つに分け,暗い側からstep1とした

     #define step1 45
     #define step2 53
     #define step3 61
     #define step4 69
     #define step5 75

     #define left0 OnFwd(OUT_A,20);OnRev(OUT_B,20);
     #define left1 OnFwd(OUT_A,20);Off(OUT_B);
     #define right0 OnFwd(OUT_B,20);OnRev(OUT_A,20);
     #define right1 OnFwd(OUT_B,20);Off(OUT_A);
     #define forward OnFwd(OUT_AB,20);


定義した動作をまとめると下の通りになる
定義した動作をまとめると下の通りになる.

|プログラム名|内容|
|left0|左に曲がる|
|left1|左に曲がる|
|right0|右に曲がる|
|right1|右に曲がる|
|forward|直進する|
|left0|左旋回|
|left1|左折|
|right0|右旋回|
|right1|右折|
|forward|直進|

**コースに沿っての動き [#z330c619]

交差点で任意の方向へ曲がるために交差点を認識した箇所で一度静止するようにする.交差点としての認識は
またコース上の光センサの値は線の黒い(暗い)箇所で最低値41,また白紙の箇所で最高値71だった.よって閾値を以下のように定義し,暗い側からstep1とした

よって線の左右の淵に沿って移動するプログラムを以下のように設定した.
     #define step1 45
     #define step2 53
     #define step3 61
     #define step4 69
     #define step5 75

  sub line_left
線に沿って移動させるため,ロボットの光センサが常に線の淵を沿うようにプログラムする.この時,線の境界上にある時は直進,線状や線から外れた時は右左折またはどちらかに旋回するようにする.交差点では1秒間停止させなければならないため,発進して線を辿り交差点で停止するサブルーチンを同時にプログラムする.交差点は光センサが線上の黒い部分を一定時間以上認識した時とする.このため交差点で停止した時,ロボットは線に沿って斜めに停止することになる.

線の左右の淵に沿って移動するプログラムは以下のとおりである.ミッションより丁字路でロボットは一時停止しなければならないため,コース上ロボットは場所によって線の左右どちらの境界も辿れるようにしなければならない.ここでは線の左側を辿るサブルーチンをline_left,右側を辿るサブルーチンをline_rightとした.

  sub line_left()    //線の左側を走行するプログラム    
  {  
     SetSensorLight(S3);
    
     long t0=0,t1=0,tm=1;
  
     while(t1-t0<tm){
         if(SENSOR_3<step1){
             left0;t0=CurrentTick();
             until(SENSOR_3<step3);
             t1=CurrentTick();
         }else if(SENSOR_3<step2){
             left1;
         }else if(SENSOR_3<step3){
             forward;     
         }else if(SENSOR_3<step4){
             right1;
         }else if(SENSOR_3<step5){
             right0;
     SetSensorLight(S3);//光センサを起動
     long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
     while(t1-t0<tm){    //交差点でない時は実行するプログラム
         if(SENSOR_3<step1){   //線中央にあるとき
             left0;t0=CurrentTick(); //左旋回し時間を計測
             until(SENSOR_3<step3);  //境界を認識するまで続ける
             t1=CurrentTick();       //旋回した時間を計測
         }else if(SENSOR_3<step2){  //線上に入ったとき
             left1;          //左折する
         }else if(SENSOR_3<step3){   //境界上にあるとき
             forward;            //直進する
         }else if(SENSOR_3<step4){  //線から外れたとき
             right1;          //右折する
         }else if(SENSOR_3<step5){  //完全に線から外れたとき
             right0;          //右折する
          }
     }
     Off(OUT_AB);
     }                //交差点に入ったとき
     Off(OUT_AB);           //停止する(1秒間)
    Wait(1000);
  }  

  sub line_right
  sub line_right()   //線の右側を走行するプログラム    
  {
     SetSensorLight(S3);
    
     long t0=0,t1=0,tm=1;
  
     while(t1-t0<tm){
         if(SENSOR_3<step1){
            t0=CurrentTick();
             right0; until(SENSOR_3<step3);
             t1=CurrentTick();
         }else if(SENSOR_3<step2){
             right1;
         }else if(SENSOR_3<step3){
             forward;     
         }else if(SENSOR_3<step4){
             left1;
         }else if(SENSOR_3<step5){
             left0;
     SetSensorLight(S3);//光センサを起動
     long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
     while(t1-t0<tm){    //交差点でない時は実行するプログラム
         if(SENSOR_3<step1){      //線中央にあるとき
             right0; t0=CurrentTick(); //右旋回し時間を計測
             until(SENSOR_3<step3);  //境界を認識するまで続ける
             t1=CurrentTick();     //旋回した時間を計測
         }else if(SENSOR_3<step2){     //線上にあるとき
             right1;           //右折する
         }else if(SENSOR_3<step3){     //境界上にあるとき
             forward;             //直進する
         }else if(SENSOR_3<step4){     //線から外れたとき
             left1;                    //左折する
         }else if(SENSOR_3<step5){     //完全に線から離れたとき
             left0;           //左旋回する
          }
     }
     Off(OUT_AB);
     }                                 //交差点にある時
     Off(OUT_AB);            //停止する(1秒間)
     Wait(1000);
  }

**コースを走るプログラム [#k914cb1a]
コースはA→M→B→Aとした
コースはA→M→B→Aとした.コースを走るためのプログラムは以下のとおりである.

    #define step1 45
    #define step2 53
    #define step3 61
    #define step4 69
    #define step5 75
    #define left0 OnFwd(OUT_A,20);OnRev(OUT_B,20);
    #define left1 OnFwd(OUT_A,20);Off(OUT_B);
    #define right0 OnFwd(OUT_B,20);OnRev(OUT_A,20);
    #define right1 OnFwd(OUT_B,20);Off(OUT_A);
    #define forward OnFwd(OUT_AB,20);
    #define up OnRev(OUT_C,20);Wait(500);Off(OUT_C);
    #define down OnFwd(OUT_C,20);Wait(500);Off(OUT_C);
    sub line_left()
    {
       SetSensorLight(S3);
       long t0=0,t1=0,tm=15;
       while(t1-t0<tm){
           if(SENSOR_3<step1){
               t0=CurrentTick();
               left0;until(SENSOR_3<step3);
               t1=CurrentTick();
           }else if(SENSOR_3<step2){
               left1;
           }else if(SENSOR_3<step3){
               forward;     
           }else if(SENSOR_3<step4){
               right1;
           }else if(SENSOR_3<step5){
               right0;
           }
       }
       Off(OUT_AB);
       Wait(1000);
    }
    sub line_right()
    {
       SetSensorLight(S3);
       long t0=0,t1=0,tm=15;
       while(t1-t0<tm){
           if(SENSOR_3<step1){
              t0=CurrentTick();
               right0; until(SENSOR_3<step3);
               t1=CurrentTick();
           }else if(SENSOR_3<step2){
               right1;
           }else if(SENSOR_3<step3){
               forward;     
           }else if(SENSOR_3<step4){
           left1;
           }else if(SENSOR_3<step5){
               left0;
            }
       }
           Off(OUT_AB);
           Wait(1000);
        }
    task main()
    {
        long t=1000;   //交差点で停止後に進む時間をt=1秒とする
        forward;     //Aから出発
        Wait(1000); 
        line_left();      //MからKまで進みKで停止
        forward;          //交差点を直進
        Wait(t);
        line_left();   //KからLまで進みKで停止
        up;        //ピンポン玉を拾う
        left0;            //Lで回転し方向転換
        Wait(2000);
        line_right();   //LからKまで進みKで停止
        right0;      //Lで回転し方向転換
        Wait(t);
        line_right();   //KからJまで進みJで停止
        left1;            //Jで回転
        Wait(t);
        line_left();   //JからIまで進みIで停止
        repeat(2){
            forward;   //丁字路を直進
            Wait(t);
            line_left(); //コースを進む
        }         //IからH,HからGまで進みGで停止
        forward;      //丁字路を直進
        Wait(t);
        line_right();   //GからF,Eを通りDまで進みDで停止
        forward;     //交差点を直進
        line_right();   //DからCを通りBまで進みBで停止
        down;       //ピンポン玉を置く
        OnRev(OUT_AB,20); //後進
        Wait(500);
        OnFwd(OUT_AB,100); //勢いをつけてボールに接触,シュート
        Wait(t);
        Off(OUT_AB);//静止
    }



*まとめ [#lbc481b6]

試走させるたびに光センサの値が変化したため毎回の調整が必要だった.また一切のプログラムとロボットの構造を変更していないいもかかわらず唐突に交差点を認識しなくなったり,逆にカーブで停止してしまうことが多々ありこれも閾値やtmの数値の調整が毎回必要であった.交差点とカーブの認識のズレは光センサの数値の変化のように明確な原因がわからずこの対応に多くの時間がかかった.


*まとめ [#lbc481b6]


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