[[2018a/Member]]

*課題2 [#j074aeb4]

ライントレースを主に指定されたコースについてロボットに指定の動作をさせる.

**コース [#n2c605ed]

#ref(2018a-mission2.png)
-1.Aをスタート
-2.Bを右折
-3.Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
-4.JからKに向かい、Kを直進
-5.Lを直進
-6.Iを左折
-7.Hで一時停止の後、左折
-8.Gで一時停止の後、右折
-9.Fで一時停止の後、右折
-10.Eを直進
-11.Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
-12.Cで一時停止の後、直進
-13.Bを直進
-14.Aで停止
(一時停止の指定がある場所は、1秒間停止すること)

*設計思想 [#g393ad4a]
時間との兼ね合いも考えて.シンプルにミスが起きづらい設計を目指した.
主題がライントレースなので小回りが利く小型の機体がいいと考えた.

*工夫点 [#t0569e1c]

#ref(ダウンロード.png) 

赤外線センサを地面スレスレに置くことで狭い範囲で識別することができるようにしました.これによってプログラムを理論に近い挙動で動かすことができ,連続するプログラムを実行する際,初期位置に関係なく目標の位置からのズレを抑えることができた.

#ref(ダウンロード (1).png) 

カンを掴む機構については四角い枠を上下に動かすだけのシンプルな構造です.はさみ型も考えましたが,挟んだ時にカンが不安定になったり滑り落ちることがあったためこのような形になりました.籠にある程度自由度を持たせていますがカンをつかむ瞬間は地面と平行になるようになっています.ゲージを下す場所も交差点の位置でうまくいくように調整して余計なプログラムを省いた.

#ref(ダウンロード (2).png)
この機体も後輪についてミッション1同様2×2で自由度を持たせることによって回転時などにトラブルが起こりにくいようにしました.軸を大きく取ることによって,急カーブ時にも余計なプログラムを書かずとも問題を怒らないようにした.

#ref(ダウンロード (3).png)
重量のある本体をブロックで固定するのでは剛性に限界があるので,半ばモーターの上に乗せるような形にし加速度が生じるときの安定性を高めました.

**反省点 [#jdd73d16]
・カンを持ちあげる部分について,ただの四角いゲージでは下部を支えて引きづるような形になり,落とす事故が多発したためゲージの機構についてももう少し議論して,高さをつけるべきであった.

・カンを認識する動作をかなり微調整に頼ったため,失敗することが多かった.確実性の高い方法や,超音波センサを使うべきであった.

・主な移動手段のライントレースについては速度の遅さを除いて良好であった.

**プログラム [#g8008c8f]

 #define turnL OnFwd(OUT_A,30); OnFwd(OUT_B,-20):            // 左折
 #define turnR OnFwd(OUT_A,-20); OnFwd(OUT_B,30);            // 右折
 #define armUP OnFwd(OUT_C,-20); Wait(1500); Off(OUT_C);     // アーム上げ
 #define armDW OnFwd(OUT_C,20); Wait(1500); Off(OUT_C);      // アーム下げ

 task main()
 {
   SetSensorLight(S2);

   long t0 = CurrentTick();
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnR;
     } else {
        turnL;
        t0 = CurrentTick();                           
      }
   }
   }                                    //AからBまでライントレース
   OnFwd(OUT_B,20);
   Wait(500);
   Off(OUT_B);
   Off(OUT_B);             //Bで右折
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnR;
     } else {
        turnL;
        t0 = CurrentTick();                //ライントレース
        t0 = CurrentTick();                //Jまでライントレース
      }
   }
   Off(OUT_AB);
   Wait(1000);               //Jで一時停止
   armDW
   armDW                 //空き缶をキャッチ
   OnFwd(OUT_AB,-20);
   Wait(500);
   Wait(500);               //Jにもどる
  repeat(2){ 
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   }                   
   OnFwd(OUT_AB,20);
   Wait(500);         
  }
   while (CurrentTick()-t0 <= 300) {    //Iで左折
  }                                      //JからK、KからLを通過
   while (CurrentTick()-t0 <= 300) {    
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   }                   //Iまでライントレース
   OnFwd(OUT_A,20);
   Wait(500);
   Off(OUT_A);
   while (CurrentTick()-t0 <= 300) {    //Hで左折
   Off(OUT_A);              //Iを左折
   while (CurrentTick()-t0 <= 300) {   
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   Off(OUT_AB);              //Gで右折
   }                   //Hまでライントレース
   Off(OUT_AB);             
   Wait(1000);
   OnFwd(OUT_A,20);
   Wait(500);
   Off(OUT_A);
   Off(OUT_A);              //Hで一時停止後左折
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   Off(OUT_AB);             //Fで右折
   }                  //Gまでライントレース
   Off(OUT_AB);            
   Wait(1000);
   OnFwd(OUT_B,20);
   Wait(750);
   Off(OUT_B);
   Off(OUT_B);             //Gで一時停止後右折
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnR;
     } else {
        turnL;
        t0 = CurrentTick();            
      }
   }
   }                  //Fまでライントレース
   Off(OUT_AB);
   Wait(1000);
   OnFwd(OUT_B,20);
   Wait(500);
   Off(OUT_B);
   Off(OUT_B);             //Fで一時停止後右折
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnR;
     } else {
        turnL;
        t0 = CurrentTick();            
      }
   }
   }                  
   OnFwd(OUT_AB,20);
   Wait(500); 
   Off(OUT_AB);
   Off(OUT_AB);                        //Eまでライントレース後直進
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnR;
     } else {
        turnL;
        t0 = CurrentTick();            
      }
   }
   Off(OUT_AB);              //カン挟む
   Wait(1000);
   Off(OUT_AB);            
   Wait(1000);            //Dまでライントレース後一時停止
   OnFwd(OUT_A,20);
   Wait(500);  
   Off(OUT_A); 
   armUP
   armUP               //空き缶を置く
   OnFwd(OUT_B,20);
   Wait(500);  
   Off(OUT_B); 
   Off(OUT_B);             //Dに戻る
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   }                 //Cまでライントレース
   Off(OUT_AB);
   Wait(1000);
   OnFwd(OUT_AB,20);
   Wait(500); 
   Off(OUT_AB); 
   Wait(500);             
   Off(OUT_AB);            //Cで一時停止後直進
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   }                 
   OnFwd(OUT_AB,20);
   Wait(500); 
   Off(OUT_AB); 
   Off(OUT_AB);            //Bまでライントレース後直進
   while (CurrentTick()-t0 <= 300) {
     if (SENSOR_2 < 40){
        turnL;
     } else {
        turnR;
        t0 = CurrentTick();            
      }
   }
   Off(OUT_AB);
   Off(OUT_AB);            //Aで停止

・ライントレースの際白か黒の二択で定義したため動きが小刻みになり,移動速度が異常にそかった.
・超音波センサをうまく利用できればプログラムをかなり簡潔にできたと思う.カンの位置を手動のプログラムで行ったため,今くいかないことが多く調整にもかなりの時間を要した.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS