2006b/A6/RoBoCoN/program
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2006b/A6/RoBoCoN]]
#contents
*プログラム [#f5af9adc]
**RCX1(走行系) [#ba7f55e0]
主に走行に必要なセンサーやモーターを集めた方です。~
無駄が多くてやたら長いくせに上手くいきません;;
#define LIGHT 40
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ−2を左側の光センサーに定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を左側の光センサーに定義
//OUT_A = 右タイヤ, OUT_C = 左タイヤ
int i, x, TIME;
/*威嚇モーション*/
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(10);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(10);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(60);
ClearMessage();
OnFwd(OUT_A+OUT_C);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
Wait(20);
OnRev(OUT_C);
until(SENSOR_3 <= LIGHT);
OnFwd(OUT_C); OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
for(i=0;i<=2;){ //一番奥の横棒に接触するまでライントレース
if(SENSOR_3 <= LIGHT){
if(i==0){
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
until(SENSOR_2 > LIGHT);
OnFwd(OUT_C);Off(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==1){
OnFwd(OUT_A+OUT_C); Wait(10);
OnFwd(OUT_C);Off(OUT_A);
until(SENSOR_2 < LIGHT);
until(SENSOR_2 > LIGHT);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
/*ターゲットに向けて旋回*/
OnFwd(OUT_A);OnRev(OUT_C);
Wait(30);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(40);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(65);
/*円の向かいの線までターゲットも持って行って、掴む*/
OnFwd(OUT_A+OUT_C);
Wait(100);
until(SENSOR_2 < LIGHT);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 35){
SendMessage(1); //tukame
}
/*ラインに復帰*/
OnFwd(OUT_C); OnRev(OUT_A); Wait(26);
OnFwd(OUT_A+OUT_C);
Wait(280);
until(SENSOR_2 <= LIGHT);
/*最後の横棒までライントレース*/
for(i=0;i<=2;){
if(SENSOR_3<= LIGHT){
if(i<=1){
OnFwd(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
/*分かれ道まで進む*/
OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
OnFwd(OUT_A+OUT_C);
until(SENSOR_2<=LIGHT);
Off(OUT_A+OUT_C);
/*持っているものによって分かれ道の方向を選択*/
ClearMessage();
SendMessage(255); //RCX2に識別を促す通信を出す
until(Message() == 6 || Message() == 7);
if(Message()==6){ //アルミ缶
x=0;
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
until(SENSOR_2<=LIGHT);
while(Message()!=5){
if(FastTimer(0) > 500){ /*ぶつかる程度で停止*/
break;
}
else if(SENSOR_2<=LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_A); OnRev(OUT_C);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
/*投下作業*/
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー(車体を持ち上げる)
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
else if(Message()==7){ //紙パック
x=1;
OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
until(SENSOR_3<=LIGHT);
ClearTimer(0);
while(Message()!=5){
if(FastTimer(0) > 500){ //ぶつかる程度で停止
break;
}
else if(SENSOR_3<=LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A);
Wait(15);
OnFwd(OUT_C+OUT_A);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー開始
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
~
↑ここまでが、一回目の運搬作業のプログラムです。~
↓ここからは使えなかった(上手くいかなかった)二回目のプログラムです。
~
Off(OUT_A+OUT_C); //一時停止
Wait(200);
/*分岐点まで逆走で戻る*/
if(x==0){ //アルミ缶の場合
for(i=0;i==0;){
if(SENSOR_3 <= LIGHT){
OnFwd(OUT_C);
}
else if(SENSOR_2 <= LIGHT){
OnFwd(OUT_C); 180°回転
Wait(120);
i++;
}
else{
OnRev(OUT_A+OUT_C);
}
}
}
else if(x==1){ //紙パックの場合
for(i=0;i<1;){
if(SENSOR_2 <= LIGHT){
OnFwd(OUT_A);
}
else if(SENSOR_3 <= LIGHT){
OnFwd(OUT_A);
Wait(120); //180°回転
i++;
}
else{
OnRev(OUT_A+OUT_C);
}
}
}
/*スタート地点まで戻る*/
OnFwd(OUT_A+OUT_C);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
ClearTimer(0);
until(SENSOR_2 <= LIGHT);
TIME = FastTimer(0) / 2;
until(SENSOR_2 >= LIGHT);
Wait(TIME);
/*90°回転*/
OnFwd(OUT_A); OnRev(OUT_C);
Wait(110);
/*以下からは一回目の逆を行きます*/
ClearMessage();
OnFwd(OUT_A+OUT_C);
until(SENSOR_3 <= LIGHT);
until(SENSOR_3 >= LIGHT);
Wait(20);
OnRev(OUT_A);
until(SENSOR_2 <= LIGHT);
OnFwd(OUT_A); OnRev(OUT_C);
until(SENSOR_3 < LIGHT);
for(i=0;i<=2;){
if(SENSOR_2 <= LIGHT){
if(i==0){
OnFwd(OUT_A);OnRev(OUT_C);
until(SENSOR_3 < LIGHT);
until(SENSOR_3 > LIGHT);
OnFwd(OUT_A);Off(OUT_C);
until(SENSOR_3 < LIGHT);
i++;
}
else if(i==1){
OnFwd(OUT_A+OUT_C); Wait(10);
OnFwd(OUT_A);Off(OUT_C);
until(SENSOR_3 < LIGHT);
until(SENSOR_3 > LIGHT);
until(SENSOR_3 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_3 <= LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C);OnRev(OUT_A);
Wait(30);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(40);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(60);
OnFwd(OUT_A+OUT_C);
Wait(100);
until(SENSOR_2 < LIGHT);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 40){
SendMessage(1); //掴む
}
OnFwd(OUT_C); OnRev(OUT_A); Wait(20);
OnFwd(OUT_A+OUT_C);
Wait(250);
for(i=0;i<=2;){
if(SENSOR_3<= LIGHT){
if(i<=1){
OnFwd(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
OnFwd(OUT_A+OUT_C);
until(SENSOR_2<=LIGHT);
Off(OUT_A+OUT_C);
/*持っているものによって分岐*/
ClearMessage();
SendMessage(255);
until(Message() == 6 || Message() == 7);
if(Message()==6){ //アルミ缶の場合
x=0;
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
until(SENSOR_2<=LIGHT);
while(Message()!=5){
if(FastTimer(0) > 500){
break;
}
else if(SENSOR_2<=LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_A); OnRev(OUT_C);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー開始
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
else if(Message()==7){ //紙パックの場合
x=1;
OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
until(SENSOR_3<=LIGHT);
ClearTimer(0);
while(Message()!=5){
if(FastTimer(0) > 500){
break;
}
else if(SENSOR_3<=LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
Off(OUT_A+OUT_C);
/*終了*/
}
~
~
~
**RCX2(技能系) [#ja4eb9c9]
アームやウィーリーなどの特殊な機能が集約しています。~
主にRCXの一つ目と通信することで効果を発揮します。
task main(){
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2を中央のタッチセンサーに定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を中央の光センサーに定義
//OUT_A = アーム, OUT_C = ウィリー
ClearMessage();
int i=0;
while(true){
if(Message() == 1){ //アームで掴む動作
OnRev(OUT_A);Wait(40);
Off(OUT_A);
ClearMessage();
;
}
else if(Message() == 2){ //アームで離す動作
OnFwd(OUT_A);Wait(20);
Off(OUT_A);
ClearMessage();
}
else if(Message() == 3){ //ウィリー開始
OnRev(OUT_C); Wait(20);
Off(OUT_C);
ClearMessage();
}
else if(Message() == 4){ //ウィリー終了
OnFwd(OUT_C); Wait(12);
Off(OUT_C);
ClearMessage();
}
else if(SENSOR_2==1){ //衝突したら(持っている物が押されて接触)
ClearTimer(0);
while(FastTimer(0) <=50){
SendMessage(5);
}
}
else if(Message() == 255){ //RCX1から持っている物の識別の要請
if(SENSOR_3<38){ //アルミ缶
SendMessage(6);
}
else if(SENSOR_3>=38){ //紙パック
SendMessage(7);
}
ClearMessage();
}
}
}
*コメント [#qef5eb3f]
何かご意見・ご感想がある場合はここにお書きください。
終了行:
[[2006b/A6/RoBoCoN]]
#contents
*プログラム [#f5af9adc]
**RCX1(走行系) [#ba7f55e0]
主に走行に必要なセンサーやモーターを集めた方です。~
無駄が多くてやたら長いくせに上手くいきません;;
#define LIGHT 40
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ−2を左側の光センサーに定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を左側の光センサーに定義
//OUT_A = 右タイヤ, OUT_C = 左タイヤ
int i, x, TIME;
/*威嚇モーション*/
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(10);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(10);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(60);
ClearMessage();
OnFwd(OUT_A+OUT_C);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
Wait(20);
OnRev(OUT_C);
until(SENSOR_3 <= LIGHT);
OnFwd(OUT_C); OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
for(i=0;i<=2;){ //一番奥の横棒に接触するまでライントレース
if(SENSOR_3 <= LIGHT){
if(i==0){
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
until(SENSOR_2 > LIGHT);
OnFwd(OUT_C);Off(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==1){
OnFwd(OUT_A+OUT_C); Wait(10);
OnFwd(OUT_C);Off(OUT_A);
until(SENSOR_2 < LIGHT);
until(SENSOR_2 > LIGHT);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
/*ターゲットに向けて旋回*/
OnFwd(OUT_A);OnRev(OUT_C);
Wait(30);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(40);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(65);
/*円の向かいの線までターゲットも持って行って、掴む*/
OnFwd(OUT_A+OUT_C);
Wait(100);
until(SENSOR_2 < LIGHT);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 35){
SendMessage(1); //tukame
}
/*ラインに復帰*/
OnFwd(OUT_C); OnRev(OUT_A); Wait(26);
OnFwd(OUT_A+OUT_C);
Wait(280);
until(SENSOR_2 <= LIGHT);
/*最後の横棒までライントレース*/
for(i=0;i<=2;){
if(SENSOR_3<= LIGHT){
if(i<=1){
OnFwd(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
/*分かれ道まで進む*/
OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
OnFwd(OUT_A+OUT_C);
until(SENSOR_2<=LIGHT);
Off(OUT_A+OUT_C);
/*持っているものによって分かれ道の方向を選択*/
ClearMessage();
SendMessage(255); //RCX2に識別を促す通信を出す
until(Message() == 6 || Message() == 7);
if(Message()==6){ //アルミ缶
x=0;
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
until(SENSOR_2<=LIGHT);
while(Message()!=5){
if(FastTimer(0) > 500){ /*ぶつかる程度で停止*/
break;
}
else if(SENSOR_2<=LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_A); OnRev(OUT_C);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
/*投下作業*/
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー(車体を持ち上げる)
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
else if(Message()==7){ //紙パック
x=1;
OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
until(SENSOR_3<=LIGHT);
ClearTimer(0);
while(Message()!=5){
if(FastTimer(0) > 500){ //ぶつかる程度で停止
break;
}
else if(SENSOR_3<=LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A);
Wait(15);
OnFwd(OUT_C+OUT_A);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー開始
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
~
↑ここまでが、一回目の運搬作業のプログラムです。~
↓ここからは使えなかった(上手くいかなかった)二回目のプログラムです。
~
Off(OUT_A+OUT_C); //一時停止
Wait(200);
/*分岐点まで逆走で戻る*/
if(x==0){ //アルミ缶の場合
for(i=0;i==0;){
if(SENSOR_3 <= LIGHT){
OnFwd(OUT_C);
}
else if(SENSOR_2 <= LIGHT){
OnFwd(OUT_C); 180°回転
Wait(120);
i++;
}
else{
OnRev(OUT_A+OUT_C);
}
}
}
else if(x==1){ //紙パックの場合
for(i=0;i<1;){
if(SENSOR_2 <= LIGHT){
OnFwd(OUT_A);
}
else if(SENSOR_3 <= LIGHT){
OnFwd(OUT_A);
Wait(120); //180°回転
i++;
}
else{
OnRev(OUT_A+OUT_C);
}
}
}
/*スタート地点まで戻る*/
OnFwd(OUT_A+OUT_C);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
until(SENSOR_2 <= LIGHT);
until(SENSOR_2 >= LIGHT);
ClearTimer(0);
until(SENSOR_2 <= LIGHT);
TIME = FastTimer(0) / 2;
until(SENSOR_2 >= LIGHT);
Wait(TIME);
/*90°回転*/
OnFwd(OUT_A); OnRev(OUT_C);
Wait(110);
/*以下からは一回目の逆を行きます*/
ClearMessage();
OnFwd(OUT_A+OUT_C);
until(SENSOR_3 <= LIGHT);
until(SENSOR_3 >= LIGHT);
Wait(20);
OnRev(OUT_A);
until(SENSOR_2 <= LIGHT);
OnFwd(OUT_A); OnRev(OUT_C);
until(SENSOR_3 < LIGHT);
for(i=0;i<=2;){
if(SENSOR_2 <= LIGHT){
if(i==0){
OnFwd(OUT_A);OnRev(OUT_C);
until(SENSOR_3 < LIGHT);
until(SENSOR_3 > LIGHT);
OnFwd(OUT_A);Off(OUT_C);
until(SENSOR_3 < LIGHT);
i++;
}
else if(i==1){
OnFwd(OUT_A+OUT_C); Wait(10);
OnFwd(OUT_A);Off(OUT_C);
until(SENSOR_3 < LIGHT);
until(SENSOR_3 > LIGHT);
until(SENSOR_3 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_3 <= LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C);OnRev(OUT_A);
Wait(30);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(40);
OnRev(OUT_A+OUT_C); Wait(20);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(60);
OnFwd(OUT_A+OUT_C);
Wait(100);
until(SENSOR_2 < LIGHT);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 40){
SendMessage(1); //掴む
}
OnFwd(OUT_C); OnRev(OUT_A); Wait(20);
OnFwd(OUT_A+OUT_C);
Wait(250);
for(i=0;i<=2;){
if(SENSOR_3<= LIGHT){
if(i<=1){
OnFwd(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);OnRev(OUT_A);
until(SENSOR_2 < LIGHT);
i++;
}
else if(i==2){
i++;
}
}
else if(SENSOR_2 <= LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
OnFwd(OUT_A+OUT_C);
until(SENSOR_2<=LIGHT);
Off(OUT_A+OUT_C);
/*持っているものによって分岐*/
ClearMessage();
SendMessage(255);
until(Message() == 6 || Message() == 7);
if(Message()==6){ //アルミ缶の場合
x=0;
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
until(SENSOR_2<=LIGHT);
while(Message()!=5){
if(FastTimer(0) > 500){
break;
}
else if(SENSOR_2<=LIGHT){
OnRev(OUT_C);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_A); OnRev(OUT_C);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー開始
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
else if(Message()==7){ //紙パックの場合
x=1;
OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
until(SENSOR_3<=LIGHT);
ClearTimer(0);
while(Message()!=5){
if(FastTimer(0) > 500){
break;
}
else if(SENSOR_3<=LIGHT){
OnRev(OUT_A);
}
else{
OnFwd(OUT_A+OUT_C);
}
}
OnFwd(OUT_C); OnRev(OUT_A);
Wait(15);
OnFwd(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
ClearMessage();
ClearTimer(0);
while(FastTimer(0) <= 30){
SendMessage(1); //掴む
}
Wait(20);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 30){
SendMessage(3); //ウィリー
}
Wait(20);
OnFwd(OUT_A+OUT_C); Wait(50);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(2); //離す
}
Wait(20);
OnRev(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
ClearTimer(0);
ClearMessage();
while(FastTimer(0) <= 20){
SendMessage(4); //元に戻る
}
}
Off(OUT_A+OUT_C);
/*終了*/
}
~
~
~
**RCX2(技能系) [#ja4eb9c9]
アームやウィーリーなどの特殊な機能が集約しています。~
主にRCXの一つ目と通信することで効果を発揮します。
task main(){
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2を中央のタッチセンサーに定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を中央の光センサーに定義
//OUT_A = アーム, OUT_C = ウィリー
ClearMessage();
int i=0;
while(true){
if(Message() == 1){ //アームで掴む動作
OnRev(OUT_A);Wait(40);
Off(OUT_A);
ClearMessage();
;
}
else if(Message() == 2){ //アームで離す動作
OnFwd(OUT_A);Wait(20);
Off(OUT_A);
ClearMessage();
}
else if(Message() == 3){ //ウィリー開始
OnRev(OUT_C); Wait(20);
Off(OUT_C);
ClearMessage();
}
else if(Message() == 4){ //ウィリー終了
OnFwd(OUT_C); Wait(12);
Off(OUT_C);
ClearMessage();
}
else if(SENSOR_2==1){ //衝突したら(持っている物が押されて接触)
ClearTimer(0);
while(FastTimer(0) <=50){
SendMessage(5);
}
}
else if(Message() == 255){ //RCX1から持っている物の識別の要請
if(SENSOR_3<38){ //アルミ缶
SendMessage(6);
}
else if(SENSOR_3>=38){ //紙パック
SendMessage(7);
}
ClearMessage();
}
}
}
*コメント [#qef5eb3f]
何かご意見・ご感想がある場合はここにお書きください。
ページ名: