目次
#contents
*課題について [#pad2e805]
[[2017a/Mission2]]を参照してください。

今回はE地点直進コースわやりました。
*ロポットについて [#f038beb0]
**ロボットの大きさについて [#n91fcdff]
#ref(./IMG_201707_1.jpg,50%,ロポットの大きさ)
今回は車体に大きなタイヤを使わないことで機体を小さくできたことで、小回りをきかせることできるようになった。とても不安定なように見えても意外と丈夫だ。そしてタイヤの間の空間を作ることでセンサーを取り付ける場所を作ることに成功した。
**ロボットの裏側 [#v3dd1d51]
#ref(./IMG_201707_2.jpg,50%,ロボットの裏側)
工夫したところは裏側である。黒いパーツを使うことで機体を引きずらずに動かすことができて、小さくすることで不安定になってしまったモータを繋げるためにタイヤの横につけているパーツと真ん中の小さなハーツがある。
*ライントレースのプログラムについて [#xc0bfe89]
**定義について [#j2bcb4bb]
  #define TURN_left OnRev(OUT_A); Wait(5); OnFwd(OUT_A);
  #define TURN_right OnRev(OUT_C); Wait(5); OnFwd(OUT_C);
  #define overTURN_left SetPower(OUT_C,1); OnRev(OUT_A); Wait(20);\
            SetPower(OUT_C,3); OnFwd(OUT_A);
  #define overTURN_right SetPower(OUT_A,1); OnRev(OUT_C); Wait(20);\
            SetPower(OUT_A,3); OnFwd(OUT_C);
  int min_time;

このプログラム上の定義は、このようになっている。前回と同様左右が定義されているが時間が短くなっているので、前よりも曲がり方が小さくなっている。代わりに大きく曲がるときには、overが付いている定義で、動かす速さを変えて曲がるようにしている。また,今回は時間を定義しているのでint  min_timeを使っている。
**subについて [#q88edaad]
     sub line()
  {
    SetPower(OUT_AC,3);
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0); //0番目のタイマーリセットする//
    while(FastTimer(0)<min_time){
      OnFwd(OUT_AC);
      if(SENSOR_2<42&&FastTimer(0)<min_time){
        overTURN_left;
      }else if(SENSOR_2<44&&FastTimer(0)<min_time){
        TURN_left;
      }else if(SENSOR_2<46&&FastTimer(0)){
      }else if(SENSOR_2<51&&FastTimer(0)){
        TURN_right;
      }else if(FastTimer(0)<min_time){
        overTURN_right;
       }
       
    }
  }
subでは動く速さを変えることで光センサーが反応しやすくしている。また、whileで0番目のタイマーがmin_timeで定義する時間よりも小さい時繰り返している。そして、ifでセンサーの値で動き方を変えるようにしている。また、もう一度FastTimer(0)<min_timeを置いているのはwhileの途中でmin_timeの時間を超えた時にロボットが動かないようにするためだ。
**プログラムについて [#g2c8a77d]
  task main()
{
  {
  min_time=2680; line(); PlaySound(SOUND_UP); OnFwd(OUT_AC);\
  ClearTimer(0); //A→E E→F//
  min_time=450; line(); PlaySound(SOUND_DOWN); Off(OUT_AC); Wait(100);\
  ClearTimer(0); //F→Q//
  min_time=480; line(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(20);\
  ClearTimer(0); //Q→R//
  min_time=1350; line(); PlaySound(SOUND_UP); ClearTimer(0); //R→S//
  min_time=400; line(); PlaySound(SOUND_UP); ClearTimer(0); //S→G//
  min_time=3120; line(); PlaySound(SOUND_UP); ClearTimer(0);//G→H//
  min_time=375; line(); PlaySound(SOUND_DOWN); Off(OUT_AC); Wait(100);\
  OnFwd(OUT_AC); Wait(10); ClearTimer(0); //H→T//
  min_time=1230; line(); PlaySound(SOUND_DOWN); Off(OUT_AC); Wait(100);\
  OnFwd(OUT_AC); Wait(10); ClearTimer(0); //T→T//
  min_time=890; line(); PlaySound(SOUND_DOWN); Off(OUT_AC); Wait(100);\
  ClearTimer(0); //T→R//
  min_time=600; line(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(10);\
  ClearTimer(0); //R→S//
  min_time=840; line(); PlaySound(SOUND_UP); ClearTimer(0); //S→P//
  min_time=550; line(); PlaySound(SOUND_DOWN);Off(OUT_AC); Wait(100);\
  ClearTimer(0); //P→E//
  min_time=600; line(); Off(OUT_AC); //E→A//
} 
上記で示したmin_timeを毎回定義してその間だけlineを実行し、そして音を鳴らしている。

**アドバイスとして [#g04a1f98]
実際PlaySoundのところは、ロボット自身に判定させる(overTURN_right/leftを使ったsubを作りセンサーの値でSOUND_UP/DOWNを判定させる。)こととわざわざ時間をリセットしないでも時間を増やす方法(min_time+=〇〇など)ができると思います。そして、このプログラムでは、少しのズレで変わってしまうのであまり良くなかったのかなと思いました。しかし、カウントに変えるには時間が足りなかったので妥協してしまいました。多分カウントのほうが安定したものとなるでしょう。でも、これも参考にして見ていただける人がいるならうれしい。
(実際に最後まではやることができませんでしたが参考にしてみても良いかも
    sub find()
  {
    TURN_right;
    TURN_right;
    TURN_right;
    TURN_right;
    Off(OUT_AC);
    Wait(10);
      if(SENSOR_2<46){
        OnFwd(OUT_AC);
        TURN_left;
        TURN_left;
        TURN_left;
        TURN_left;
        TURN_left;
        TURN_left;
        TURN_left;
        TURN_left;
      if(SENSOR_2<48){
        TURN_right;
        TURN_right;
        TURN_right;
        TURN_right;
        PlaySound(SOUND_DOWN);
        Off(OUT_AC);
        Wait(100);
     }else{
        TURN_right;
        TURN_right;
        TURN_right;
        TURN_right;
        PlaySound(SOUND_UP);
      }
    }else{
      TURN_left;
      TURN_left;
      TURN_left;
      TURN_left;
      PlaySound(SOUND_UP);
    }
  }
このsubでUP/DOWNを判断する{これは検証して一応出来た}
それで
    task main()
  {
    min_time=2680; line(); find();ClearTimer(0); //A→E E→F//
    min_time=450; line(); find(); ClearTimer(0); //F→Q//
    min_time=480; line(); find(); OnFwd(OUT_AC); Wait(20);\
    ClearTimer(0); //Q→R//
    min_time=1350; line(); find(); ClearTimer(0); //R→S//
    min_time=400; line();  find(); ClearTimer(0); //S→G//
    min_time=3120; line(); find(); ClearTimer(0);//G→H//
    min_time=375; line(); find(); OnFwd(OUT_AC);\
    Wait(10); ClearTimer(0); //H→T//
    min_time=1230; line(); find();OnFwd(OUT_AC);\
    Wait(10); ClearTimer(0); //T→T//
    min_time=890; line(); find(); ClearTimer(0); //T→R//
    min_time=600; line(); find(); OnFwd(OUT_AC); Wait(10);\
    ClearTimer(0); //R→S//
    min_time=840; line(); find(); ClearTimer(0); //S→P//
    min_time=550; line(); find(); ClearTimer(0); //P→E//
    min_time=600; line(); Off(OUT_AC); //E→A//
  } 
これの時間は変わるだろう(findで結構本体動いたりするから)が、自身で判断しているところが多いので、上に書いているプログラムよりもいいと思われる。)
*感想 [#ue2695a5]
今回もとても苦労し楽しかった。本来ならカウントを使うほうが、次の課題に役立つのではないかとおもうので、ここは反省しなけれはならないなと思った。次は頑張りたいと思わされた。


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