[[2016a/Member]]

*目次 [#vb047a36]
#contents

*はじめに [#gca5125f]
#ref(2016a-mission2.png)
課題2の内容は、光センサーを用いて&br;
次のいずれかの経路を黒い線にそって動くロボットを作成する&br;
(他のメンバーとは別の経路になるようにする)。&br;
ただし、なるべく速く正確に動くロボットになるように工夫して、&br;
交差点では1秒間停止すること。&br;
・A地点からB地点へ (一人目)&br;
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点&br;
・B地点からC地点へ (二人目)&br;
B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点&br;
・C地点からA地点へ (三人目)&br;
C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点&br;
(>2016年度前期/課題2)より&br;
今回は、A地点からB地点へロボットをライントレースさせた。&br;
*ロボット本体の説明 [#y97e9f0f]
#ref(dc8c76bc-1dc8-4fe5-85a2-f6bf5b867d3f.jpg)
ロボットの前方についているのが光センサーである。&br;
ロボットの機体は初期状態のまま使用した。&br;
#ref(ba881582-7541-414d-bf2f-1e1f75e8949a.jpg)
光センサーは、地表面から1センチほど離した。&br;

*プログラミングの説明 [#x55c6767]
定義文
 #define BLACK  34
 #define WHITE 70
 #define LEFT OnFwd(OUT_B,40);OnRev(OUT_C,20);//左旋回
 #define RIGHT OnFwd(OUT_C,40);OnRev(OUT_B,20);//右旋回
 #define nMAX 210
 #define short_break Off(OUT_BC);PlaySound(SOUND_CLICK);Wait(1000)//小休止かつ発音
 #define STEP 1
 #define go_f OnFwd(OUT_BC,40);Wait(200);Off(OUT_BC);//前進
 #define go_f1 OnFwd(OUT_BC,40);Wait(1000);Off(OUT_BC);//前進1
 #define go_f2 OnFwd(OUT_BC,40);Wait(1100);//前進2
 #define LEFT2 OnFwd(OUT_B,40);OnRev(OUT_C,20);Wait(500); 
 #define RIGHT2 OnFwd(OUT_C,40);OnRev(OUT_B,20);Wait(500);
 #define TURN OnFwd(OUT_C,40);OnRev(OUT_B,40);Wait(650);Off(OUT_BC);
 #define TURN2 OnFwd(OUT_C,40);OnRev(OUT_B,20);Wait(200);Off(OUT_BC);

サブルーチン
 sub normal()
 { 
  SetSensorLight(S2);
  int nOnline=0;//カウント開始
  int k=0;
 while(k==0){
  int nOnline=0;//黒線のカウント開始
  int k=0;//交差点のカウント開始
 while(k==0){//交差点のカウントが0の時
   while(nOnline < nMAX){//カウントがnMAXより少ないとき
   if (SENSOR_2<BLACK) {//黒線上だと右に旋回
     RIGHT;
   nOnline++;//カウントプラス
    } else 
   if (SENSOR_2<WHITE) {//白だと左旋回
     LEFT;
   nOnline=0;//カウントリセット
   nOnline=0;//黒線のカウントリセット
   }
   Wait(STEP);
  }
  short_break;
  k++;
  nOnline=0;
  k++;//交差点のカウントプラス
  nOnline=0;//黒線のカウントリセット
   }
  }

 sub normal2()
 { 
  SetSensorLight(S2);
  int nOnline=0;//カウント開始
  int k=0;
 while(k==0){
  int nOnline=0;//黒線のカウント開始
  int k=0;//交差点のカウント開始
 while(k==0){//交差点のカウントが0の時
   while(nOnline < nMAX){//カウントがnMAX以下の時
   if (SENSOR_2<BLACK) {//黒線上なら左旋回
     LEFT;
   nOnline++;//カウントプラス
    } else 
   if (SENSOR_2<WHITE) {//白なら右旋回
     RIGHT;
  nOnline=0;//カウントリセット
   }
   Wait(STEP);
  }
  short_break;
  k++;
  k++;//交差点のカウントプラス
  nOnline=0;
   }
 }
サブルーチン1は黒線の右側をライントレースし、&br;
サブルーチン2は黒線の左側をライントレースする。

プログラミング
 task main()
 {
 normal2();
  go_f1;
 normal();
  go_f;
 normal();
  go_f;
  normal ();
 TURN;
 TURN2;
 go_f;
 normal();
  LEFT2;
 normal();
  go_f2;
 Off(OUT_BC);
 }
黒のカウントが210を超えると交差点と判断する。

黒のカウントがnMAXの210を超えると交差点と判断する。&br;
交差点と判断されるとそのサブルーチンは終了する。
*感想 [#bdf73b90]
光センサーを用いた課題2は、&br;
センサーの調子や、ロボット自体の判断が関わってきたので&br;
課題1に比べるとかなり難易度が高かった。&br;
プログラミングに関しても、&br;
課題1に比べ、使用する単語が増え、大変だった。&br;
しかしその分、プログラミングに関する&br;
理解が深まった。

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