#define threshold 45 #define turn_left OnRev(OUT_A);OnFwd(OUT_C); #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define stop_turning Off(OUT_A+OUT_C); #define akarui 40 int cross ; int cro ; void go_a(int cro) { cross = 0 ; while(true){ if (SENSOR_1+ SENSOR_2+ SENSOR_3 > akarui) { cross = cross + 1 ; } if (cross == cro) { Off(OUT_A+OUT_C) ; } cross = 0 ; } } sub li_a() { SetSensor(SENSOR_1, SENSOR_LIGHT); setSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); OnFwd(OUT_A); OnRev(OUT_C); Wait(140);Off(OUT_A+ OUT_C); OnFwd(OUT_A+OUT_C);Wait(200);Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(100);Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(200); while (true) { if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui ) && (SENSOR_1> akarui)) { OnFwd(OUT_A+OUT_C); } if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } if((SENSOR_3< akarui )&& (SENSOR_2 <akarui ) && ( SENSOR_1 > akarui) ){ OnFwd(OUT_C); OnRev(OUT_A);} if((SENSOR_2 < akarui) && (SENSOR_3< akarui ) && (SENSOR_1 < akarui )){ OnFwd(OUT_A+OUT_C); } if ((SENSOR_1 < akarui ) && (SENSOR_3 < akarui ) && (SENSOR_2 > akarui )){ OnFwd(OUT_C); OnRev(OUT_A); } if((SENSOR_1>akarui)&& (SENSOR_2>akarui)&&(SENSOR_3<akarui)){ OnFwd(OUT_C); OnRev(OUT_A);} if ((SENSOR_1 < akarui ) && (SENSOR_2 > akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } } } task main() { SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_1, SENSOR_LIGHT); OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C); Wait (300); OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); ClearMessage(); until (Message() != 0); if ( Message() == 1 ){ PlaySound(SOUND_CLICK); li_a(); go_a(4); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(5);} if ( Message() == 2 ) { PlaySound(SOUND_CLICK); li_a(); go_a(3); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(4);} if ( Message() == 3 ) { PlaySound(SOUND_CLICK); li_a(); go_a(2); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(2);} OnFwd(OUT_A); OnRev(OUT_C); Wait(148); OnFwd(OUT_A+OUT_C); Wait(250); ClearMessage(); until (Message() != 0); if ( Message() == 1 ) { PlaySound(SOUND_CLICK); li_a(); go_a(5); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(6);} if ( Message() == 2 ) { PlaySound(SOUND_CLICK); li_a(); go_a(4); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(5);} if ( Message() == 3 ) { PlaySound(SOUND_CLICK); li_a(); go_a(3); OnFwd(OUT_A);OnRev(OUT_C);Wait(300); li_a(); go_a(4);} OnFwd(OUT_A); OnRev(OUT_C); Wait(148); OnFwd(OUT_A+OUT_C); Wait(250); ClearMessage(); until (Message() != 0); if ( Message() == 1 ){ turn_left; li_a();PlaySound(SOUND_CLICK); go_a(6);} if ( Message() == 2 ) {turn_right; li_a(); PlaySound(SOUND_CLICK); go_a(5); } if ( Message() == 3 ) { stop_turning; li_a();PlaySound(SOUND_CLICK); go_a(4); } }
エビチリ版プログラムです。やたらめったら長いのが特徴。 我らがマシンはアームと車体で別々のプログラムを組んでいますが、その車体のプログラムです。 関数で十字路の数を数えて、それを目安に止まるようにプログラムしたつもりです。 実際使ったのはこれの改良版でしたが、雛形として役に立ったのなら作ったかいがあるというもの、手前味噌ですが、自慢の一品です。
#define akarui 45 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C); Wait (300); OnRev(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(120); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(150); Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(80); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(120); OnFwd(OUT_C); OnRev(OUT_A); while (true) { if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui ) && (SENSOR_1> akarui)) { OnFwd(OUT_A+OUT_C); } if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } if((SENSOR_3< akarui )&& (SENSOR_2 <akarui ) && ( SENSOR_1 > akarui) ){ OnFwd(OUT_C); OnRev(OUT_A);} if((SENSOR_2 < akarui) && (SENSOR_3< akarui ) && (SENSOR_1 < akarui )){ OnFwd(OUT_A+OUT_C); } if ((SENSOR_1 < akarui ) && (SENSOR_3 < akarui ) && (SENSOR_2 > akarui )){ OnFwd(OUT_C); OnRev(OUT_A); } if((SENSOR_1>akarui)&&(SENSOR_2>akarui) && (SENSOR_3<akarui)){ OnFwd(OUT_C); OnRev(OUT_A);} if ((SENSOR_1 < akarui ) && (SENSOR_2 > akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } } }
2回目のチャレンジのために作った車体プログラムです。 チームの頑張りにより、ライントレース性能はその一よりも遥かに向上したため、チームも驚天動地の大健闘を見せてくれました。 ただアームとの連携がうまくいかず、判断、分別という行動にしばしば失敗してしまいます。残念無念。
#define akarui 45 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); start A; start B;} task A() { stop B; OnFwd(OUT_A+OUT_C);Wait(50); Off(OUT_A+OUT_C); Wait (300); OnRev(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(120); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(150);Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(80); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(120); OnFwd(OUT_C); OnRev(OUT_A); //箱を取ったら曲線のところまで移動 while (true) //曲線に入ったらライントレース { if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui ) && (SENSOR_1> akarui)) { OnFwd(OUT_A+OUT_C); } if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } if((SENSOR_3< akarui )&& (SENSOR_2 <akarui ) && ( SENSOR_1 > akarui) ){ OnFwd(OUT_C); OnRev(OUT_A);} if((SENSOR_2 < akarui) && (SENSOR_3< akarui ) && (SENSOR_1 < akarui )){ start B; //全部黒いとき(交差点で)taskBに変わる。 } if ((SENSOR_1 < akarui ) && (SENSOR_3 < akarui ) && (SENSOR_2 > akarui )){ OnFwd(OUT_C); OnRev(OUT_A); } if((SENSOR_1>akarui)&&(SENSOR_2>akarui) && (SENSOR_3<akarui)){ OnFwd(OUT_C); OnRev(OUT_A);} if ((SENSOR_1 < akarui ) && (SENSOR_2 > akarui) && (SENSOR_3> akarui)) { OnFwd(OUT_A); OnRev(OUT_C); } } } task B() if((SENSOR_2 < akarui) && (SENSOR_3< akarui ) && (SENSOR_1 < akarui )) {stop A;Off(OUT_A+OUT_C);SendMessage(5); Wait (50);} //交差点に入ってtaskBに変わった瞬間にtaskA停止。アームに交差点に到着したメッセージを送る ClearMessage(); until (Message() != 0); if ( Message() == 1 ) {OnFwd(OUT_A+OUT_C); Wait (500);OnRev(OUT_A);Wait(150); Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);} if ( Message() == 2 ) {OnFwd(OUT_A+OUT_C); Wait (250);OnRev(OUT_A);Wait(150); //色によって1〜3のメッセージが来る。それに従って前進時間が変わる。 Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);} if ( Message() == 3 ) {OnFwd(OUT_A+OUT_C); Wait (150);OnRev(OUT_A);Wait(150); Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);} }
対三回目のチャレンジ用の車体プログラムです。 中川殿のタスクを分けようという新発想、1つ入れることに集中するため、大幅にその二を改良、これによって分別が可能になったのです。 しかし本番では車体が引っかかってしまい、痛恨のリタイヤ。ままならないものです、ああ世知辛い。
中川:2度目も失敗、三度目まであとわずか、最早賭けに出るしかない。もう1個でも入ればいい。とにかく箱をケースまで持って行ければいい。今の状況で、まともにできる方法はこれしかない。そんな思考の基に作りました。結果は見るに耐えませんでしたが。調整不足でした・・・。
task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); ClearMessage(); while(SENSOR_2 == 1){ OnRev(OUT_C);Wait(300); ClearMessage(); until (Message() != 0); if(SENSOR_3< 40){ ClearTimer(0); while ( Timer(0) <= 50 ) { SendMessage(1); } } if(45>SENSOR_3> 40){ ClearTimer(0); while ( Timer(0) <= 50 ) {SendMessage(3); } } if(45<= SENSOR_3){ ClearTimer(0); while ( Timer(0) <= 50 ) {SendMessage(2); }} if( Message() == 4) { OnFwd(OUT_C); Wait(300);Off(OUT_C); } if( Message() == 7) { OnFwd(OUT_A); Wait(300);Off(OUT_A); } repeat(3){ OnRev(OUT_C); Wait(200);Off(OUT_C);Wait(200); } } } }
アームの試作プログラムです。 アームの下についているタッチセンサに牛乳パックの台があたるとアームが閉じ、色を識別しその旨を通信、車体がかごの前にくるとアームを開く、、予定でした(笑) このプログラムではなぜかアームが開いてくれないのです。摩訶不思議。 whileを二つにしてつかむ命令と識別の命令を別々にしてやるとアームは閉じますが識別、通信してくれませんでした。困った物です。
task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); OnRev(OUT_C);Wait(300);Off(OUT_C); //つかむ ClearMessage(); until (Message() != 0); if ( Message() == 4 ) {PlaySound(SOUND_UP) ; OnFwd(OUT_C); } //メッセージが来たら放す。 if(Message() == 5){ if(SENSOR_3< 40){ ClearTimer(0); while ( Timer(0) <= 50 ) { SendMessage(1); } } if(45>SENSOR_3> 40){ ClearTimer(0); while ( Timer(0) <= 50 ) {SendMessage(3); } //色に従って送るメッセージが変わる。 } if(45<= SENSOR_3){ ClearTimer(0); while ( Timer(0) <= 50 ) {SendMessage(2); PlaySound(SOUND_UP) ;} } }}
対一個用車体プログラムその三のために作られた、立ち位置が自由なのを利用して開始と同時にアームを閉じ、識別するプログラムです。 その一と違ってアームはちゃんとしまります。ただアクションが早いせいか、審判の開始の合図よりも速く動いてしまいました。せっかちですね。 急ごしらえの割にはなかなか実践的なプログラムでした。うむ、秀逸。