*program in robokon [#vf7aa1b5]
下記のプログラムが、僕達の作ったプログラムです。&br;
正式には、下記に少々手を加え、エラーや、動く上でのミスが出ないよう調整したものを使用しました。&br;&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();
teisi();}&br;
}&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;
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;
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;
until( (SENSOR_1<49)&&(SENSOR_1>40) );          //緑のライン復帰&br;
teisi();&br;
turn_left();&br;
until((SENSOR_1<49)&&(SENSOR_1>40));&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;

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