[[2013a/Member]]

#contents


*課題について [#h55e0b9d]
*課題について [#w301accd]
-ライントレースを行いつつ、空き缶を運搬する。コースは下図の通り。
#ref(2013a/Member/donky/Mission1/IMG_0217.JPG,10%,コース図)



*ロボット本体紹介 [#r9818b6b]
*ロボット本体紹介 [#ubc72b3d]

**ロボットの特徴 [#t697f73d]
**ロボットの特徴 [#t8df27a4]

-1巨大なアームと下あご
#ref(2013a/Member/donky/Mission1/IMG_0220.JPG,10%,ハサミ部分)
空き缶を保持したままライントレースするために巨大なアームを取り付けました。

-2本体を安定させるための重り
#ref(2013a/Member/donky/Mission1/IMG_0219.JPG,10%,ロボット本体)
ロボット本体後部に取り付けている緑の部品は、巨大なアームによるロボット本体の前かがみ現象を解決するために装着しました。

*コース攻略法 [#hef2ecf0]
*コース攻略法 [#d8eeb012]

**1 垂直カーブ部分 [#v297bc0a]
**1 垂直カーブ部分 [#ic4141ac]
右折のプログラムを二種類に分けることで素早く稼動できる。
**2 交差点部分 [#t0351beb]
**2 交差点部分 [#ye46f503]
交差点判別のプログラムの他に、急左折のあとに前進のプログラムを組むことで交差点を素早く突破できることが判明、タイマーによりプログラムを変えることで実用できた。
**3 急カーブ部分 [#h8f38049]
**3 急カーブ部分 [#d413c952]
急カーブではロボットが脱線することが多かったのでタイマーを使い急カーブ部分で細かく敷居値を判定するプログラムに切り替えて対応した。
**4 空き缶運搬 [#e5a743bf]
**4 空き缶運搬 [#m953ceb6]
タイマーでアームに取り付けたモーターを稼働させ、空き缶の保持と設置のプログラムを稼働させた。

*プログラムの説明 [#j8332b9f]

*まとめ [#i1116d42]
**課題について [#d868bee8]
*プログラムの紹介 [#v88611c8]
 #define THRESHOLD 45
 #define HIPOWER 7
 #define LOWPOWER 1
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 
 #define go_forward set_power_H; OnFwd(OUT_AC);
 
 #define turn_left_A set_power_L; OnFwd(OUT_C); OnRev(OUT_A);
 #define turn_left_B set_power_L; OnFwd(OUT_C); Off(OUT_A);
 
 #define turn_right_A set_power_L; OnFwd(OUT_A); OnRev(OUT_C);
 #define turn_right_B set_power_L; OnFwd(OUT_A); Off(OUT_C); 
 
 #define STEP 1
 
 #define nMAX 8  
 #define short_break Off(OUT_AC); Wait(100);
 #define CROSS_TIME 20
 #define cross_line go_forward; Wait(CROSS_TIME); short_break; 
 
  task main()
 {
    SetSensor(SENSOR_2, SENSOR_LIGHT);
 
     ClearTimer(0);
 
    int nOnline=0;
    
    while (FastTimer(0) <= 1000) {
       if (SENSOR_2 < THRESHOLD -3){
          turn_left_A;
          
 
       } else if (SENSOR_2 < THRESHOLD -1){
          turn_left_B;
 
       } else if (SENSOR_2 < THRESHOLD +3){
          go_forward;
 
       } else if (SENSOR_2 < THRESHOLD +7){
          turn_right_B;
 
       } else {
          turn_right_A;
         }
       
     }
   
 
 
    Off(OUT_AC);
    OnRev(OUT_B);
    Wait(100);
    Off(OUT_B);
 
 
    PlaySound(SOUND_FAST_UP);
    
    while (FastTimer(0) <= 3950) {
      
       if (SENSOR_2 < THRESHOLD -7) {
          turn_left_A;
          go_forward;
          
         } else {
           if (SENSOR_2 < THRESHOLD -5) {
              turn_left_B;
           } else if (SENSOR_2 < THRESHOLD +4) {
              go_forward;
           } else if (SENSOR_2 < THRESHOLD +5) {
              turn_right_B;
           } else {
              
              turn_right_A;
              }
              nOnline=0;
           }
         Wait(STEP);
     }
    
    
    OnRev(OUT_B);
    Wait(30);
    Off(OUT_B);
 
    PlaySound(SOUND_FAST_UP);
     
   
    while (FastTimer(0) <= 4700) {
       if (SENSOR_2 < THRESHOLD -3){
          turn_left_A;
 
       } else if (SENSOR_2 < THRESHOLD -1){
          turn_left_B;
 
       } else if (SENSOR_2 < THRESHOLD +3){
          go_forward;
 
       } else if (SENSOR_2 < THRESHOLD +7){
          turn_right_B;
 
       } else {
          turn_right_A;
          }
    Wait(STEP);   
    }  
 
    OnRev(OUT_B);
    Wait(30);
    Off(OUT_B);
 
    PlaySound(SOUND_FAST_UP);
 
 
   while (FastTimer(0) <= 6700) {
       if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD -7)) {
          turn_left_A;
          nOnline++;
         } else {
           if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD -5)) {
              turn_left_B;
           } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD +4)) {
              go_forward;
           } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD +5)) {
              turn_right_B;
           } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD +10)) {
              turn_right_A;
              }
           nOnline=0;
           } if (nOnline >= nMAX) {
             short_break;
             turn_right_B; Wait(nMAX*STEP);
             cross_line;
             nOnline=0;
           }
   }
 
    OnFwd(OUT_A);OnRev(OUT_C);Wait(350);
    Off(OUT_AC);
    OnFwd(OUT_B);
    Wait(100);
    OnRev(OUT_AC);Wait(150);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(200);
 
    
    
 
 
 
 
     
 
    PlaySound(SOUND_FAST_UP);
     
   
    while (true) {
       if (SENSOR_2 < THRESHOLD -3){
          turn_left_A;
 
    } else if (SENSOR_2 < THRESHOLD -1){
          turn_left_B;
 
    } else if (SENSOR_2 < THRESHOLD +3){
          go_forward;
 
    } else if (SENSOR_2 < THRESHOLD +7){
          turn_right_B;
 
    } else {
          turn_right_A;
     }
    Wait(STEP);   
    }  
 
 
 }
 
*まとめ [#s9aa44f5]
**課題について [#n1014589]
結果として課題攻略には失敗してしまいました。(練習時には成功有り)
***原因の考察 [#w9d6f661]
***原因の考察 [#m5ef1c1d]
-タイマーの多用
タイマーを多用しすぎたために時間が少しずれると関連して他のプログラムまで動作がずれてしまっていた。タイマーを使用する際は短い時間かつカウント開始条件を指定することが大切だと思う。
-アームの固定力
アームの固定力が少し弱かった。もっとコンパクトな設計を心掛けたい。


**感想 [#v93464aa]
**感想 [#u8529aeb]
いろいろと失敗してしまったので悔しいです。しかし改善点やプログラミングのコツなど、失敗することで多くのものを吸収できました。次回の課題では確実に動作するプログラミングを作成するために取り組んでいきたいです。



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