2016a/Member

課題2 ライントレース 

目次

ロボット本体の説明

ロボットに関しては説明書の通りに作った。 二つのモーターをつないだ前輪と、モーターをつないでいない後輪を基礎として、前方に光センサーをつけた。 また、右側のタイヤはAに、左のタイヤはCに、光センサーは1に接続した。

robo2f2.png
robo2f3.png

コース

下図の右上からスタートして 左上のゴールへと赤い線の通りに進むコースである

robo2f4.png

プログラムの説明

定義のプログラミング

 #define THRESHOLD 45
 #define SPEED_HIGH 35
 #define SPEED_LOW 30
 #define turn_left OnFwd(OUT_A,SPEED_HIGH);Off(OUT_C);
 #define turn_left1 OnRev(OUT_C,SPEED_LOW);OnFwd(OUT_A,SPEED_LOW);
 #define turn_right Off(OUT_A);OnFwd(OUT_C,SPEED_HIGH);
 #define turn_right1 OnRev(OUT_A,SPEED_LOW);OnFwd(OUT_C,SPEED_LOW);
 #define turn_right2 OnFwd(OUT_A,50);OnFwd(OUT_C,10);Wait(200);Off(OUT_AC); 
 #define STEP 1
 #define nMax 140
 #define short_break Off(OUT_AC);Wait(1000);
 #define go_forward OnFwd(OUT_AC,SPEED_HIGH); 

main以下

task main ()
{
     SetSensorLight(S1);
     int nOnline=0;
     long t0 = CurrentTick();
  
     while(CurrentTick()-t0<33000)                //33秒間続ける ※1
     {
         while (nOnline < nMax)
         {
             if (SENSOR_1 < THRESHOLD-10) { //左旋回、カウンターを増やす
                 turn_left1;
                 nOnline++;
             }
             else if (SENSOR_1 < THRESHOLD-7) { //左折
                 turn_left;
                 nOnline=0;
             }
             else if (SENSOR_1 < THRESHOLD+7) { //前進
                 go_forward;
                 nOnline=0;
             }
             else if (SENSOR_1 < THRESHOLD+15) { //右旋回
                 turn_right1;
                 nOnline=0;
             }
             else {                              //その他の場合は右折
                 turn_right;
                 nOnline=0;
             }
             Wait(STEP);
         }
         PlaySound(SOUND_UP);   // 高くなる音
         short_break; //1秒間の停止
         OnFwd(OUT_C,50);
         OnFwd(OUT_A,10);
         Wait(300);
         Off(OUT_AC); //右へ旋回する
         PlaySound(SOUND_DOWN); // 低くなる音
         nOnline=0;
     }
     Wait(2000);
     PlaySound(SOUND_UP);   // 高くなる音
     while(true){  //※2
         while (nOnline < nMax) 
         {
             if (SENSOR_1 < THRESHOLD-10) { //左旋回、カウンターを増やす
                 turn_left1;
                 nOnline++;
             }
             else if (SENSOR_1 < THRESHOLD-7) { //左折
                 turn_left;
                 nOnline=0;
             }
             else if (SENSOR_1 < THRESHOLD+7) { //前進
                 go_forward;
                 nOnline=0;
             } 
             else if (SENSOR_1 < THRESHOLD+15) { //右旋回
                 turn_right1;
                 nOnline=0;
             }
             else {                                //その他の場合は右折
                 turn_right;
                 nOnline=0;
             }
             Wait(STEP);
         }
         PlaySound(SOUND_UP);   // 高くなる音
         short_break; //1秒間の停止
         turn_right2;
         PlaySound(SOUND_DOWN); // 低くなる音
         nOnline=0;
     }
}

各プログラムの説明

while(CurrentTick()-t0<33000) //※1

まずはじめにこのwhile内の動作を33秒間させることにした。 また、この間は交差点を察知すると直進するようなプログラムになっている

while(true) //※2

33秒たった後に動かせるプログラム 実際はこれも時間で区切りたかったのだがよく分からずtrueを使ってしまったことで永遠にループしてしまい他のプログラムをうまく動かせなかったのは反省点

工夫した点

ところどころ音を鳴らすことでプログラムが間違っていないか確認できたことは良かった また、光センサーの基準の値を定義することで変更する箇所を減らせたのも良かった。

反省点

どうしてもサブルーチンができなかった。 そのまま、サブルーチンのなかに入れてもエラーが起こってしまい直すことができなかった。 次の課題をするときには使いこなせるようにしたい。

考察・まとめ

良かった点

高い確率でゴールまで行けたことは良かった。 また、図を協力してきれいに描けたので誤作動がほとんどなかったのは良かったと思う。

悪かった点

ゴールまではたどり着けたのだが、サブルーチンなど使いこなせていないプログラミングの要素があったのは反省点であると思う。 次の課題に向けて克服していければ良いなと思う。


添付ファイル: filerobo2f4.png 102件 [詳細] filerobo2f3.png 93件 [詳細] filerobo2f2.png 89件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-04 (木) 21:39:20 (1108d)