*コース [#l5e827a1]
トレースするコースは、C地点を出発地点とし、そこから十字路をまっすぐ進み、三叉路を右に曲がってゴール地点であるA地点まで行く、というのである。
#ref(./2015a-mission2.png,50%)
*プログラム [#l46bf864]
**定義 [#wc1fa39e]
今回は繊細な動きが出来るように細かく定義をした。
 #define THRESHOLD 45 //しきい値
 #define SPEED0 25
 #define SPEED1 20
 #define OnRL(r,l) OnFwd(OUT_B,r);OnFwd(OUT_C,l);
 #define GO_STR OnRL(SPEED0,SPEED0);  //直進
 #define LEFT1 OnRL(SPEED1,-SPEED1);  // 左旋回
 #define LEFT0 OnRL(SPEED1,0);         // 左折
 #define RIGHT0 OnRL(0,SPEED1);         // 右折
 #define RIGHT1 OnRL(-SPEED1,SPEED1);  // 右旋回
 #define short_break Off(OUT_BC);Wait(2000); // 小休止
 #define time_cross 150
 #define cross_line OnRL(SPEED1,SPEED1);Wait(time_cross);short_break; //交差点を渡る
 #define arm_close(t) OnRev(OUT_A,30);Wait(t); //アームを閉じる
 #define FinCurve 18324

今回は、速度が速いとカーブがうまく曲がれなかったり、大きく脱線してしまう事が多々あったため、速度は遅めに設定してある。
**本体のプログラム [#raa49e0a]
カウンターやタイマー、論理式を用いて構成されている。又、3分割されているプログラムはカウンターが1増加するごとに実行されるようにした。ちなみに3分割されているコースは、C地点から十字路前、十字路から三叉路、三叉路からA地点である。

 task main()
  {
  SetSensorLight(S3); 
  int BLACK_line=0;
  long t0;
  long t0=CurrentTick();
  while ( if(CurrentTick()-t0 <= FinCurve){n = 0;}) {     //C地点から十字路まで
    
    while(BLACK_line == 0) {               //カウンターが0の時
      if (SENSOR_3 < THRESHOLD-11) {
        LEFT1;
        } else if (SENSOR_3 < THRESHOLD-7) {
        LEFT0;
        } else if (SENSOR_3 < THRESHOLD+7) {
        GO_STR;
        } else if (SENSOR_3 < THRESHOLD+15) {
        RIGHT0;
        } else {
        RIGHT1;
          }
                                }
                                                                   }
  while ( if(ClearTimer()-t0 = FinCurve){n++;}){ //十字路から三叉路まで ここからカウンターはプラス1される
      PlaySound(SOUND_UP);     //十字路に達して、このプログラムに移行した事を報せる音を出す                                          
      Wait(2000);
      short_break; 
      arm_close(3000);
      cross_line;  
     while(BLACK_line == 1){         //カウンターが1の時
       if (SENSOR_3 < THRESHOLD-11) {
        LEFT1;
        } else if (SENSOR_3 < THRESHOLD-7) {
        LEFT0;
        } else if (SENSOR_3 < THRESHOLD+7) {
        GO_STR;
        } else if (SENSOR_3 < THRESHOLD+15) {
        RIGHT0;
        } else {
        RIGHT1;
          }
      Wait(STEP);
       until(BLACK_line == 2)
                                  } 
                                                          }
  while( if(ClearTimer()-t0 < FinCurve){n++;}){ //三叉路からA地点まで
         PlaySound(SOUND_DOWN); //三叉路に達して、このプログラムに移行した事を報せる音を出す
         Wait(2000);
         short_break;
       while(BLACK_line == 2){
        if (SENSOR_3 < THRESHOLD-11) {
         LEFT1;
         } else if (SENSOR_3 < THRESHOLD-7) {
         LEFT0;
         } else if (SENSOR_3 < THRESHOLD+7) {
         GO_STR;
         } else if (SENSOR_3 < THRESHOLD+15) {
         RIGHT0;
         } else {
         RIGHT1;
           }
 }     

*ロボットについて [#r7b9f2f1]
**母機について [#pab89817]
ロボットがこの形になるまでに様々な試作機を製作した。特に苦労したのは、アームの機構が決まった後に本体とどのように組み合わせるかであった。
***光センサー [#i5cab541]
この機体は光センサーを2つの前輪の間に設置してある。ここで、機体と光センサーの距離が離れてしまうとヘアピンカーブのような急カーブを認識するのが難しくなり、曲がる際にこまめに旋回のプログラムをいれなければならなくなってしまう。なので、可能な限りこの距離が短くなるように設置した。
この写真はロボットを下から撮ったものである。真ん中のライトが付いたようなパーツが光センサーである。
#ref(./IMG_2903.JPG,25%)
***後輪 [#c237c719]
前輪はモーターが直接ついており、後輪はその補助輪としての役割を担っている。この時、後輪は柔軟性の優れた動きができるように、360度回転できるような機構を取っている。しかし、この機構は重さに耐性がない事が欠点である。今回のロボットは、パーツの中で最も重量のある本体(ロボットのコンピューター)が、設計上後輪の真上に来てしまっている。これにより、後輪は少し曲がってしまっている。上の写真は後輪で、下の写真はロボットである。この写真からよく分かるように、本体が後輪の真上にある。
#ref(./IMG_2904.JPG,25%) 
#ref(./IMG_2869.JPG,19%)
*アームについて [#af4b8b0b]
今回ボールをつかむ上で様々な機構のアームを考えた。そして結論として、クワガタの様に両側から囲むようなものになった。アームが閉じる機構は、前輪モーターの上にもう一つアームを閉じさせる為のモーターを設置する。そして、パーツをいくつか使用し、モーターの動きが前輪と同じ高さまで下げたアームに連動する様に調節した。
#ref(./IMG_2875.JPG,19%)
*今回の課題に対する感想・反省点 [#za981e89]
正直なところ、ライントレースロボットの製作は書道ロボットよりも難しくはなかった。しかし、プログラムについては今回の方が遥かに難易度が高かった。論理式やカウンター、タイマーに関する習熟度が低かったため、思った通りの動きが出来なかったり、プログラムの不備が見抜けないために何時間もプログラムの転送に時間を費やしてしまった。次回からは、このような事が少なくなるように、よりプログラムを理解したいと思った。


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