2013b/Member

課題2について

を参照願います。

メンバー

  • bsさん ロボットとプログラミング両方バランス良くこなす。物理科ということで、ロボットの補強時やギアや赤外線の辺りでそれっぽい発言が聞けました。
  • dtbさん ほとんどのことをやってくれたdtbさんには感謝致します。ロボットの形やプログラムの大半は彼が作ったものです。
  • weiさん ロボット担当。多くのアイデアを出してくれたので、ロボットを作る時助かりました。
  • jogio 私でございます。ロボット担当で、dtbさんが作ったロボットを基に補強を頑張ったつもり。一応理学部の人間なので、bsさんのそれっぽい発言をそれっぽく返していました。

ロボットについて

今回私たちが作ったロボットはこちらになります。

  • 全体的に見た感じ
    全体像
  • 別の角度で見てみる
    反対側
  • 空き缶を掴むはさみ部分
    はさみ
    • 駆動部は、安定になると考え、キャタピラにしました。
    • RCXは、このように配置しました。PCからプログラムを送信する時の事を考慮して、2つのRCXの間に空間を作りました。
      後ろ側
    • はさみの部分はエレベーター式で、下の写真のギザギザした部分にギアが噛み合い、はさみの部分が上に上がる形になっています。
      エレベーター

プログラムについて

今回私はプログラムを担当しなかったので、プログラムを載せるだけという形になってしまいます。詳しい事はdtbさんやbsさんのページをご覧願います。

車体用のプログラム

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

}
}

反省など

反省

  • 発表までの時間が長い訳ではなかったので、ちょくちょく集まりロボット作りをしましたが、期末の時期ということもあり、チーム全員が集まるのが少なくなってしまいました。発表までにロボットを作れたのは良かったと思います。とはいえ、ロボット作りに時間がかかり過ぎた感があります。プログラミングを発表の時まで上手くいかず苦戦していたのが見られました。結果としては、ロボットがうまく動かずに終わってしまいました。キャタピラの構造は案外簡単なもので、車体の重さに耐えることが出来なかったことが原因であると推測されます。はさみの部分も、ギアがエレベーターにうまく噛み合ない時があり、上にうまく上がらないことがありました。本番に近づくにつれて、このようなトラブルが生じ、それらの対応に苦労しました。

感想

  • 珍しい授業で面白そうだと思い受講しましたが、結構時間がかかったりうまくいかず難しいこともありました。ですが、ロボット作りや初めてやったプログラミングは楽しいと感じてやることが出来ました。

添付ファイル: fileimage-11.jpeg 204件 [詳細] fileimage-10.jpeg 92件 [詳細] fileimage-9.jpeg 188件 [詳細] fileimage-8.jpeg 98件 [詳細] fileimage-7.jpeg 100件 [詳細] fileimage-6.jpeg 193件 [詳細] fileimage-5.jpeg 200件 [詳細] fileimage-4.jpeg 191件 [詳細] filerobocon2013b.png 90件 [詳細]

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