2018a/Member

課題

  • 下の図の黒い線に沿って空き缶を移動させる。
    ?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で停止

ロボット

robo2.jpg
robo1.jpg
  • 2枚目の写真で分かるように、小さなタイヤを内側につけている。

工夫した点

  • センサーとタイヤの間隔が大すぎると進まなくなり、大きすぎると急なカーブがあるところをトレースできないためロボットの真下、タイヤの少し前にライトセンサーを取り付けた。
  • ハサミを大きくしないと、缶をつかめないが、大きすぎるとつかむ前に缶にぶつかってしまうため、ハサミを右側に寄せて左回りで缶をつかむようにした。
  • タイヤとタイヤの間隔が広すぎると急なカーブをトレースできないためタイヤを小さくしてロボットの内側につけた。
  • ハサミの間にゴムをつけることでつかみやすくした。

プログラム

  • 黒い線の右、または左の境界を明るさの差によって赤外線センサーで認識させる。

交差点の認識

  • 赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。
  • nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。

プログラム

#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);
}

工夫した点

  • 交差点を認識するため、トレースする白と黒の境界を交差点がある側にして、交差点ごとにトレースする境界を変更する。
  • 小さすぎるカーブはやはりトレースしきれなかったので、交差点として認識させ、トレースする境界をカーブの外側に変更した。

最後まで残った課題

  • ロボットの重心が前過ぎて、境界をトレースするたびにロボットが大きく揺れてしまう。
  • 白と黒の両極端のプログラムで作ったため、安定して前に進まない。

添付ファイル: filerobo1.jpg 14件 [詳細] filerobo2.jpg 12件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-17 (金) 19:25:26 (368d)