*目次 [#pdbe1a7d]
#contents
*課題について [#s030a29a]
課題2は光センサーを使ったライン・トレース・ロボットの製作。

コースは以下の通り(課題2のページより)
#ref(./コース.png,50%)
-A地点からB地点へ (P三叉路およびQ交差点はともに直進)
-B地点からA地点へ (Q交差点では直進、P三叉路では直進)
-C地点からA地点へ (Q交差点では直進、P三叉路では右折)

また、これらの経路の途中(PQ間)においたボールをゴールまで運ぶこと。三叉路および交差点では二秒間停止すること。

今回は、B地点からA地点のコースとする。
*ロボット本体について [#j1672ef1]
タッチセンサをつけると邪魔になりそうだったので、つけないことにした。

アームはモーターAで動かす。BCは移動用に使った。

アームは上からボールにかぶせる形にした。
*プログラムについて [#z4ee3701]
**ライントレース [#hb0a73c2]
一番初めに組んだもの。五段階に光を分けた。
 #define hikari 50
 #define SPEED1 55
 #define SPEED 25
 
 #define turn_left OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);
 #define TURN_LEFT OnFwd(OUT_B,SPEED);
 #define go_forward OnFwd(OUT_BC,SPEED1);
 #define TURN_RIGHT OnFwd(OUT_C,SPEED);
 #define turn_right OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);
 
 #define STEP 1
 
 task main(){
 
    SetSensorLight(S3);
 
    while(true){
 
     if(SENSOR_3<hikari -7){
       turn_left;
     }else if(SENSOR_3<hikari -3){
       TURN_LEFT;
     }else if(SENSOR_3<hikari +3){
       go_forward;
     }else if(SENSOR_3<hikari +10){
       TURN_RIGHT;
     }else{
       turn_right;
     }
 
    }
 
 }
この時、ロボットは線の左端をなぞった。

このプログラムは、ただただライントレースのみを速く調整したいときに使えると思い、単純だが載せておこうと思った。
**交差点・三叉路 [#k3c8fb05]
交差点や三叉路の判定にはカウンターを使うことにした。

また、上のプログラムではコースをうまくなぞらなかったので、線の右端をなぞるようにした。(回転方向を反転させた)

追加の定義
 #define nMAX 175
 #define sofa Off(OUT_BC);Wait(200);
 #define CROSS_TIME 200
 #define cross_line OnFwd(OUT_BC,SPEED);Wait(CROSS_TIME);sofa;
交差点を渡るようにしたプログラム
 task main()
 {
    SetSensorLight(S3);
    int nOnline=0;
 
   while(true){
 
    while(nOnline<nMAX){
      if(SENSOR_3<hikari -7){
        turn_right;
        nOnline++;
      }else{
        if(SENSOR_3<hikari -3){
          TURN_RIGHT;
        }else if(SENSOR_3<hikari +3){
          go_forward;
        }else if(SENSOR_3<hikari +10){
          TURN_LEFT;
        }else{
          turn_left;
        }
      nOnline=0;
      }
     Wait(STEP);
    }
 
   sofa;
   turn_left;Wait(nMAX*STEP);
   cross_line;
   nOnline=0;
   }
 
 }
**ボールを運ぶ [#qf87d8a7]
一度上のように分けて考えたので、なるべくその形を生かせるようにプログラムを組もうと思った。

プログラムは、交差点と判断した回数を数えてそれにより変化させた。一回目でボールをつかみ、三回目でシュートさせることにした。そのため、ボールを交差点を通過してすぐのところに置くこととし、少し楽をした。


上の続きであるが、最初の塊は重複している。
  sofa;
  turn_left;Wait(nMAX*STEP);
  cross_line;
  nOnline=0;
 
  nKousa++;
  if(nKousa=1){
    catch;
  }else if(nKousa>=3){
    shoot;
    Off(OUT_ABC);
  }
 
  }
 }

 #define catch sofa;OnFwd(OUT_A,SPEED);Wait(300);sofa;
 #define shoot sofa;OnRev(OUT_BC,SPEED);Wait(300);OnRev(OUT_A,SPEED);\
      Wait(300);OnFwd(OUT_BC,SPEED+10);Wait(300);
*感想 [#bfb90857]
どちらかのタイヤと、光センサーを近づければ、回転半径が左右で異なるので、また違うのではないかと思った。

もっと速く動かせるように改良したい。


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