目次
#contents
*ロボットの説明 [#x0902b6e]
#ls2
-ロボットは安定するためにロボットのタイヤにはキャタピラには使用した。また、二つのRCXを一台のロボットに置いて難しい点だと思う。
-缶を上に持つために垂直であるエレベータをした、またエレベータを駆動するために小さいギヤと大きいギヤの組み合わせを使用した。ねじり力が大きいです。また、ハサミの前の部分に摩擦力が大きいのタイヤを付いた持つ力も強いです。
-ライントレスについて、光センサーを二つでライントレースをする。 ({左の光センサーが判断した色,右の光センサーが判断した色}→){黒,黒}{線上,線上}{白,白}のとき前進、{黒,線上}{黒,白}{線上,白}のとき左旋回、{白,黒}{白,線上}{線上,黒}のとき右旋回する。光センサー1つの時と比べると交差点判断がよくなった。
*プログラム [#s2c3add9]
-車体の説明
#define left_kuro 28//黒とみなす最大の値
#define right_kuro 34//黒とみなす最大の値
#define left_sen 38//線上とみなす
#define right_sen 43//線上とみなす
#define sekkin 40//缶が接近したときの値
#define HIPOWER 7//強い力
#define LOWPOWER 5//弱い力
#define set_power_H SetPower(OUT_AC,HIPOWER);//モーターを強い力に設定
#define set_power_L SetPower(OUT_AC,LOWPOWER);//モーターを弱い力に設定
#define senkai_left set_power_L;OnRev(OUT_A);OnFwd(OUT_C);//左旋回
#define senkai_right set_power_L;OnRev(OUT_C);OnFwd(OUT_A);//右旋回
#define go_forward set_power_H;OnFwd(OUT_AC);//前進
#define back set_power_L;OnRev(OUT_AC);//後退
#define CROSS(t,p,q)  set_power_L;go_forward;Wait(t);senkai_left;Wait(p);senkai_left;Wait(q);//T字路や交差点を渡る時のプログラム
#define STEP 1 //ライントレースで判断された動作を0.01秒間続ける。
#define SAIDAI 3 //T字路や交差点付近である条件に3連続でなったらT字路や交差点と判断
#define short_break Off(OUT_AC);Wait(80);//小休憩
#define counter3 PlaySound(SOUND_CLICK);//3回鳴ると交差点を渡る
#define GO 1//もうひとつのRCXからこのメッセージが送られてきたらこのRCXのプログラムが再始動する
#define HOLD 2//1つ目の缶を持ち上げる動作をもうひとつのRCXに送るメッセージ
#define TUMU_UP 3//1つ目の缶を2つ目の缶に積んで2つ目の缶を持ち上げる動作をもうひとつの RCXに送るメッセージ
#define TUMU 4//1,2目の缶を3つ目の缶に積んで3つ目の缶を挟む動作をもうひとつのRCXに送るメッセージ
#define HASAMI 5//ハサミを広げる動作をもうひとつのRCXに送るメッセージ
sub line_race()                                  //普通の黒線を走るプログラム
{
    if(SENSOR_1<=left_kuro){
       if(SENSOR_3<=right_kuro){
         go_forward;}
       else if(SENSOR_3<=right_sen){
         senkai_left;}
       else{senkai_left;}}
    else if(SENSOR_1<=left_sen){
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else if(SENSOR_3<=right_sen){
          go_forward;}
       else{senkai_left;}}
    else{
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else if(SENSOR_3<=right_sen){
          senkai_right;}
       else{go_forward;}}Wait(STEP);
}

sub before_cross_line_1()                //T字路付近の黒線を走るプログラム
{
 int nOnline=0; 

  while (nOnline < SAIDAI){
   if(SENSOR_3<=right_kuro){
       if(SENSOR_1<=left_kuro){
         go_forward;}
       else if(SENSOR_1<=left_sen){
         senkai_right;}
       else{senkai_right;}
     nOnline++;
   }else{
     if(SENSOR_3<=right_sen){
       if(SENSOR_1<=left_kuro){
          senkai_left;}   
       else if(SENSOR_1<=left_sen){
          go_forward;}
       else{senkai_right;}}
    else{
       if(SENSOR_1<=left_kuro){
          senkai_left}   
       else if(SENSOR_1<=left_sen){
          senkai_left;}
       else{go_forward;}}
      nOnline=0;}
   Wait(STEP);
  }                                            //while(<saidai)文終わり               
}

sub before_cross_line_2()                   //T字路付近の黒線を走るプログラム
{
 int nOnline=0; 

  while (nOnline < SAIDAI){
   if(SENSOR_1<=left_kuro){
       if(SENSOR_3<=right_kuro){
         go_forward;}
       else if(SENSOR_3<=right_sen){
         senkai_left;}
       else{senkai_left;}
     nOnline++;
   }else{
    if(SENSOR_1<=left_sen){
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else if(SENSOR_3<=right_sen){
          go_forward;}
       else{senkai_left;}}
    else{
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else if(SENSOR_3<=right_sen){
          senkai_right;}
       else{go_forward;}}
     nOnline=0;}
   Wait(STEP);
  }                                            //while(<saidai)文終わり               
}


sub before_cross_line_3()          //T字路or十字路付近の黒線を走るプログラム
{
int nOnline=0; 
while (nOnline < SAIDAI){
  if(SENSOR_1<=left_kuro&&SENSOR_3<=right_kuro){
         go_forward;nOnline++;}
  else if(SENSOR_1<=left_sen&&SENSOR_3<=right_sen){
         go_forward;nOnline++;}
  else if(SENSOR_1<=left_kuro){
       if(SENSOR_3<=right_sen){
         senkai_left;}
       else{senkai_left;}nOnline==0;}
  else if(SENSOR_1<=left_sen){
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else{senkai_left;}nOnline==0;}
  else{
       if(SENSOR_3<=right_kuro){
          senkai_right;}   
       else if(SENSOR_3<=right_sen){
          senkai_right;}
       else{go_forward;}nOnline==0;}
  Wait(STEP);
}                                                //while(<saidai)文終わり 
}
task main(){
 

 SetSensor(SENSOR_1,SENSOR_LIGHT);//左側の光センサー
 SetSensor(SENSOR_2,SENSOR_LIGHT);//缶の判断用
 SetSensor(SENSOR_3,SENSOR_LIGHT);//右側の光センサー
 int nCross=0;

while(nCross<=8){


   if(nCross==0){
     senkai_right;Wait(50);
     go_forward;
     until(SENSOR_3<=left_sen);
     senkai_left;Wait(60);                                //ここでラインの上に乗っかる
     while(SENSOR_2>=sekkin){
      line_race();}
     Off(OUT_AC);                                          
     while(Message() != GO){SendMessage(HOLD);Wait(40);} //缶をつかむ&上に持ち上げる
     senkai_left;Wait(410);
     nCross++;
     }

   else if(nCross==1){
     while(SENSOR_2>=sekkin){
       line_race();}
     Off(OUT_AC);                                          
     while(Message() != GO){SendMessage(TUMU_UP);Wait(40);}//缶を積む&上に持ち上げる 
     ClearTimer(0);
     while(FastTimer(0)<300){
      line_race();}
     before_cross_line_1();
     CROSS(50,0,0);
     nCross++;
     }

   else if(nCross==2){
     while(SENSOR_2>=sekkin){
       line_race();}                                    
     Off(OUT_AC);
     while(Message() != GO){SendMessage(TUMU);Wait(40);}      //缶を積む          
     ClearTimer(0);
     while(FastTimer(0)<830){
      line_race();}
     before_cross_line_3();
     CROSS(150,0,0);
     senkai_right;Wait(130);
     Off(OUT_AC);
     while(Message() != GO){SendMessage(HASAMI);Wait(40);}      //ハサミを広げる
     back;Wait(100);
     senkai_right;Wait(235);
     go_forward;Wait(150);
     nCross++;
     }

  else if(nCross==3){
     ClearTimer(0);
     while(FastTimer(0)<1000){
      line_race();}
     before_cross_line_2();
     CROSS(50,150,0);
     nCross++;
    }

  else if(nCross==4){
      ClearTimer(0);
      while(FastTimer(0)<200){
         line_race();}
      before_cross_line_3();
      CROSS(50,0,150);
      nCross++; 
    }

   else if(nCross==5){
     while(SENSOR_2>=sekkin){
       line_race();}                  
     Off(OUT_AC);                                         
     while(Message() != GO){SendMessage(HOLD);Wait(40);}     //缶をつかむ&上に持ち上げる          
     ClearTimer(0);
     while(FastTimer(0)<1600){
      line_race();}
     before_cross_line_3();
     go_forward;Wait(50);
     CROSS(50,0,0);
     nCross++;
     }

   else if(nCross==6){
     while(SENSOR_2>=sekkin){
       line_race();}
     Off(OUT_AC);
     while(Message() != GO){SendMessage(TUMU_UP);Wait(40);}  //缶を積む&上に持ち上げる
     while(SENSOR_2>=sekkin){
       line_race();}
     Off(OUT_AC);
     while(Message() != GO){SendMessage(TUMU);Wait(40);}      //缶を積む        
     ClearTimer(0);
     while(FastTimer(0)<300){
      line_race();}
     before_cross_line_1();
     go_forward;Wait(50);
     senkai_right;Wait(150);
     CROSS(50,0,150);
     nCross++;
     }

   else if(nCross==7){
     ClearTimer(0);
     while(FastTimer(0)<200){
        line_race();}
     before_cross_line_3();
     go_forward;Wait(50);
     senkai_right;Wait(150);
     CROSS(50,0,150);
     nCross++; 
    }

   else if(nCross==8){
     ClearTimer(0);
     while(FastTimer(0)<1000){
      line_race();}
     before_cross_line_3();
     CROSS(50,0,0);
     senkai_right;Wait(100);                    
     Off(OUT_AC);
     while(Message() != GO){SendMessage(HASAMI);Wait(40);}      //ハサミを広げる
     back;Wait(500);      
     nCross++;
     }

}                                                                //while(nCross<=8)終わり
stop main;                                                     //task main()を終了
}
-ハサミ&エレベータのプログラム 
#define GO 1//このメッセージを送るともう一つのRCXが再始動する
#define HOLD 2//もう一つのRCXからこのメッセージが送られると1つ目の缶を持ち上げる動作をする
#define TUMU_UP 3//もう一つのRCXからこのメッセージが送られると1つ目の缶を2つ目の缶に積んで2つ目の缶を持ち上げる動作をする
#define TUMU 4//もう一つのRCXからこのメッセージが送られると1,2目の缶を3つ目の缶に積んで3つ目の缶を挟む動作をする
#define HASAMI 5//もう一つのRCXからこのメッセージが送られるとハサミを広げる動作をする
#define hasamu OnRev(OUT_A);Wait(50);Off(OUT_A);//ハサミを閉じる
#define hirogeru OnFwd(OUT_A);Wait(50);//ハサミを広げる
#define up OnRev(OUT_C);Wait(150);Off(OUT_C);//エレベータを上げる
#define down(t) OnFwd(OUT_C);Wait(t);Off(OUT_C);//エレベータを下げる
#define go_sin PlaySound(SOUND_UP);//goというサインを出したときわかりやすく音を鳴らす
sub send_go(){                              //goというサインを出すサブルーチン
 ClearTimer(0);
 while(FastTimer(0)<=200){SendMessage(GO);Wait(5);}
}
task main(){
int n=1;
while(true){
  
 ClearMessage();  
 SetPower(OUT_A,4);
 SetPower(OUT_C,5);
  
 if(Message() == HOLD){                //1つ目の缶を持ち上げる
   n=0;
   hasamu;
   up;
   go_sin;
   send_go();
 }
  
 else if(Message() == TUMU_UP){      //1つ目の缶を2つ目の缶に積んで2つ目の缶を持ち上げる
   n=0;
   down(20);
   hirogeru;
   down(130);
   hasamu;
   up;
   go_sin;
   send_go();
 }

 else if(Message() == TUMU){            //1,2目の缶を3つ目の缶に積んで3つ目の缶を挟む
   down(20);
   hirogeru;
   down(130);
   hasamu;
   go_sin;
   send_go();
   n=1;
 }

 else if(Message() == HASAMI){         //ハサミを広げる
   hirogeru;
   go_sin;
   send_go();
   n=1;
 }

 if(n==0){SetPower(OUT_C,1);OnRev(OUT_C);Wait(100);Off(OUT_C);Wait(100);}

}
}

↑
*この講義の反省と感想 [#z1fb2aca]
ロボットを作る過程はみんな一緒に協力する、自分自身に対していい経験です。また、外国人の私に対して交流面問題がある、でもみんな根気がよいてわたしの意見を聞いた。とてもありがどうございます。とりあいず、ロボット制作に関する知識は工科の私に対していい経験です


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