2006b/A1/ロボコン

プログラム-メインRCX(本体)

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

#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);
構想6.JPG

ここでこうなります(アピール)。

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(相方)

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

}

}}

いろいろ

  • メッセージは SendMessage(x); だけでも普通に送れるらしいが、支障がないのでタイマーの部分を放置。
  • 相方の光センサは判別に使う予定だったが、ロボコン前日(?)からうまく機能しなくなり、でも付いてても支障がないのでやっぱり放置。
  • アームをいっぱいに広げると重心が後ろへ行き、ライントレース中に荷物に当たらない + なんかかっこいい。
  • 何箇所か until を使っていたところで不具合があったが、 while にかえて(条件を反対にすれば可)みるとうまくいった。なぜ?
  • 終わってから改めて見てみると、判別を前日にあきらめたので、プログラムが不自然に。まあ問題なく動くので良。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-15 (木) 22:32:14 (4569d)