目次
#Contents
*課題2の内容 [#ifff3ad7]
#ref(2016b/Member/god22ila/Mission2/2016b-mission2.png,50%,コース)
今回の課題2の内容は上図のコースにライントレーサーを走らせ、途中に置いてあるピンポン球を掴み、ゴールにシュートするというものである。僕はA地点をスタート→P地点直進→Q地点直進→ピンポン球を掴む→Q地点直進→R地点右折→P地点直進→S地点左折→D地点へシュートというものである。
*ロボットの説明 [#r97767b5]
**本体について [#he30576e]
なるべくセンサーと紙の間の距離が近くになるようにするため、本体は低めに組み立てた。後ろに小さいタイヤをつけようとしたが、ロボットのバランスが悪くなってしまったのでつけるのをやめた。
**アームについて [#t2a53cfc]
アームはショベルカーのような構造にした。ピンポン球は丸くてとても軽いので、アームで本体のほうに引き寄せると途中で球が浮いてアームの上に乗った。アームの左右には球が落ちないように壁を付けた。こうすることによって球が横から落ちなくなる。なので球をとった後に球が落ちるかもしれないということを気にせずにプログラミングができる。
アームはショベルカーのような構造にした。ピンポン球は丸くてとても軽いので、アームで本体のほうに引き寄せると途中で球が浮いてアームの上に乗った。アームの左右には球が落ちないように壁を付けた。こうすることによって球が横から落ちなくなる。なので球をとった後に球が落ちるかもしれないということを気にせずにプログラミングができる。#ref(2016b/Member/god22ila/Mission2/課題2アーム.jpg,40%,課題2)

*プログラミングについて [#t3de1858]
 #define turnright OnFwd(OUT_C,40);
 #define turnleft OnFwd(OUT_B,40);
 #define SR OnFwdSync(OUT_BC,40,-100);
 #define SL OnFwdSync(OUT_BC,40,100);
 #define gomae OnFwdSync(OUT_BC,40,0);
 #define XrdTR OnFwd(OUT_C,40); Wait(500);OnFwdSync(OUT_BC,40,-100); Wait(1400);Off(OUT_BC);Wait(300);OnFwdSync(OUT_BC,40,0);Wait(500);Off(OUT_BC);n++;  //動作を実行し終わった後にnの値が1増える
 #define XrdST TR Wait(1000); GF Wait(200);n++;
 #define armup OnFwd(OUT_A,25);Wait(700);Off(OUT_A);
 #define armdown OnRev(OUT_A,25);Wait(700);Off(OUT_A);
 #define XX PlaySound(SOUND_CLICK);Wait(500);Wait(1000);
 #define turnright OnFwd(OUT_C,40);//右に曲がる
 #define turnleft OnFwd(OUT_B,40);//左に曲がる
 #define senkairight OnFwdSync(OUT_BC,40,-100);//右に旋回
 #define senkaileft OnFwdSync(OUT_BC,40,100);//左に旋回
 #define gomae OnFwdSync(OUT_BC,40,0);//前進
 #define XrdTR OnFwd(OUT_C,40); Wait(500);OnFwdSync(OUT_BC,40,-100); Wait(1400);Off(OUT_BC);Wait(300);OnFwdSync(OUT_BC,40,0);Wait(500);Off(OUT_BC);n++;  //交差点での動作。動作を実行し終わった後にnの値が1増える
 #define XrdST OnFwd(OUT_C,40);Wait(1000);OnFwdSync(OUT_BC,40,0);Wait(200);n++;
**アームの上げ下げ [#qdffd117]
 #define armup OnFwd(OUT_A,25);Wait(700);Off(OUT_A);//アームを上げる
 #define armdown OnRev(OUT_A,25);Wait(700);Off(OUT_A);//アームを下げる
 #define oto PlaySound(SOUND_CLICK);Wait(600);Wait(1000);//音を鳴らす
**センサーとタイマーの起動 [#eb19429c]
 task main()
 {
  SetSensorLight(S1);//光センサー起動
  int n=0;  //nの値を決める。
  long t0 = CurrentTick();//時間を測り始める直前の時刻をt0に代入する
  armup//アームを上げる
まず、タイマーと光センサーを起動させる。nについては後程説明する。
まず、タイマーと光センサーを起動させる。
**nの値について [#de52b4f1]
自分のロボットが走るコースにはP,Q,Q,R,P,Sの順に交差点またはT字路がある。今回は交差点やT字路に差し掛かった時にnの値によって、動作を変えるようにプログラミングした。1つの交差点での動作が終了するとnの値が1つ増えるようにした。
  while(n<7){
  t0 = CurrentTick();
  while(CurrentTick()-t0<600){  //CurrentTick()とt0の差が0.6秒以下の時
   if(SENSOR_1>42){  //もしセンサーの値が42以上だったら左に旋回してタイマーをリセット
     senkaileft
     t0 = CurrentTick();
    }

   else if(SENSOR_1>40){  //もしセンサーの値が40以上なら左に曲がりタイマーをリセット
     turnleft
     t0 = CurrentTick();
    }
                         
   else if(SENSOR_1>38){   //もしセンサーの値が38以上なら前進してタイマーをリセット
     gomae
     t0 = CurrentTick();
    }

   else if(SENSOR_1>37){  //もしセンサーの値が37以上なら右に曲がりタイマーをリセット
     turnright
     t0 = CurrentTick();
    }
   else{
     senkairight
     senkairight         //どれでもなければ右に旋回
    }
   }
  Off(OUT_BC);
nの値が7以下で、CurrentTick()とt0の差が0.6秒以下の時それぞれの条件によって右に曲がったり左に曲がったりまっすぐ進むことによりラインをたどることができる。



  while(n==6){
  while(n==6){   //T字路なので音を鳴らさない
       XrdST
       Off(OUT_BC);
       armup
       OnFwdSync(OUT_BC,40,0);
       Wait(300);
       n++;
       }
アームを上げてそのまま本体で押し込んでシュート
   while(n==5){
      SR
ゴールにあるT字になったところを読み取った後、アームを上げてそのまま本体で押し込んでシュートする。
   while(n==5){  //T字路なので音を鳴らさない
      senkairight
     Wait(700);
     n++;  //変えた
        }
   while(n==4){
       XX
       oto   //音を鳴らす
       XrdST
        }
   while(n==3){
   while(n==3){   //T字路なので音は鳴らさない
       XrdTR
        }
   while(n==2){
       XX
       oto   //音を鳴らす
       XrdST
        }
   while(n==1){
       XX
   while(n==1){    //nが1の時
       oto      //音を鳴らす
       XrdST
        PlaySound(SOUND_CLICK);
        PlaySound(SOUND_CLICK);  //音を鳴らす
        Wait(500);
       t0 = CurrentTick();
       while(CurrentTick()-t0<6000){
       if(SENSOR_1>42){
        SL
       t0 = CurrentTick();     //タイマーを使う
       while(CurrentTick()-t0<6000){   //CurrentTick()とt0の差が0.6秒以下の時
       if(SENSOR_1>42){    //センサーの値が42以上なら左に旋回
        senkaileft
        }
       else if(SENSOR_1>40){
       else if(SENSOR_1>40){      //センサーの値が40以上なら左に曲がる
        turnleft
        }
       else if(SENSOR_1>38){
        GF
       else if(SENSOR_1>38){  //センサーの値が38以上なら前進
        gomae
        }
        else if(SENSOR_1>37){
        else if(SENSOR_1>37){   //センサーの値が37以上なら右に曲がる
         turnright
        }
       else{
        SR
       else{               //どれでもなければ右に旋回
        senkairight
        }
        }
       Off(OUT_BC);
       Wait(500);
       armdown
        }
  while(n==0){
       XX
       XrdST  //変えた
  while(n==0){  //nの値が0の時十字路に到達
       oto      //音を鳴らす
       XrdST     //
        }
 }
 }
*感想 [#u6f66e06]
今回の課題はまず黒いラインのしきい値を探すのに何回も数値を測って動かしての繰り返を行ったので苦労した。途中でタイヤが空回りして前に進まなくなることがあった。原因はロボットの本体の重心が後ろによっていたので、前輪が浮いてしまっていたからだ。なのでもう少し機械のほうを本体の前側に持っていってたらスムーズに走っていたかもしれない。


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