[[2018a/Member]]
*課題 [#e2b82ceb]
-下の図の黒い線に沿って空き缶を移動させる。
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission2&openfile=2018a-mission2.png)
    Aをスタート
    Bを右折
    Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
    JからKに向かい、Kを直進
    Lを直進
    Iを左折
    Hで一時停止の後、左折
    Gで一時停止の後、右折
    Fで一時停止の後、右折
    Eを直進
    Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
    Cで一時停止の後、直進
    Bを直進
    Aで停止
*ロボット [#t389e4a6]
#ref(robo2.jpg)
#ref(robo1.jpg)
-2枚目の写真で分かるように、小さなタイヤを内側につけている。
**工夫した点 [#pf79b874]
-センサーとタイヤの間隔が大すぎると進まなくなり、大きすぎると急なカーブがあるところをトレースできないためロボットの真下、タイヤの少し前にライトセンサーを取り付けた。
-ハサミを大きくしないと、缶をつかめないが、大きすぎるとつかむ前に缶にぶつかってしまうため、ハサミを右側に寄せて左回りで缶をつかむようにした。
-タイヤとタイヤの間隔が広すぎると急なカーブをトレースできないためタイヤを小さくしてロボットの内側につけた。
-ハサミの間にゴムをつけることでつかみやすくした。
*プログラム [#pb521fea]
-黒い線の右、または左の境界を明るさの差によって赤外線センサーで認識させる。
**交差点の認識 [#pcef75aa]
赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。
nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。
-赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。
-nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。
**プログラム [#j200ef3c]
 #define llt OnRev(OUT_A,50); OnFwd(OUT_C,30); Wait(1);//大きく左に回る
 #define lrt OnFwd(OUT_A,30); OnRev(OUT_C,50);  Wait(1);//大きく右に回る
 #define ternleft  OnRev(OUT_A,50); OnFwd(OUT_C,10);//左に回る
 #define ternright  OnFwd(OUT_A,10); OnRev(OUT_C,50);//右に回る
 #define go OnRev(OUT_A,50); OnRev(OUT_C,50);//直進する
 #define back OnFwd(OUT_A,50); OnFwd(OUT_C,50);//後退する
 #define close RotateMotor(OUT_B,50,90);
 #define open RotateMotor(OUT_B,50,-90);

 task main()
 {
    SetSensorLight(S3);
   int n=0;
   while(n<=250)           //bまで
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }
  Off(OUT_AC);
  Wait(1000);
  RotateMotor(OUT_C,50,-200);

     while(n<=270)           //Jまで
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }
  Off(OUT_AC);
  Wait(1000);

  close;                            //缶を掴む
  RotateMotor(OUT_A,50,-350);

   n=0;
   while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   llt;  n++;
 }

   else if(SENSOR_3<51)        //G
 {
   go; n=0;
 }

   else
 {
    ternright;  n=0;                 // W
 }
 }

 Off(OUT_AC);
 Wait(1000);
 RotateMotor(OUT_C,50,-90);
 Off(OUT_C); 

    n=0;
   while(n<=210)
 {
   if(SENSOR_3<45)              //B 
 {
   llt;  n++;
 }

   else if(SENSOR_3<51)        //G
 {
   go; n=0;
 }

   else
 {
    ternright;  n=0;                 // W
 }
 }

 Off(OUT_AC);
 Wait(1000);
 RotateMotor(OUT_C,50,-90);        //L通過
 Off(OUT_C);
     n=0;
   while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   llt;  n++;
 }

   else if(SENSOR_3<51)        //G
 {
   go; n=0;
 }

   else
 {
    ternright;  n=0;                 // W
 }
 }

 Off(OUT_AC);
 Wait(1000);              //H stop

 n=0;
   while(n<=400)
 {
   if(SENSOR_3<45)              //B 
 {
   llt;  n++;
 }

   else if(SENSOR_3<51)        //G
 {
   go; n=0;
 }

   else
 {
    ternright;  n=0;                 // W
 }
 }
 
 Off(OUT_AC);
 go;
 Wait(500);             //s1


  n=0;
     while(n<=400)
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }                                 
 Off(OUT_AC);
 go;
 Wait(500);                           //s2 stop

 n=0;
     while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   llt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   lrt;  n=0;                 // W
 }
 }                                 
 Off(OUT_AC);
  Wait(1000);                   //G stop
  RotateMotor(OUT_C,50,-310);

 n=0;
     while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }                                 
 Off(OUT_AC);
  Wait(1000);  
 RotateMotor(OUT_C,50,-90);       //F通過

 n=0;
     while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }                                 
 Off(OUT_AC);
  Wait(1000);  
 RotateMotor(OUT_C,50,-90);    //E通過 

 n=0;
     while(n<=200)
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }                                 
 Off(OUT_AC);
  Wait(1000);         //D stop
 RotateMotor(OUT_C,50,90); 
 Off(OUT_C);
 open;
 back;
 Wait(250);
 RotateMotor(OUT_A,50,60);
 Off(OUT_A);
 go;
 until(SENSOR_3 <= 45);
 n=0;
   while(n<=250)           
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }
 Off(OUT_AC);
 Wait(1000);
   while(n<=250)           //bまで
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }
  Off(OUT_AC);
  Wait(1000);
 RotateMotor(OUT_A,50,-130); 
   while(n<=250)           //bまで
 {
   if(SENSOR_3<45)              //B 
 {
   lrt;  n++;
 }

   else if(SENSOR_3<52)        //G
 {
   go; n=0;
 }

   else
 {
   llt;  n=0;                 // W
 }
 }
  Off(OUT_AC);
 }
**工夫した点 [#g9a6f3cd]
-交差点を認識するため、トレースする白と黒の境界を交差点がある側にして、交差点ごとにトレースする境界を変更する。
-小さすぎるカーブはやはりトレースしきれなかったので、交差点として認識させ、トレースする境界をカーブの外側に変更した。
*最後まで残った課題 [#y3e83f43]
-ロボットの重心が前過ぎて、境界をトレースするたびにロボットが大きく揺れてしまう。
-白と黒の両極端のプログラムで作ったため、安定して前に進まない。

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