2006b/A1/ロボコン/プログラム
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[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 にかえて(条件を反対にすれば可)みるとうまくいった。なぜ?
-終わってから改めて見てみると、判別を前日にあきらめたので、プログラムが不自然に。まあ問題なく動くので良。
終了行:
[[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 にかえて(条件を反対にすれば可)みるとうまくいった。なぜ?
-終わってから改めて見てみると、判別を前日にあきらめたので、プログラムが不自然に。まあ問題なく動くので良。
ページ名: