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