2017a/Member 目次

課題について

2017a/Mission3を参照してください。

ロボットについて

写真や詳しい情報は2017a/Member/kyo/Mission3を参照してください。

缶収集ロボットを考えるのには積み上げに形を合わせるようにしたので、形状を何度も変えていたので、結構な時間をかけました。

プログラムについて

缶収集ロボットの定義とsubについて

缶収集ロボットの定義は

 #define senter 37
 #define TURN_right OnFwd(OUT_A);Off(OUT_C);
 #define TURN_left OnFwd(OUT_C);Off(OUT_A);
 #define overTURN_right OnFwd(OUT_A);OnRev(OUT_C);
 #define overTURN_left OnFwd(OUT_C);OnRev(OUT_A);

となっている。前回とは違ってsenterというもので域値を定義した。またTURN_right/leftのやり方を変えました。

そして、subは

 sub line()
 {
   SetPower(OUT_AC,1);
   SetSensor(SENSOR_2,SENSOR_LIGHT);
    if(SENSOR_2 >senter +12){
        overTURN_right;
    }else if(SENSOR_2 >senter +4){
        TURN_right;
     }else if(SENSOR_2 >senter +0){
        OnFwd(OUT_AC);
     }else if(SENSOR_2 >senter -4){
        TURN_left; 
     }else{
        SetPower(OUT_C,0);
        overTURN_left;
     }
  }

となっています。缶収集ロボットは前回と同じくライントレースをするためのものとなっている。域値の足し引きをすることでひとつの定義で動かすことが出来ました。

缶積み上げ用ロボットの定義について

次に缶積み上げ用ロボットの定義は

 #define ageru(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);
 #define sageru(t) OnRev(OUT_A);Wait(t);Off(OUT_A);
 #define tukamu OnFwd(OUT_C);Wait(time_a);Off(OUT_C);
 #define hanasu OnRev(OUT_C);Wait(time_a);Off(OUT_C);
 #define lowpower SetPower(OUT_A,0);
 #define conspower SetPower(OUT_A,7);
 #define go_forward(t) OnFwd(OUT_B); Wait(t); Off(OUT_B);
 #define back(t) OnRev(OUT_B); Wait(t); Off(OUT_B);

ageruとsageruは見たとおり、アームを上げ下げするために使われる。また(t)は一缶目と二缶目で上げる時間が異なるために使われる。tukamuとhanasuもアームの開閉に使われる。time_aは時間調整が同じなのにいちいち変えるのがいやであったので、task main()の所で時間をおいている。そして、丁寧に下げしたい時にlowpowerが使われ、二缶を上げしたい時にconspower使う。go_forwardとbackは自分が前進か後進をするときに混乱しないように定義している。

動かそうとした缶収集のプログラムについて

 task main()
 {
   ClearMessage(); //メッセージをクリアしている。//
   SetSensor(SENSOR_1,SENSOR_TOUCH);
   SetSensor(SENSOR_2,SESNOR_LIGHT);
   OnFwd(OUT_AC);
   until(SENSOR_2<senter);
   Wait(20);
   Off(OUT_AC);
   Wait(90);

まずスタート地点でsenterの値を取るまで前進させてその後に止まるようにしている。

   while(Message()==0){
     line();
   }
   Off(OUT_AC);
   SendMessage(2); //相手にメッセージを送る//
   Wait(50);
   OnFwd(OUT_AC);
   until(Message()==3);
   Off(OUT_AC);

その後、こちらのメッセージが変わるまでline()を実行してその後止まって相手にメッセージを送り間隔を空けたあとに前進を始めて、メッセージが切り替わるまで待って止めた。

   until(Message()==4);
   OnFwd(OUT_AC);
   until(Message()==3);
   Off(OUT_AC);

これもメッセージが切り替わるまで待ったり進んだりしているだけである。

   until(Message()==5);
   OnRev(OUT_AC);
   Wait(100);
   OnFwd(OUT_A);
   Wait(70);
   OnFwd(OUT_C);
   until(SENSOR_2<37);
   Wait(20);
   Off(OUT_AC);
   Wait(90);
   while(Message()==5){
     line();
   }
   Off(OUT_AC);
   SendMessage(7);
   Wait(50);
   OnFwd(OUT_AC);
   until(Message()==3);
   Off(OUT_AC);
   until(Message()==8);
   OnRev(OUT_AC);
   Wait(100);
   Off(OUT_AC);
 }

ここで特に変わったことはない。混乱をしないようにメッセージの数字の番号が変わっている。

動かそうとした缶積み上げ用ロボットのプログラム

   task main()
   {
   SetSensor(SENSOR_1,SENSOR_TOUCH);
   int n=0;
   int time_a=40;
   ClearMessage();
   SetPower(OUT_B,3);
   back(320);

定義で述べたようにtime_aの時間を決めている。またnを使うことでその後の繰り返しで何回も実行しないようにしている。

   ClearTimer(0);
   while(FastTimer(0)<150){
     SendMessage(1);
     Wait(100);
     if(Message()==0){
        ClearTimer(0);
         }
      }

ClearTimer(0)を使うことでその後の指定時間内に繰り返しでメッセージを送り続けその間隔でメッセージを受け取った時だけそれから抜け出せるようになっている。

   while(true){
     Off(OUT_AC);
     if(SENSOR_1==1){
       n++;
       SendMessage(3);
      }

SENSORに触れた時にnの値をプラスしてメッセージを送る。

   if(n==1){
     tukamu;
     ageru(450);
     Wait(100);
     Off(OUT_AC);
     SendMessage(4);
     n++;
    }

この時に缶を上げてその場で止めている。その後収集ロボットを動かすためにメッセージを送っている。

   if(n==3){
     lowpower;
     sageru(30);
     hanasu;
     Wait(100);
     sageru(50);
     tukamu;
     conspower;
     ageru(380);
     Off(OUT_AC);
     n++;
     SendMessage(5);
    }

ゆっくりと降ろして缶が倒れないようにして缶を離して、そのまま降ろす。そしてまた二缶を挙げる。その後はさっきと同様。

    if(n==4){
       Wait(200);
       ClearTimer(0);
       while(FastTimer(0)<150&&Message()==2){
               SendMessage(6);
               Wait(100);
               if(Message()==2){
                 ClearTimer(0);
                  }
               }
             }

集める缶の数が不足しているのでこれで上記と同じようになっているそして何回もメッセージを送り続けないようにするために&&を使っている。

    if(n==5){
      lowpower;
      sageru(30);
      hanasu;
      Wait(100);
      ageru(380);
      SendMessage(8);
      back(250);
      n++;
    }

これで三缶を積み上げることをやった後収集ロボット後ろに動かすためにメッセージを送り缶から離れるようにしている。

   if(n>=6){
    Off(OUT_AC);
   }
  }
 }

これで止まり続ける。全体的に見るといタッチされても大丈夫なようになってなおかつ繰り返し動作をやらないようにしている。(n=4を除く)

うまくいくはずであったのだが、うまくいかなかった。そのうえタイヤ部分が壊れやすかったので、実際は下のプログラムを実行した。

実際のプログラム

片方が

  task main()
 { 
   ClearMessage();
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   OnFwd(OUT_AC);
   until(SENSOR_2<37);
   Wait(20);
   Off(OUT_AC);
   while(Message()==0){
     line();
     }
     until(Message()==1);
   Off(OUT_AC);
   Wait(100);
   OnFwd(OUT_AC);
   Wait(280);
   Off(OUT_AC);
   OnRev(OUT_AC);
   Wait(100);
   Off(OUT_AC);
 }

これは収集のものをしているものであり、もう一方は

   task main()
   {
   ClearMessage();
   ClearTimer(0);
   while(FastTimer(0)<7200){
     SendMessage(1);
     }

とメッセージを送り続けるだけのものとなっている。

アドバイスとして

一台に繋げようが二台で通信しようがまずさっさとロボットの形を決めてしまいましょう。私達はここの改良に時間をかけすぎてしまった事と私のプログラムについてやるスピードが遅すぎたことでこの失敗が出てきてしまったと考えた。ここは反省しなけれはならない。もう終わってしまったので、次やる人へ一番伝えたいこととして、時間がある時は諦めてはいけない、だが、時間がないときは絶対できないと思うまで待ってはいけない。その後の修正がとてもてきとうなものになってしまう。

感想

この講義で3ヶ月間やり続けて楽しいこともあったが、自分の限界というものも思い知らされてしまった気がする。もっと自分に技術があればなども考えた。でもこれは自分が成長するためのステップであったかもしれないので、他のことにもめげずに頑張っていきたい。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-10 (木) 16:13:27