目次

ロボットの説明

  • 任務
  1. 今回作ったロボットは自作したコースに沿って一周するロボットです。交差点をきちんと認識し、正しく判断して通過できるようにする。 確実に一周できるようにする。スタート地点から出発して元にもどるようにする。空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。
  • 問題点
  1. 交差点の認識が一番難しいだと思う、センサーの認識度が低いです。
  • 解決方法
  1. ロボットは一つずつ交差点到着する時間を測量する、時間によってどちらの交差点の前止めできる、そして自身を調節する交差点を通過する。
  • 長所
  1. 正確に交差点を渡させる
  • 写真 robotto
  • 攻略 keiro +コースを5分割する。詳しくは図より。それに伴いプログラムも多いくくりで見ると5つの構成に なっている(ゴールの動作は省く) +(なお走る順番は、□→あアゴールで、吹き出しの中の数字は交差点の番号である。)

プログラム

#define THRESHOLD 37
#define HIPOWER 6
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define turn_left set_power_L;Off(OUT_A);OnFwd(OUT_C);
#define senkai_left set_power_L;OnRev(OUT_A);OnFwd(OUT_C);
#define turn_right set_power_L;Off(OUT_C);OnFwd(OUT_A);
#define senkai_right set_power_L;OnRev(OUT_C);OnFwd(OUT_A);
#define go_forward set_power_H;OnFwd(OUT_AC);
#define STEP 1 
#define SAIDAI 3
#define short_break Off(OUT_AC);Wait(80); //小休憩
#define CROSS_TIME 60 //交差点を渡る時間
#define cross_line(p,q) short_break;senkai_right;Wait(p);senkai_left;Wait(q);go_forward;\
                       Wait(CROSS_TIME);Off(OUT_AC);                         //交差点渡る
#define counter3 PlaySound(SOUND_CLICK);Off(OUT_AC);Wait(50);//3回鳴ると交差点を渡る
#define GOOL short_break;turn_right;Wait(350);go_forward;Wait(100);Off(OUT_AC);
sub akikan_1()                       //空き缶をどかすプログラム1回目
{
  if(SENSOR_3==1){
       Off(OUT_AC);Wait(60);
       turn_left;Wait(460);
       go_forward;Wait(80);
       senkai_left;Wait(500);
       OnRev(OUT_AC);Wait(80);
       senkai_right;Wait(110);
       go_forward;until(SENSOR_2 <= THRESHOLD);
       senkai_right;Wait(170);}
}

sub akikan_2()                       //空き缶をどかすプログラム2回目
{
  if(SENSOR_3==1){
      Off(OUT_AC);Wait(60);
      senkai_left;Wait(120);
      go_forward;Wait(180);
      senkai_left;Wait(500);
      OnRev(OUT_AC);Wait(100);
      senkai_right;Wait(80);
      go_forward;until(SENSOR_2 <= THRESHOLD);}

} 

sub line_race()                  //普通の黒線を走るプログラム
{
  int nOnline=0;

    if(SENSOR_2 < THRESHOLD -2){
       senkai_right;
    }else if(SENSOR_2 < THRESHOLD -1){  //黒い線上
       turn_right;
    }else if(SENSOR_2 <= THRESHOLD){ //黒い線と白い線の間 
       go_forward;
    }else if(SENSOR_2 < THRESHOLD +2){ //白い線上
       turn_left;
    }else{senkai_left;}
   Wait(STEP);nOnline=0;
}

sub before_cross_line()          //境界線付近の黒線を走るプログラム 
{
 int nOnline=0; 

  while (nOnline < SAIDAI){
   if(SENSOR_2 < THRESHOLD -3){
       counter3;
       senkai_right;
       nOnline++;
   }else{
     if(SENSOR_2 < THRESHOLD -1){
       turn_right;
    }else if(SENSOR_2 <= THRESHOLD){
       go_forward;
     }else if(SENSOR_2 < THRESHOLD +2){
       turn_left;
        }else{senkai_left;}
      nOnline=0;
     }
   Wait(STEP);
  }                                            //while(<saidai)文終わり               
} 
task main()
{
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 int nCross=0;
 ClearTimer(0);
 

while(nCross<6){



if(nCross==0){

 while(FastTimer(0)<2350){    //2350ミリで第一交差点に到着する
    line_race();
    akikan_1();
 }                                           //while(line_race)文終わり

 if(FastTimer(0)>=2350){  //第一交差点を渡る
  before_cross_line();
  cross_line(30,0);
 }                                            //if(cross_line)文終わり
 PlaySound(SOUND_DOWN);  //声を出す
 ClearTimer(0); 
 nCross++;

}                                              //nCross0終わり





else if(nCross==1){

 while(FastTimer(0)<830){   //第二交差点到着する
    line_race();
 }                                           //while(line_race)文終わり

 if(FastTimer(1)>=830){  //交差点を渡る
  before_cross_line();
  cross_line(0,0);
 }                                          //while(cross_line)文終わり
 PlaySound(SOUND_DOWN);
 ClearTimer(0);   //タイマーをゼロになる
 nCross++;

}                                            //nCross1終わり





else if(nCross==2){

 while(FastTimer(0)<100){   //第三交差点
   line_race();
 }                                           //while(line_race)文終わり

 if(FastTimer(0)>=100){   //交差点を渡す
  before_cross_line();
  cross_line(0,0);
 }                                           //while(cross_line)文終わり
 PlaySound(SOUND_DOWN);
 ClearTimer(0);    //タイマーをゼロになる
 nCross++;

}                                             //nCross2終わり





else if(nCross==3){

 while(FastTimer(0)<1070){   //第四交差点」
   line_race();
 }                                           //while(line_race)文終わり

 if(FastTimer(1)>=1070){   //交差点を渡す
  before_cross_line();
  cross_line(0,60);
 }                                            //if(cross_line)文終わり
 PlaySound(SOUND_DOWN);    //声を出す
 ClearTimer(0);        //タイマーをゼロになる
 nCross++;

}                                             //nCross3終わり




else if(nCross==4){

 while(FastTimer(0)<1650){  //出発点に到着
   line_race();
   akikan_2();
 }                                           //while(line_race)文終わり

 if(FastTimer(0)>=1650){   
  before_cross_line();
 }                                             //if(ゴール前)文終わり
 PlaySound(SOUND_UP);
 nCross++;

}                                            //nCross4終わり





 else{
  GOOL;
  nCross++;
 }                                                        //ゴール       
    




}


}

添付ファイル: file32764676.jpeg 172件 [詳細] fileimage.jpeg 91件 [詳細]

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