[[2017a/Member]]
#contents
*課題2 [#fb67d96f]
指定されたコースにそって動くロボットを作成する。詳しくは[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]を参照。
&br;自分はE地点右折コースを選択した。
*ロボット [#w8699235]
ロボットの構造で工夫した点は、センサーの位置をタイヤの軸上に近づけたことである。
#ref(./ロボット.JPG,50%,ロボット);
#ref(./ロボット 横.JPG,50%,横から見た図);
*プログラム [#j9a2f0e9]
まず、関数を1つ作り、黒線の右側、左側をトレースするプログラムを定義した。
このとき、交差点を判別するため、引数を使っている。
  int a;
  
  sub migi_susumu(int x)                //黒線の右側をトレースする
  {
        a=0;
        while(a<=x){    
            if(SENSOR_1>=55){
                 OnFwd(OUT_A,30);
                 OnRev(OUT_C,30);
            }else if(SENSOR_1>=50){
                 OnFwd(OUT_A,30);
                 Off(OUT_C);
            }else if(SENSOR_1>=45){
                 OnFwd(OUT_C,30);
                 Off(OUT_A);
            }else{
                 OnFwd(OUT_C,30);
                 OnRev(OUT_A,30);
                 a=a+1;
            }
        }
  }
  
  sub hidari_susumu(int y)                //黒線の左側をトレースする
  {
        a=0;
        while(a<=y){
              if(SENSOR_1>=55){
                   OnFwd(OUT_C,30);
                   OnRev(OUT_A,30);
              }else if(SENSOR_1>=50){
                   OnFwd(OUT_C,30);
                   Off(OUT_A);
              }else if(SENSOR_1>=45){
                   OnFwd(OUT_A,30);
                   Off(OUT_C);
              }else{
                   OnFwd(OUT_A,30);
                   OnRev(OUT_C,30);
                   a=a+1;
              }
        }
  }
次に、音を鳴らすプログラムを定義する。
  sub sound_down()              //SOUND_DOWNを鳴らし、1秒止まる
  {
        PlaySound(SOUND_DOWN);
        Off(OUT_AC);
        Wait(1000);
  }
  
  sub sound_up()                      //SOUND_UPを鳴らす
  {
        PlaySound(SOUND_UP);
  }
上記のサブルーチンを使って、メインのプログラムを書く。
&br;途中のwhileの中は、曲がり始めやカーブなどを交差点と誤認しないようにするためのものである。
&br;また、交差点と認識した後のOnFwdやOnRevは、曲がり始めた機体を修正したり、黒線の右側、左側に機体をよせるためにいれてある。
  task main()
  {    
        SetSensorLight(S1);
        OnFwd(OUT_AC,30);
        Wait(600);
        migi_susumu(3);
        sound_up();                //地点E
        OnFwd(OUT_AC,30);
        Wait(350);
        hidari_susumu(3);
        sound_down();                //地点P
        long t = CurrentTick();
        while(CurrentTick()-t<1000){
             hidari_susumu(10);
        }
        hidari_susumu(3);
        sound_up();                //地点Q
        OnFwd(OUT_C,30);
        OnRev(OUT_A,30);
        Wait(500);
        OnFwd(OUT_AC,30);
        Wait(400);
        hidari_susumu(3);
        sound_up();                //地点R
        t=CurrentTick();
        while(CurrentTick()-t<1000){
             hidari_susumu(10);
        }
        hidari_susumu(3);
        sound_down();                //地点T
        OnFwd(OUT_C,30);
        OnRev(OUT_A,30);
        Wait(500);
        OnFwd(OUT_AC,30);
        Wait(400);
        t = CurrentTick();
        while(CurrentTick()-t<12000){
             hidari_susumu(20);
        }
        hidari_susumu(3);
        sound_down();                //地点T
        OnFwd(OUT_C,30);
        OnRev(OUT_A,30);
        Wait(600);
        OnFwd(OUT_AC,30);
        Wait(500);
        migi_susumu(3);
        sound_up();                //地点H
        t = CurrentTick();
        while(CurrentTick()-t<25000){
             migi_susumu(50);
        }
        migi_susumu(3);
        sound_up();                //地点G
        OnFwd(OUT_AC,30);
        Wait(350);
        hidari_susumu(3);
        sound_down();                //地点S
        t = CurrentTick();
        while(CurrentTick()-t<1000){
             hidari_susumu(10);
        }
        hidari_susumu(3);
        sound_up();                //地点P
        OnFwd(OUT_C,30);
        OnRev(OUT_A,30);
        Wait(500);
        OnFwd(OUT_AC,30);
        Wait(400);
        hidari_susumu(3);
        sound_up();                //地点Q
        OnFwd(OUT_AC,30);
        Wait(600);
        migi_susumu(3);
        sound_up();                //地点F
        t = CurrentTick();
        while(CurrentTick()-t<1000){
             migi_susumu(10);
        }
        migi_susumu(3);
        OnFwd(OUT_A,30);
        OnRev(OUT_C,30);
        Wait(200);
        OnFwd(OUT_AC,30);
        Wait(1300);
  }
*総評 [#f177417a]
ロボット自体と黒線をトレースするプログラムは比較的すぐに出来上がり、上手くいっていたが、交差点を判別するのが難しかった。また、同じプログラムでも数回動かすと結果が変わったりして調整が大変だった。今回のプログラムもまだまだ改良の余地があると思う。

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