2004/B2/robokon
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*program in robokon [#vf7aa1b5]
下記のプログラムが、僕達の作ったプログラムです。&br;
正式には、下記に少々手を加え、エラーや、動く上でのミスが出ないよう調整したものを使用しました。&br;
ロボコンには、RCXを2体使用したので、robokon1,2の二つがあります。&br;&br;
robokon1
/*箱の扱いをする機関(RCXー2)のプログラム*/
#define ARM_TIME 200 /*アームの上昇もしく下降の時間*/&br;
/*サブルーチン*/
sub arm_up()/*腕上昇*/&br;
{SetPower(OUT_A,7);OnFwd(OUT_A);}&br;
sub arm_down()/*腕下降*/&br;
{SetPower(OUT_A,7);OnRev(OUT_A);}&br;
sub get()/*箱補給*/&br;
{SetPower(OUT_C,7);OnFwd(OUT_C);}&br;
sub drop()/*箱排出*/&br;
{SetPower(OUT_C,7);OnRev(OUT_C);}&br;
sub throw()/*箱押し出し*/&br;
{SetPower(OUT_B,7);OnFwd(OUT_B);}&br;
sub teisi()/*統べて停止*/&br;
{Off(OUT_A+OUT_B+OUT_C);}&br;
/*本体プログラム*/
task main()&br;
{SetSensor(SENSOR_1,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_2,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_3,SENSOR_LIGHT); /*光センサー*/&br;
while(true)&br;
{&br;
/*箱を求めて移動中。。。1*/
ClearMessage(); //メッセージ受信準備&br;
until(Message()!=0); &br;
if(Message()==1) //『1』を受信したら作動&br;
{get(); /*箱をGET*/&br;
until(SENSOR_1); //タッチセンサー&br;
ClearTimer(0); //タイマー0をリセット&br;
while(Timer(0)<=50){SendMessage(2);} //5秒間『2』を送信(atタイマー0)&br;
arm_up();&br;
Wait(ARM_TIME);&br;
teisi();&br;
/*機体の移動(RCXー1)…destinationに接触するまで*/
ClearMessage(); //メッセージの受信準備&br;
until(Message()!=0);&br;
if(Message()==100) //『100』を受け取ったら作動&br;
{while(SENSOR_1) //(箱が搭乗中)センサー1の反応している間繰り返すーー2&br;
{if(SENSOR_3 >= 40) //白OR緑の箱ならば乗せる&br;
{arm_up();&br;
drop();&br;
throw();}&br;
else //黒箱ならば別の場所に捨てる&br;
{teisi();&br;
ClearTimer(1); //タイマー1をリセット&br;
while(Timer(1)<=50){SendMessage(200);} //5秒間『200』(箱は黒箱)を送信(atタイマー1)&br;
ClearMessage();&br;
until(Message()==150); //『150』(旋回した)を受信するまで待つ&br;
arm_up();&br;
drop();&br;
throw();&br;
until(SENSOR_3 >=40); //黒箱がないことを確認&br;
ClearTimer(2); //タイマー2をリセット&br;
while(Timer(2)<=50){SendMessage(110);} //『110』(黒箱廃棄完了)を送信(atタイマー2)}&br;
} //ーーーー2に戻る&br;
ClearTimer(3);&br;
while(Timer(3)<=50){SendMessage(120);} //『120』(箱放出完了)を送信(atタイマー3)&br;
ClearMessage();&br;
until(Message()!=0); //メッセージの受信準備&br;
if(Message()==130) //『130』(旋回&緑のラインに戻って箱補給に向かう)を受信&br;
{arm_down();&br;
Wait(ARM_TIME);&br;
teisi();}&br;
}&br;
}&br;
/*箱を求めて移動中。。。1に戻る*/}
}&br;&br;&br;
robokon-2
/*機体の動き(RCXー1)を定めるプログラム*/
#define TURN_TIME 200 /*90°旋回時間*/&br;
#define ARM_TIME 200 /*アームの上昇もしくは下降の時間*/&br;
int tm_a; /*タイマーの値ー緑のラインと箱の距離*/&br;
int tm_b; /*タイマーの値ー緑のラインとdistination箱との距離*/&br;
int tm_c; /*タイマーの値ー箱の補給時間*/&br;
/*サブルーチン*/
sub turn_right() /*右旋回*/&br;
{OnRev(OUT_A); OnFwd(OUT_C);}&br;
sub turn_left() /*左旋回*/&br;
{OnFwd(OUT_A); OnRev(OUT_C);}&br;
sub go() /*直進*/&br;
{OnFwd(OUT_A+OUT_C);}&br;
sub back() /*後進*/&br;
{OnRev(OUT_A+OUT_C);}&br;
sub teisi() /*停止*/&br;
{Off(OUT_A+OUT_C);}&br;
/*プログラム本体(RCXー1)*/
task main()&br;
{SetSensor(SENSOR_1,SENSOR_LIGHT); /*光センサーセット*/&br;
SetSensor(SENSOR_2,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_3,SENSOR_TOUCH); /*タッチセンサー*/&br;
go();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) );&br;
teisi(); //注意&br;
while(true)&br;
{ClearTimer(0); //タイマー0をリセット--1*&br;
go();&br;
until(SENSOR_2 == 1) //箱の発見&br;
teisi();&br;
tm_a=Timer(0); //tm_a決定&br;
ClearTimer(1); //タイマー1をリセット&br;
while(Timer(1)<=50){SendMessage(1);} //5秒間『1』(箱発見)を送信(atタイマー1)&br;
ClearTimer(2); //タイマー2をリセット&br;
go();&br;
ClearMessage();&br;
until(Message()==2);&br;
tm_c=Timer(2); //tm_c決定&br;
//箱の取り込み動作完了
/*腕上昇*/
Wait(ARM_TIME);&br;
back();&br;
Wait(tm_a+tm_c-2); //緑のラインに復帰&br;
teisi();&br;
turn_left();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) ); //左へ方向転換&br;
ClearTimer(3); //タイマー3をリセット&br;
back(); //注意&br;
until(SENSOR_3 == 1)&br;
teisi();&br;
tm_b=Timer(3); //tm_b決定&br;
/*箱の放出*/
turn_right(); //注意&br;
Wait(TURN_TIME);&br;
teisi();&br;
back();&br;
until(SENSOR_3 ==1);&br;
teisi(); //destinationの箱に接触&br;
ClearTimer(0); //タイマー0をリセット&br;
while(Timer(0)<=50){SendMessage(100);} //5秒間『100』(destinationに接触)を送信&br;
ClearMessage();&br;
until(Message()!=0);&br;
while(Message()!=120) //『120』(箱放出完了)を受信するまで繰り返す&br;
{if(Message()==200)&br;
{turn_left(); //左旋回&br;
Wait(TURN_TIME);&br;
teisi();&br;
ClearTimer(0);&br;
while(Timer(0)<=50){SendMessage(150);} //5秒間『150』(旋回完了)を送信&br;
ClearMessage();&br;
until(Message()!=0); //メッセージ受信準備&br;
if(Message()==110) //『110』(黒箱放出完了)を送信&br;
{turn_right();&br;
Wait(TURN_TIME); //白or緑の箱の吐き出し『準備』&br;
teisi();&br;
ClearMessage();&br;
until(Message()!=0);}&br;
}&br;
}&br;
go();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) ); //緑のライン復帰&br;
teisi();&br;
turn_left();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) );&br;
teisi();&br;
ClearTimer(0);&br;
while(Timer(0)<=50){SendMessage(130);} //『130』(旋回&緑のラインに戻って補給に向かう)を送信&br;
/*箱の放出完了*/
go();&br;
Wait(tm_b); //(tm_b)の調整&br;
turn_right(); //箱の山にアームがあたるかも??&br;
Wait(TURN_TIME);&br;
teisi(); //箱山へ向き直し(1*の前に戻った)}&br;
}&br;
終了行:
*program in robokon [#vf7aa1b5]
下記のプログラムが、僕達の作ったプログラムです。&br;
正式には、下記に少々手を加え、エラーや、動く上でのミスが出ないよう調整したものを使用しました。&br;
ロボコンには、RCXを2体使用したので、robokon1,2の二つがあります。&br;&br;
robokon1
/*箱の扱いをする機関(RCXー2)のプログラム*/
#define ARM_TIME 200 /*アームの上昇もしく下降の時間*/&br;
/*サブルーチン*/
sub arm_up()/*腕上昇*/&br;
{SetPower(OUT_A,7);OnFwd(OUT_A);}&br;
sub arm_down()/*腕下降*/&br;
{SetPower(OUT_A,7);OnRev(OUT_A);}&br;
sub get()/*箱補給*/&br;
{SetPower(OUT_C,7);OnFwd(OUT_C);}&br;
sub drop()/*箱排出*/&br;
{SetPower(OUT_C,7);OnRev(OUT_C);}&br;
sub throw()/*箱押し出し*/&br;
{SetPower(OUT_B,7);OnFwd(OUT_B);}&br;
sub teisi()/*統べて停止*/&br;
{Off(OUT_A+OUT_B+OUT_C);}&br;
/*本体プログラム*/
task main()&br;
{SetSensor(SENSOR_1,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_2,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_3,SENSOR_LIGHT); /*光センサー*/&br;
while(true)&br;
{&br;
/*箱を求めて移動中。。。1*/
ClearMessage(); //メッセージ受信準備&br;
until(Message()!=0); &br;
if(Message()==1) //『1』を受信したら作動&br;
{get(); /*箱をGET*/&br;
until(SENSOR_1); //タッチセンサー&br;
ClearTimer(0); //タイマー0をリセット&br;
while(Timer(0)<=50){SendMessage(2);} //5秒間『2』を送信(atタイマー0)&br;
arm_up();&br;
Wait(ARM_TIME);&br;
teisi();&br;
/*機体の移動(RCXー1)…destinationに接触するまで*/
ClearMessage(); //メッセージの受信準備&br;
until(Message()!=0);&br;
if(Message()==100) //『100』を受け取ったら作動&br;
{while(SENSOR_1) //(箱が搭乗中)センサー1の反応している間繰り返すーー2&br;
{if(SENSOR_3 >= 40) //白OR緑の箱ならば乗せる&br;
{arm_up();&br;
drop();&br;
throw();}&br;
else //黒箱ならば別の場所に捨てる&br;
{teisi();&br;
ClearTimer(1); //タイマー1をリセット&br;
while(Timer(1)<=50){SendMessage(200);} //5秒間『200』(箱は黒箱)を送信(atタイマー1)&br;
ClearMessage();&br;
until(Message()==150); //『150』(旋回した)を受信するまで待つ&br;
arm_up();&br;
drop();&br;
throw();&br;
until(SENSOR_3 >=40); //黒箱がないことを確認&br;
ClearTimer(2); //タイマー2をリセット&br;
while(Timer(2)<=50){SendMessage(110);} //『110』(黒箱廃棄完了)を送信(atタイマー2)}&br;
} //ーーーー2に戻る&br;
ClearTimer(3);&br;
while(Timer(3)<=50){SendMessage(120);} //『120』(箱放出完了)を送信(atタイマー3)&br;
ClearMessage();&br;
until(Message()!=0); //メッセージの受信準備&br;
if(Message()==130) //『130』(旋回&緑のラインに戻って箱補給に向かう)を受信&br;
{arm_down();&br;
Wait(ARM_TIME);&br;
teisi();}&br;
}&br;
}&br;
/*箱を求めて移動中。。。1に戻る*/}
}&br;&br;&br;
robokon-2
/*機体の動き(RCXー1)を定めるプログラム*/
#define TURN_TIME 200 /*90°旋回時間*/&br;
#define ARM_TIME 200 /*アームの上昇もしくは下降の時間*/&br;
int tm_a; /*タイマーの値ー緑のラインと箱の距離*/&br;
int tm_b; /*タイマーの値ー緑のラインとdistination箱との距離*/&br;
int tm_c; /*タイマーの値ー箱の補給時間*/&br;
/*サブルーチン*/
sub turn_right() /*右旋回*/&br;
{OnRev(OUT_A); OnFwd(OUT_C);}&br;
sub turn_left() /*左旋回*/&br;
{OnFwd(OUT_A); OnRev(OUT_C);}&br;
sub go() /*直進*/&br;
{OnFwd(OUT_A+OUT_C);}&br;
sub back() /*後進*/&br;
{OnRev(OUT_A+OUT_C);}&br;
sub teisi() /*停止*/&br;
{Off(OUT_A+OUT_C);}&br;
/*プログラム本体(RCXー1)*/
task main()&br;
{SetSensor(SENSOR_1,SENSOR_LIGHT); /*光センサーセット*/&br;
SetSensor(SENSOR_2,SENSOR_TOUCH); /*タッチセンサー*/&br;
SetSensor(SENSOR_3,SENSOR_TOUCH); /*タッチセンサー*/&br;
go();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) );&br;
teisi(); //注意&br;
while(true)&br;
{ClearTimer(0); //タイマー0をリセット--1*&br;
go();&br;
until(SENSOR_2 == 1) //箱の発見&br;
teisi();&br;
tm_a=Timer(0); //tm_a決定&br;
ClearTimer(1); //タイマー1をリセット&br;
while(Timer(1)<=50){SendMessage(1);} //5秒間『1』(箱発見)を送信(atタイマー1)&br;
ClearTimer(2); //タイマー2をリセット&br;
go();&br;
ClearMessage();&br;
until(Message()==2);&br;
tm_c=Timer(2); //tm_c決定&br;
//箱の取り込み動作完了
/*腕上昇*/
Wait(ARM_TIME);&br;
back();&br;
Wait(tm_a+tm_c-2); //緑のラインに復帰&br;
teisi();&br;
turn_left();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) ); //左へ方向転換&br;
ClearTimer(3); //タイマー3をリセット&br;
back(); //注意&br;
until(SENSOR_3 == 1)&br;
teisi();&br;
tm_b=Timer(3); //tm_b決定&br;
/*箱の放出*/
turn_right(); //注意&br;
Wait(TURN_TIME);&br;
teisi();&br;
back();&br;
until(SENSOR_3 ==1);&br;
teisi(); //destinationの箱に接触&br;
ClearTimer(0); //タイマー0をリセット&br;
while(Timer(0)<=50){SendMessage(100);} //5秒間『100』(destinationに接触)を送信&br;
ClearMessage();&br;
until(Message()!=0);&br;
while(Message()!=120) //『120』(箱放出完了)を受信するまで繰り返す&br;
{if(Message()==200)&br;
{turn_left(); //左旋回&br;
Wait(TURN_TIME);&br;
teisi();&br;
ClearTimer(0);&br;
while(Timer(0)<=50){SendMessage(150);} //5秒間『150』(旋回完了)を送信&br;
ClearMessage();&br;
until(Message()!=0); //メッセージ受信準備&br;
if(Message()==110) //『110』(黒箱放出完了)を送信&br;
{turn_right();&br;
Wait(TURN_TIME); //白or緑の箱の吐き出し『準備』&br;
teisi();&br;
ClearMessage();&br;
until(Message()!=0);}&br;
}&br;
}&br;
go();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) ); //緑のライン復帰&br;
teisi();&br;
turn_left();&br;
until( (SENSOR_1<49)&&(SENSOR_1>40) );&br;
teisi();&br;
ClearTimer(0);&br;
while(Timer(0)<=50){SendMessage(130);} //『130』(旋回&緑のラインに戻って補給に向かう)を送信&br;
/*箱の放出完了*/
go();&br;
Wait(tm_b); //(tm_b)の調整&br;
turn_right(); //箱の山にアームがあたるかも??&br;
Wait(TURN_TIME);&br;
teisi(); //箱山へ向き直し(1*の前に戻った)}&br;
}&br;
ページ名: