[[2009]]

*課題2 ライントレースロボットを作る [#qcba8fc1]
A11R タイラー/ピーチクパーチク~
#contents
**ロボット [#h779cce3]

***車体 [#p2c45fc8]
#ref(main.JPG)~
車輪は基本的にローヴァーロボットの幅をつめたもの。~
ローヴァーロボットとの最大の違いは、ギアを縦に組んだこと。~
車高を高くすることで安定感が失われるが、光センサーを仕込みやすくコンパクトな仕上がりとなった。~
前方に伸びた拡張パーツに、センサーやアームを装着する仕組み。

***タッチセンサー [#ibfeb330]
#ref(bamp1.JPG)~
説明書26pのシングルバンパーをほぼそのまま使用したところ、反応しなかった。~
そのため、テコの原理を利用して長いアームのセンサーを作成。~
#ref(bamp2.JPG)
#ref(bamp3.JPG)~
交差点上の牛乳パックをこれで感知する。~


***光センサー [#s27b9c2c]
車輪のすぐ前方に装着。センサーを真下に向けることで正確な場所感知を可能に。~
#ref(light.JPG)

***アーム [#x6cce186]
#ref(arm1JPG.JPG)~
ギアとモーターを直接繋いだアーム。牛乳パックをこれで移動させる。~
白ギアの装着により、アームに負荷がかかってもモーターに悪影響を与えない仕組み。~
しかしシンプルな構造だが脆い。車体への取り付けも不安定。~
#ref(arm2.JPG)

***キャスター [#e0833c33]
重くなる前方部分を支えるためのキャスター。~
p46のキャスターや、回転軸と固定位置を同じにしたキャスターを作ってみた。~
が、安定性の問題でうまくいかず、先輩の意見をもとに車輪でなく支え棒を作成。~
しかし、ロボット自体の重さゆえ堅牢性に欠ける。~
そんなわけでシンプルなキャスターを二つ作った。それぞれを拡張パーツの左右に装着。~
#ref(cas1.JPG)
#ref(cas2.JPG)

***調整 [#of9d5627]
#ref(bamp5.JPG)
#ref(cas3.JPG)~
タイヤが大きすぎて不安定だったので小さくした。~
そのためキャスターもゴムを取り外しコンパクト化。小回りが利くようになった。

***完成 [#x5e75ece]
#ref(comp.JPG)~
なんだかカブトムシにクワガタムシを足したような外見になった。

**コース [#td8c7c25]
***コース1 [#o04034f2]
#ref(course1.JPG)~
交差点:3~
紙の端や交差点が狭い。
***コース2 [#a6ffdafc]
#ref(course2.JPG)~
交差点:3~
コース1の改良版。~
交差点や紙の端など細かいところを改良。


**プロブラム [#ka9d6769]

***1:紙パックをもとの位置に戻したのちコースに戻って進む [#s1680104]
作成:ピーチクパーチク~
~
牛乳パックをよけて進むのはコース的に難しそうだったので、~
アームを使ってパックを退かす方向性でプログラムを組んだ。

 #define gs(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); //(t)だけ直進
 #define gb(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); //(t)だけ後退
 #define gs2 OnFwd(OUT_A+OUT_C); //直進
 #define close OnRev(OUT_B);Wait(40);Off(OUT_B); //アームを閉じる
 #define open OnFwd(OUT_B);Wait(40);Off(OUT_B); //アームを開く
 #define THRESHOLD 40 //しきい値
 int x = 0; //変数xを定義
  
 task main()
 { 
 	SetSensor(SENSOR_2,SENSOR_TOUCH);
 	SetSensor(SENSOR_1, SENSOR_LIGHT);
 	SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー定義	
 	SetPower(OUT_A+OUT_C,5); //トルク調整
	SetPower(OUT_A,5);
	SetPower(OUT_C,5); //トルク調整
 
      while (true) {
 	gs2
 	OnFwd(OUT_B); //常にアーム開き続ける
 
     //ライントレースプログラム
         if (SENSOR_1 < THRESHOLD) {
             OnRev(OUT_A);
             Wait(2);
             OnFwd(OUT_A);
         } else if (SENSOR_3 < THRESHOLD) {
             OnRev(OUT_C);
              Wait(2);
             OnFwd(OUT_C);
         } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {
             gs(20)
       x = x + 1; //xにx+1を代入
 
     //障害物の感知
         }else if (SENSOR_2 == 1) {
                 	ClearTimer(0); //タイマーのセット
         		gb(110)
         		gs(70)
  
         //障害物が牛乳パックだったとき
     // =タイマーが5,5秒以内だったとき
         } else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) {
         	Float(OUT_A+OUT_C+OUT_B); 
         	close //アームを閉じる
         	OnRev(OUT_B);
 		gs(120) //前進
 		OnFwd(OUT_C);OnRev(OUT_A); //回転
 		Wait(160);
 		Float(OUT_A+OUT_C);
 		Off(OUT_B);
 		open //アームを開く
 		gb(70); //後退
 		OnFwd(OUT_C);OnRev(OUT_A); //回転
 		Wait(130);
  
     //三周したら自動的に止まる
       // =交差点を7回通る (交差点を通る回数ーパックを運ぶ回数+調整値=7)
         } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x == 7)){
        	Float(OUT_A+OUT_C);
        	break; //while文を終了
        }
         }
 }

***2:紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む [#j981cd9b]
作成:タイラー

 #define THOLD 40
 #define JAW_SPEED  1
 #define DRIVE_SPEED  3
 #define turnWait 4
 int bite = 0;
 int iTurnA = 0;
 int iTurnC = 0;
 int halfwayA = 0;
 int halfwayC = 0;
 int adju = 0;
 
 int intersFakeBool1 = 0;
 int intersFakeBool2 = 0;
 int intersFakeBool3 = 0;
 
 int wlCnt = 0;
 
 void turnAround()
 {
   Off(OUT_A+OUT_C);
 
   while ((iTurnA == 0)||(iTurnC == 0))
   {
      OnFwd(OUT_A);
      OnRev(OUT_C);
      Wait(10);
      Off(OUT_A+OUT_C);
      
      
      if (SENSOR_1 < THOLD)
      {
         halfwayA = 1;
      }
      if (SENSOR_3 < THOLD)
      {
         halfwayC = 1;
      }
 
      if ((halfwayA == 1)&&(halfwayC == 1))
      {
         if (SENSOR_1 > THOLD)
         {
            iTurnA = 1;
         }
         else
         {
          iTurnA = 0;
         }
 
         if (SENSOR_3 > THOLD)
         {
            iTurnC = 1;
         }
         else
         {
         iTurnC = 0;
         }
      }
   }
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(8);
   Off(OUT_A+OUT_C);
   iTurnA = 0;
   iTurnC = 0;
   halfwayA = 0;
   halfwayC = 0;
  }
  //End turnAround()
 
 
 
 void adjust(int backOrFwd)
 {//If foward backOrFwd = 0: if backward  backOrFwd = 1
 
 
     if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))//=============================
     {//Drive Straight if you meet an intersection.
        if(backOrFwd == 0)
        {
           Float(OUT_A+OUT_C);
           OnFwd(OUT_A+OUT_C);
           Wait(turnWait);
           Float(OUT_A+OUT_C);
        }
        else if(backOrFwd == 1)
        {
           Float(OUT_A+OUT_C);
           OnRev(OUT_A+OUT_C);
           Wait(turnWait+5);
           Float(OUT_A+OUT_C);
 
 
        }
     }
     
     
     else if(SENSOR_1 < THOLD)//================================================
     {
         //Right sensor tripped turn left
         if(backOrFwd == 0)
         {
           Off(OUT_A+OUT_C);
           OnFwd(OUT_C);
           Wait(turnWait);
           Off(OUT_C);
           Wait(2);
         }
         else if(backOrFwd == 1)
         {
           //Right sensor tripped turn left
           //PlaySound(0);
           Off(OUT_A+OUT_C);
           OnFwd(OUT_A);
           OnRev(OUT_C);
           Wait(5);
           Off(OUT_A+OUT_C);
           OnFwd(OUT_A+OUT_C);
           Wait(5);
           Off(OUT_A+OUT_C);
         }
     }
     
    
    else if(SENSOR_3 < THOLD)//==============================================
    {
        if(backOrFwd == 0)
        {
           //Left sensor tripped turn right
           Off(OUT_A+OUT_C);
           OnFwd(OUT_A);
           Wait(turnWait);
           Off(OUT_A);
           Wait(2);
        }
        else if(backOrFwd == 1)
        {
           //Left sensor tripped turn right
           //PlaySound(0);
           Off(OUT_A+OUT_C);
           OnRev(OUT_A);
           OnFwd(OUT_C);
           Wait(5);
           Off(OUT_A+OUT_C);
           OnFwd(OUT_A+OUT_C);
           Wait(5);
           Off(OUT_A+OUT_C);
        }
    }
    else
    {
      if(backOrFwd == 0)
      {
         //PlaySound(0);
         OnFwd(OUT_A+OUT_C);
         Wait(5);
         Float(OUT_A+OUT_C);
      }
      else if(backOrFwd == 1)
      {
         //PlaySound(0);
         OnRev(OUT_A+OUT_C);
         Wait(5);
         Float(OUT_A+OUT_C);
      }
    }
  }
 //=============================================================================
 //=============================================================================
 task main()
 {
 
   SetSensor(SENSOR_1,SENSOR_LIGHT); //Right
   SetSensor(SENSOR_2,SENSOR_TOUCH);//Touch Sensor
   SetSensor(SENSOR_3,SENSOR_LIGHT);//Left
 
   SetPower(OUT_A,DRIVE_SPEED);
   SetPower(OUT_B,DRIVE_SPEED);
   SetPower(OUT_C,DRIVE_SPEED);
 
 adju = 0;
  while(true)
  {
  
    if (SENSOR_2 == 1 || bite == 1)
    {
       if(bite == 0)
       {//If first touch milk carton
        //Stop and bite,
        Off(OUT_A+OUT_C);
        Wait(40);
        OnFwd(OUT_B);
        bite = 1;//Let program know bite has occured
      }
      else if(bite == 1)
      {//Run Normally plus keep biting
         OnFwd(OUT_B);
         adjust(adju);
         
         //IF both sensors
         if(SENSOR_1 < THOLD && SENSOR_3 < THOLD && intersFakeBool2 == 1)
         {
            PlaySound(4);
            //OnFwd(OUT_A+OUT_C);
            //Wait(5);
            //Off(OUT_A+OUT_C);
 
            while(wlCnt < 25)
            {
             adjust(adju);
             wlCnt = wlCnt + 1;
            }
            wlCnt = 0;
 
            turnAround();
            OnRev(OUT_B);
            Wait(300);
            while(wlCnt < 5)
            {
              adjust(1);
            }
            wlCnt = 0;
            //OnRev(OUT_A+OUT_C);
            //Wait(30);
            turnAround();
                       
            OnRev(OUT_B);
            intersFakeBool2 = 0;
            bite = 0;
            
         }
         else if(SENSOR_1 < THOLD && SENSOR_3 < THOLD)
         {
            intersFakeBool1 = 1;
            PlaySound(3);
            
            while(wlCnt < 15)
            {
             adjust(adju);
             wlCnt = wlCnt + 1;
            }
            wlCnt = 0;
         }
         else if(intersFakeBool1 == 1)
         {
            PlaySound(1);
            intersFakeBool2 = 1;
         }
                 
      }
   }
   else
   {  //Run Normally
      adjust(adju);
   }
 }
 }

**コメント [#w23da78b]
#comment


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