[[2006b/A1/ロボコン]]

#contents

*プログラム-メインRCX(本体) [#yb215ab6]

行動側のプログラムです。

 #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);OnFwd(OUT_C);
 #define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);OnFwd(OUT_A);
 #define straight(t) ClearTimer(1);while(FastTimer(1)<t){OnFwd(OUT_A+OUT_C);Wait(11);Float(OUT_A);Wait(1);OnFwd(OUT_A);}
 #define back(t) ClearTimer(2);while(FastTimer(2)<t){OnRev(OUT_A+OUT_C);Wait(11);Float(OUT_A);Wait(1);OnRev(OUT_A);}
 #define tsukamiage(t) OnFwd(OUT_B);Wait(t);Off(OUT_B);
 #define sagehanashi(t) OnRev(OUT_B);Wait(t);Off(OUT_B);
 #define off Off(OUT_A+OUT_B+OUT_C);

よく使うプログラムの部分を先に定義しておきます。

このロボットは OnFwd(OUT_A+OUT_C) ではモーターC側に寄ってしまうので、前進と後退のプログラムは while を使って調整してあります。

 task main(){
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 ClearMessage();
 
 int matagi=0;
 
 sagehanashi(200);

#ref(2006b/A1/ロボコン/構想6.JPG,left);
ここでこうなります(アピール)。
 while(matagi<2)         定数『またぎ』はスタート円から目標円まで行く際、ライントレース用のセンサで下を見、
 {                黒線をまたいだ回数を数えます。
 straight(13);
 if(SENSOR_1<45){matagi++;}
 until(SENSOR_1>45);
 }
 
 while(SENSOR_1>45)             円をライントレースするので、機体を右へ向けます。
 {turn_right(5);}
 
 ClearTimer(0);           ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
 while(FastTimer(0)<330)      ライントレースをします。
 {                 タイマーと while を使って円のおおよそ1/4、荷物の横まできます。
        if(SENSOR_1<45){Off(OUT_A);Wait(5);
        if(SENSOR_1<45){OnRev(OUT_A);until(SENSOR_1>45);}OnFwd(OUT_A);}
 }                  ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
 
 turn_left(110);               頭を荷物へ向け・・・
 
 off;
 tsukamiage(220);Wait(100);     最初にあげておいたアームを下ろし、
 tsukamiage(130);               ・・・つかむ!
 
 
 
 
 SendMessage(3);           つかんだことをもう一つのRCX(以後相方)に伝えます。
 back(10);
 
 turn_left(140);
 
 while(Message()==0){straight(13);}    ゴールまで来たら相方がメッセージを入れてくれます。
 ClearMessage();
 
 back(20);
 off;
 tsukamiage(150);               持ち上げて、
 while(Message()==0){straight(13);}
 off;Wait(50);             前進し、
 
 sagehanashi(170);           落とす。
 back(100);
 off;
 tsukamiage(100);           この後、ゴールのふちに乗っかっている荷物を
 straight(100);            アームを使って押し込みます。
 off;Wait(100);
 tsukamiage(60);
 back(100);off;
 sagehanashi(340);
 Float(OUT_B);off;
 
 SendMessage(3);            相方へ二巡目に移ることを伝えます。
 
 
 
 
 
 
 back(100);   /////////////////////////////////  二巡目
 
 turn_right(120);         動作は大まかに言って、ゴールからL字を描き・・・
 straight(300);
 turn_right(120);
 while(SENSOR_1>45){straight(13);}
 straight(20);           目標円にぶつかるまで直進し、
 while(SENSOR_3>40){turn_left(5);}
 OnFwd(OUT_A+OUT_C);
 
 
 ClearTimer(0);
 while(FastTimer(0)<100)      ライントレースです。
 {
                if(SENSOR_3<40){Off(OUT_C);Wait(5);
                if(SENSOR_3<40){OnRev(OUT_C);until(SENSOR_3>40);}OnFwd(OUT_C);}
 }
 
 
 
 turn_right(120);                  ここから先は一巡目のつかむ所以後と一緒です。
 straight(10);
 off;
 tsukamiage(220);Wait(100);
 tsukamiage(130);
 
 SendMessage(3);
 
 while(SENSOR_1<45){straight(10);}straight(20);off;
 
 turn_right(140);
 
 while(Message()==0){straight(14);}
 
 back(20);
 off;
 tsukamiage(150);
 while(Message()<2){straight(13);}
 off;Wait(50);
 
 sagehanashi(170);
 back(100);
 off;
 tsukamiage(100);
 straight(100);
 off;
 tsukamiage(60);
 back(100);off;
 sagehanashi(320);
 Float(OUT_B);
 
 
 
 back(200);turn_right(1000);      最後にアピールして終わり。
 }

*プログラム-センサRCX(相方) [#xa05f79e]

 task main(){
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 ClearMessage();
 int t=1;
 
 repeat(2){
 
 until(Message()==3);       メッセージに3が入る(荷物をつかむ)まで待機します。
 ClearMessage();
 Wait(100);PlayTone(330,60);    本体のメッセージを受信したことを音でわかるように。
 
 while(Message()==0)        二順目に入る際に本体からメッセージが送られるのでこんな条件になっています。
    {if(SENSOR_2==1)        タッチセンサが反応したら、
       {ClearTimer(0);
          while(FastTimer(0)<10)
          {SendMessage(t);     0.1秒メッセージを送ります。
       }t++;            最初あたった回数で少し違うことをさせようとしていたので、その名残がここに。
    }Wait(50);
 
 }
 
 }}

*いろいろ [#l0d57575]

-メッセージは SendMessage(x); だけでも普通に送れるらしいが、支障がないのでタイマーの部分を放置。

-相方の光センサは判別に使う予定だったが、ロボコン前日(?)からうまく機能しなくなり、でも付いてても支障がないのでやっぱり放置。

-
-アームをいっぱいに広げると重心が後ろへ行き、ライントレース中に荷物に当たらない + なんかかっこいい。

-何箇所か until を使っていたところで不具合があったが、 while にかえて(条件を反対にすれば可)みるとうまくいった。なぜ?

-終わってから改めて見てみると、判別を前日にあきらめたので、プログラムが不自然に。まあ問題なく動くので良。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS