2016a/Member

はじめに

下のコースを実際に紙にペンで書き作成した。

黒の線に沿ってライントレースをさせた。

私はB地点からC地点までを担当した。 ◦B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点 2016a-mission2.png

ロボット本体について

説明書通りのシンプルな構造である。

特に工夫した点はない。 robot.jpg

定義

#define THRESHOLD 45

#define SPEED_HIGH 35  //速スピード

#define SPEED_LOW 30 //遅スピード

#define turn_left OnFwd(OUT_C,SPEED_HIGH);Off(OUT_A); //左折

#define turn_left1 OnRev(OUT_A,SPEED_LOW);OnFwd(OUT_C,SPEED_LOW); //左旋回

#define turn_right Off(OUT_C);OnFwd(OUT_A,SPEED_HIGH); //右折

#define turn_right1 OnRev(OUT_C,SPEED_LOW);OnFwd(OUT_A,SPEED_LOW); //右旋回

#define STEP 1  //一回の判断で動く時間

#define nMax 140 //交差点判断

#define short_break Off(OUT_AC);Wait(1000); //1秒間停止

#define go_forward OnFwd(OUT_AC,SPEED_HIGH); //前進

プログラミング

sub crossing_right1()
{
 SetSensorLight(S1); //センサー
 int nOnline=0; //続けて黒になった回数(カウンタ)
 long t0 = CurrenTick();
 while (CurrenTick()-t0 <= 1000) {  //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);
 }
 }
 short_break; //1秒間の停止
 PlaySound(SOUND_CLICK);  //音が出る
 turn_right1; //右へ旋回する
 nOnline=0; //カウンタをリセット
}  
sub crossing_go()
{ 
 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;
      } 
      nOnline=0; //カウンタをリセット
  }
 Wait(STEP);
 }
 short_break; //1秒間の停止 
 PlaySound(SOUND_CLICK); //音がなる
 go_forward;   //前進         
}
sub_crossing2()
{  
 repeat(3){  //三回繰り返す
 while (true) { //3〜5個目の交差点
     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);
 }
 }
 short_break; //1秒間の停止
 PlaySound(SOUND_CLICK);  //音が出る
 turn_right1; //右へ旋回する
 nOnline=0; //カウンタをリセット
}
sub crossing_stop(){
turn_left; //Cの中に止まる
Wait(400); //0.4秒
go_forward; //前進
Wait(1400); //1.4秒
Off(OUT_AC); //モーターを停止
} 
task main()
{
 crossing_right1//第一交差点まで
 crossing_go(); //第二、三交差点まで
 crossing_right2(); //第四、五、六交差点まで
 crossing_stop(); //B地点の中
}

課題と反省

サブルーチンを使うとなぜかエラーがおきてしまい、何度か改善を試みたができなかった。次回は使えるようにしていきたい。交差点をカウンタで数えることによって判断させたが、nMaxの数をいろいろ変えながら試行錯誤して止まることできた。またスピードを使い分け、うまくカーブが曲がれた。

またコースは協力して書き正確に書けたと思う。 コース.jpg

While(true)について

while(true)の{}の中に書かれた命令は永遠に繰り返す。そのためループを抜け出すためにbreak文を利用しなければならなかった。また今回の場合はwhile (nOnline < nMax)があるため、ある条件を超えなければ命令が続けられているし、repeatによって繰り返すことができていたため必要でなかったことに気づいた。勘違いして覚えて、うまくいかないところがあったため、反省して次の課題に取り組みたい!


添付ファイル: fileコース.jpg 235件 [詳細] filerobot.jpg 269件 [詳細] file2016a-mission2.png 236件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-27 (水) 02:54:30