課題

2017a-mission2.png

今回私はE地点直進コースを選択したのでコースは以下のとおりである。

◦Aスタート

◦E直進

◦F(SOUND_UP)

◦Q一時停止(SOUND_DOWN)&左折

◦R直進(SOUND_UP)

◦S左折(SOUND_UP)

◦G(SOUND_UP)

◦H(SOUND_UP)

◦T一時停止(SOUND_DOWN)&直進

◦T一時停止(SOUND_DOWN)&直進

◦R一時停止(SOUND_DOWN)&左折

◦S直進(SOUND_UP)

◦P左折(SOUND_UP)

◦E一時停止(SOUND_DOWN)&左折

◦A停止(SOUND_DOWN)

ロボット

IMG_0305.JPG

主な構造は見本のものと同様だが、光センサーの位置をタイヤの軸上に近づけてプログラムでの調整しやすくした

サブルーチン

線の左側を走行する 

黒の線の左側をなぞって走行する。 白紙の時は変数X=0にリセット、線と白紙の境目の時には何もしない、線上の時は変数Xに1足す。変数Xが99になった場合交差点と認識する。

sub left_1()
{
int x=0;
     while(x<100){
          if(SENSOR_1>56){
               OnFwd(OUT_C,35); 
               OnRev(OUT_A,20);
               x=0;
          }
          else if(SENSOR_1>45){
               OnFwd(OUT_C,30);
               OnFwd(OUT_A,1);
               x=0;
          }
          else if(SENSOR_1>39){
               OnFwd(OUT_C,1);
               OnFwd(OUT_A,30);
          }
          else{
               OnFwd(OUT_A,35);
               OnRev(OUT_C,20);
               x=x+1;
          }                                
     }                                                            
}

線の右側を走行する

黒の線の右側をなぞって走行する。 白紙の時は変数X=0にリセット、線と白紙の境目の時には何もしない、線上の時は変数Xに1足す。変数Xが99になった場合交差点と認識する。

sub right_1()
{
int x=0;
     while(x<100){
          if(SENSOR_1>56){
               OnFwd(OUT_A,35); 
               OnRev(OUT_C,20);
               x=0;
          }
          else if(SENSOR_1>45){
               OnFwd(OUT_A,30);
               OnFwd(OUT_C,1);
               x=0;
          }
          else if(SENSOR_1>39){
               OnFwd(OUT_A,1);
               OnFwd(OUT_C,30);
          }
          else{
               OnFwd(OUT_C,35);
               OnRev(OUT_A,20);
               x=x+1;
          }                                
     }                                                            
}

傾いた機体を戻す

交差点を認識する際に傾いた車体を時計回りに回すことで元に戻す

sub hukki_1()
{
    Off(OUT_AC);
    OnRev(OUT_A,30);
    OnFwd(OUT_C,60);
    Wait(300);
}

線を飛び越える

左なぞりから右なぞりに変えるとき線を飛び越えるため前に少し走行する

sub hukki_2()
{
    Off(OUT_AC);
    OnFwd(OUT_AC,40);
    Wait(200);
}

sounddownを鳴らす一連の動作

sounddownの際は停止をしなくてはならないので一連の動作をまとめた

sub sounddown()
{
   PlaySound(SOUND_DOWN);
   Off(OUT_AC);
   Wait(1000);
}

メインタスク

task main ()
{
   SetSensorLight(S1);
   left_1();
   PlaySound(SOUND_UP);  //F通過
   Wait(500);
   left_1();
   Wait(200);
   sounddown();      //Q一時停止&左折
   left_1();
   PlaySound(SOUND_UP);   //R通過
   hukki_1();
   left_1();
   PlaySound(SOUND_UP);   //S左折
   left_1();
   PlaySound(SOUND_UP);   //G通過
   Wait(300);
   hukki_1();
   right_1();
   hukki_2();
   left_1();
   PlaySound(SOUND_UP);   //H通過
   Wait(300);
   left_1();
   sounddown();           //T一時停止&直進
   hukki_1();
   left_1();
   sounddown();           //T一時停止&直進
   hukki_1();
   left_1();
   Wait(300);
   sounddown();           //R一時停止&左折
   left_1();
   PlaySound(SOUND_UP);   //S通過
   Wait(100);
   hukki_1();
   left_1();
   Wait(200);
   PlaySound(SOUND_UP);   //P左折
   left_1();
   sounddown();           //E一時停止&左折
   hukki_2();
   right_1();
   sounddown();           //A停止
}

今回の課題を通して

難しかった点

線に濃淡があるため線をなぞる際に使用するif関数の数値や交差点を認識するためのwhileの数値の調整が難しかった。

工夫した点

微調整のサブルーチンhukki_1,hukki_2を使うことによってメインタスクをコンパクトにしながらもサブルーチンを5つで済ますことに成功した。また、交差点を急なカーブで誤認しないように右なぞりと左なぞりで分けた。


添付ファイル: fileIMG_0305.JPG 219件 [詳細] file2017a-mission2.png 163件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-19 (土) 01:02:31