2017a/Member

目次

課題について

2つ目の課題は次の経路を黒い線にそって動くロボットを作成するというものだった。

pic_ejj9.JPG

Aスタート→E直進→F(SOUND_UP)→Q一時停止(SOUND_DOWN)&左折→R直進(SOUND_UP)→S左折(SOUND_UP)→G(SOUND_UP)→H(SOUND_UP)→T一時停止(SOUND_DOWN)&直進→T一時停止(SOUND_DOWN)&直進→R一時停止(SOUND_DOWN)&左折→S直進(SOUND_UP)→P左折(SOUND_UP)→E一時停止(SOUND_DOWN)&左折→A停止(SOUND_DOWN)

ただし、

  ,覆襪戮速く正確に動くロボットになるように工夫すること。

  一時停止の交差点および丁字路ではSOUND_DOWNを鳴らした後、1秒間停止すること。

  D廠僖魁璽福爾よび一時停止が不要は丁字路ではSOUND_UPを鳴らし、停止しないで進むこと 。

  ぅ蹈椒奪箸魯汽ぅ困蓮幅15cm長さ18cm以内とする(高さは無制限)。

  ジ鮑硬澄丁字路、直角コーナーについては、差し掛かった時点で判別するものとし、予め設定した走行時間のみで判定したり、走行距離のみで判定しては   ならない。

というのが条件だった。

ロボットの説明

半径の小さな曲線もなるべく容易に曲がれるようにモーターの距離を最小限にした。さらに、回転や旋回の時に机との摩擦が小さくなるようにタイヤは三輪にし、一つはゴムのついてないものにした。また、車軸からのセンサーの丁度いい距離が組み立てる時点では分からなかったので、後から自由に変えることが可能なように組み立てた。その部分がもろいのが難点だったが、距離を簡単に変えられるのは結果的に作業の効率を上げた。車軸の中心とセンサーの距離はブロック二個分がちょうどよかった。

pic_ejj10.JPG pic_ejj11.JPG pic_ejj12.JPG

プログラムの説明

定義

#define BLACK 39                             //これより小さいと黒
#define BLACK_gray 42
#define GRAY 45
#define WHITE_gray 48
#define WHITE 50                             //これより大きいと白
#define RIGHT_S OnFwd(OUT_A); OnRev(OUT_C);  //右旋回
#define LEFT_S OnFwd(OUT_C); OnRev(OUT_A);   //左旋回
#define RIGHT_K OnFwd(OUT_A); Off(OUT_C);    //右回転
#define LEFT_K OnFwd(OUT_C); Off(OUT_A);     //左回転
#define GO_FORWARD OnFwd(OUT_AC);            //前進1
#define GO_FORWARD2(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//前進2

サブルーチン

ライントレースのサブルーチン1。90度に交わる交差点を認識して音(SOUND_UP)を鳴らす。

sub LINE1a()
{
 ClearTimer(0);
 while(FastTimer(0)<22)
 {
  if(SENSOR_2>=WHITE){RIGHT_S;ClearTimer(0);}
  else if(SENSOR_2>=WHITE_gray){RIGHT_K;ClearTimer(0);}
  else if(SENSOR_2>=GRAY){GO_FORWARD;ClearTimer(0);}
  else if(SENSOR_2>=BLACK_gray){LEFT_K;ClearTimer(0);}
  else{LEFT_S;}
}
Off (OUT_AC);
PlaySound(SOUND_UP);
}

ライントレースのサブルーチン2。90度以上の角度で交わる交差点を認識して音(SOUND_UP)を鳴らす。

sub LINE1b()
{
 ClearTimer(0);
 while(FastTimer(0)<19)
 {
  if(SENSOR_2>=WHITE){RIGHT_S;ClearTimer(0);}
  else if(SENSOR_2>=WHITE_gray){RIGHT_K;ClearTimer(0);}
  else if(SENSOR_2>=GRAY){GO_FORWARD;ClearTimer(0);}
  else if(SENSOR_2>=BLACK_gray){LEFT_K;ClearTimer(0);}
  else{LEFT_S;}
}
Off (OUT_AC);
PlaySound(SOUND_UP);
}

ライントレースのサブルーチン3。音を鳴らさずに次のプログラムに進む。

sub LINE1c()
{
 ClearTimer(0);
 while(FastTimer(0)<22)
 {
  if(SENSOR_2>=WHITE){RIGHT_S;ClearTimer(0);}
  else if(SENSOR_2>=WHITE_gray){RIGHT_K;ClearTimer(0);}
  else if(SENSOR_2>=GRAY){GO_FORWARD;ClearTimer(0);}
  else if(SENSOR_2>=BLACK_gray){LEFT_K;ClearTimer(0);}
  else{LEFT_S;}
}
}

ライントレースのサブルーチン4。交差点を認識して音(SOUND_DOWN)を鳴らした後、1秒停止する。

sub LINE2()
{
 ClearTimer(0);
 while(FastTimer(0)<22)
 {
  if(SENSOR_2>=WHITE){RIGHT_S;ClearTimer(0);}
  else if(SENSOR_2>=WHITE_gray){RIGHT_K;ClearTimer(0);}
  else if(SENSOR_2>=GRAY){GO_FORWARD;ClearTimer(0);}
  else if(SENSOR_2>=BLACK_gray){LEFT_K;ClearTimer(0);}
  else{LEFT_S;}
}
Off (OUT_AC);
PlaySound(SOUND_DOWN);
Wait(100);
}

0.8秒左旋回するサブルーチン。

sub CROSS_LEFT1()
{
  while(FastTimer(0) < 80) {
      LEFT_S;
  }
  ClearTimer(0);
 }

2.2秒左回転するサブルーチン。

sub CROSS_LEFT2()
{
  while(FastTimer(0) < 220) {
      LEFT_K;
  }
  ClearTimer(0);
 }

1.2秒左回転するサブルーチン。

sub CROSS_LEFT3()
{
  while(FastTimer(0) < 120) {
      LEFT_K;
  }
  ClearTimer(0);
 }

0.8秒右回転するサブルーチン。

sub CROSS_RIGHT()
{
  while(FastTimer(0) < 80) {
      RIGHT_K;
  }
  ClearTimer(0);
 }

タスクメイン

task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
LINE1a();                //Fまで
CROSS_LEFT1();
LINE2();                 //Qまで
CROSS_LEFT2();
LINE1b();                //Rまで
CROSS_RIGHT();
LINE1b();                //Sまで
CROSS_LEFT3();
LINE1a();                //Gまで
CROSS_LEFT3();
LINE1c();
CROSS_LEFT1();
LINE1c();
CROSS_LEFT1();
LINE1c();
CROSS_LEFT1();
LINE1a();                //Hまで
CROSS_LEFT2();
LINE2();                 //T(一回目)まで
GO_FORWARD2(30);
LINE2();                 //T(二回目)まで
GO_FORWARD2(30);
LINE2();                 //Rまで           
CROSS_LEFT2();
LINE1b();                //Sまで
CROSS_RIGHT();
LINE1b();                //Pまで
CROSS_LEFT3();
LINE2();                 //Eまで
CROSS_LEFT3();
LINE2();                 //ゴール
}

まとめ

感想

今回の課題は前回とは違い、ロボットは非常にスムーズに作成できた。だがプログラムの方はとても複雑だった。センサーの値は少し違うだけでもロボットが全く違う動きをするので、その時にセンサーの値がおかしいのかプログラムが間違っているのかわからず苦労した。また、ロボットが交差点を曲がる時、道が交わる角度が違い、なかなかうまくいかなかった。線をたどるロボットと聞いたら簡単そうに聞こえるけれど、想像以上に時間がかかった。

反省

このロボットは不完全でゴールまでたどり着けない時もたまにある。それはスタートの時の線とセンサーの位置関係やロボットを置く角度によると考えられる。また、急旋回の部分は進めるようにはなったが、プログラムはもっとシンプルにできそうでもある。最後の課題では少しでも完璧に近づけられるように最後までやりきりたい。


添付ファイル: filepic_ejj10.JPG 120件 [詳細] filepic_ejj12.JPG 171件 [詳細] filepic_ejj11.JPG 95件 [詳細] filepic_ejj9.JPG 88件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-07 (金) 17:07:40