[[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 にかえて(条件を反対にすれば可)みるとうまくいった。なぜ? -終わってから改めて見てみると、判別を前日にあきらめたので、プログラムが不自然に。まあ問題なく動くので良。