[[2010a]]
*目次 [#f8b8a456]
#contents

*課題2 [#da324a89]
課題2:黒い線に沿って動くロボット †

各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

   1. 空き缶をコース上に戻して再びコースに戻って進む
   2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
   3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む

ただし、

    * 速さと正確さを追求すること
    * コースを1周したら自動的に止まること
    * 交差点では一時停止すること

*メンバー紹介 [#v48511d0]
 しょうご、カズ、マコト

*コース紹介 [#nef8554c]
A2左のコースと同じ

*ロボット紹介 [#a690a204]
 三人で一台のロボットを作りました。
#ref(20100621140444.jpg)
前。重心が前に行き過ぎたのでタイヤをつけて安定するようにした。
#ref(20100621140553.jpg)
横。後ろの羽は特に意味はないです。




*それぞれのプログラムの紹介 [#k258a730]

それぞれ順番に1、2、3となっています。
**しょうごのプログラム [#o8eca2c2]
 
**カズのプログラム [#bb6424f1]
 
 #define START OnFwd(OUT_A+OUT_C);                      //前進
 #define STOP Off(OUT_A+OUT_C);                         //停止
 #define BACK OnRev(OUT_A+OUT_C);                       //後退
 #define arm_l OnFwd(OUT_B);Wait(80);Off(OUT_B);        //アームの操作
 #define BORDER 40                                      //閾値
 #define LIGHT OnFwd(OUT_C);                            //左折
 #define RIGHT OnFwd(OUT_A);                            //右折
 #define RECIRCLE OnFwd(OUT_A);OnRev(OUT_C);            //時計回り
 #define CIRCLE OnFwd(OUT_C);OnRev(OUT_A);              //反時計回り


 take main()
 { 
  SetSensor(SENSER_1,SENSER_LIGHT);                     //センサー1を光センサー
  SetSensor(SENSER_2,SENSER_TOUCH);                     //センサー2をタッチセンサー
  SetSenser(SERECIRCLENSER_3,SENSER_LIGHT);             //センサー3を光センサー
    int flat = 0 ;                                       
  while(flat<8){
  if((SENSER_1>BORDER)&&(SENSER_3>BORDER)){
     START;
  }else if((SENSER_1<BORDER)&&(SENSER_3>BORDER)){       //左折
    LIGHT;
  }else if((SENSER_1>BORDER)&&(SENSER_3<BORDER)){       //右折
     RIGHT;
  }else if((SENSER_1<BORDER)&&(SENSER_3<BORDER)){    
     START;  
      flat=flat++;
  }
   

   if(SENSER_2==1){                          //タッチセンサーが反応したら
     STRAT;Wait(80);flat++;
      if(SENSER_1>BORDER){
      if(SENSER_3>BORDER){START;}
       else{RECIRCLE;}  
      }
    else{
    if(SENSER_3>BORDER){CIRCLE;}
  }
  }
   BACK;
   RIGHT;
   START;
   LIGHT;
   START;
   flat++;  
   }
 }

   ClearTimer(0);                             //タイマー0セット
     while(Timer(0)<600){
     if(SENSER_1>BORDER)
          {if(SENSER_3>BORDER){START;}
     else
         {RECIRCLE;}
     else
           {if(SENSER_3>BORDER){CIRCLE;}
     else{START;}
  }
 }
 STOP;
 }
**マコトのプログラム [#y99d2434]
 #define go_front OnFwd(OUT_A+OUT_C);  //前進
 #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); //左折
 #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右折
 #define stay Off(OUT_A+OUT_C);//止まる
 #define THRESHOLD 40//閾値
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサー1を光センサー
   SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2をタッチセンサー
   SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー3を光センサー

 while(true)
 {start follow_line;//ライントレースを開始
 int n=0;//nの値を定義
 while(n=1){//奇数回目には
    if(SENSOR_2==1)//缶に触れたら反転
    turn_left(200);
    n++;
 }
 while(n=2){//偶数回目には
    if(SENSOR_2==1)//そのまま直進
    go_front;
   n--;}

 task follow_line{
 int k=0;//kの値を定義
 while(k<10){10回繰り返したら止まる
 go_front;
 until((SENSOR_1<THRESHOLD)||(SENSOR_3<THRESHOLD))センサーのどちらかが線に乗るまで直進
 stay;
 if(SENSOR_1<THRESHOLD){//左のセンサーが線に乗った場合
 OnFwd(OUT_C);OnRev(OUT_A);//左折
 until(SENSOR_1>THRESHOLD)
 stay;
 }
 if(SENSOR_3<THRESHOLD){//右のセンサーが線に乗った場合
 OnFwd(OUT_A);OnRev(OUT_C);//右折
 until(SENSOR_3>THRESHOLD)
 stay;
 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){//両方のった場合
 Wait(100);//一旦停止して進む
 k++;
 go_front;
 until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
 stay;
 }
 }
 stay;
 }


*全体の反省点 [#a3ea6c86]
・偶数回目、奇数回目というのがどうやればいいのか分からずに苦戦した。 マコト

・偶数回目、奇数回目というのがどうやればいいのか分からずに苦戦した。 マコト &br;
・カンを運ぶプログラムをどのように作ればいいか考えるのに苦労した。 カズ
*コメント [#lf62dd8b]
#comment
コメントをよろしくお願いします。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS