[[2016a/Member]]

*課題2 ライントレース [#hee4f6c3]

**目次 [#p3cf045b]
#contents

**ロボット本体の説明 [#ebe8cc83]

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

#ref(robo2f2.png)
#ref(robo2f3.png)

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


#ref(robo2f4.png)

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

***定義のプログラミング [#ia63d7a2]
  #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以下 [#l10113c6]
 task main ()
 {
      SetSensorLight(S1);
      int nOnline=0;
      long t0 = CurrentTick();
   
      while(CurrentTick()-t0<33000)                //33秒間続ける
      while(CurrentTick()-t0<33000)                //33秒間続ける ※1
      {
          while (nOnline < nMax) {
          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){
          while (nOnline < nMax) {
      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;
      }
 }

***各プログラムの説明 [#kcd7fccf]
 while(CurrentTick()-t0<33000) //※1
まずはじめにこのwhile内の動作を33秒間させることにした。
また、この間は交差点を察知すると直進するようなプログラムになっている

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


***工夫した点 [#m9d3473b]
ところどころ音を鳴らすことでプログラムが間違っていないか確認できたことは良かった
また、光センサーの基準の値を定義することで変更する箇所を減らせたのも良かった。
***反省点 [#x8174140]
どうしてもサブルーチンができなかった。
そのまま、サブルーチンのなかに入れてもエラーが起こってしまい直すことができなかった。
次の課題をするときには使いこなせるようにしたい。
**考察・まとめ [#a4620892]

***良かった点 [#lc12a723]
高い確率でゴールまで行けたことは良かった。
また、図を協力してきれいに描けたので誤作動がほとんどなかったのは良かったと思う。
***悪かった点 [#b2b5535a]
ゴールまではたどり着けたのだが、サブルーチンなど使いこなせていないプログラミングの要素があったのは反省点であると思う。
次の課題に向けて克服していければ良いなと思う。

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