[[2006a/C2/ロボコン]] *プログラム紹介 [#j19e3d6c] **プログラム内容 [#u0041896] #define light 35 #define light2 38 #define straight OnRev(OUT_A + OUT_C); #define buck_turn OnFwd(OUT_A + OUT_C); #define right_turn OnRev(OUT_A);OnFwd(OUT_C); #define left_turn OnRev(OUT_C);OnFwd(OUT_A); #define right OnRev(OUT_A);Off(OUT_C); #define buck_right OnFwd(OUT_C);Off(OUT_A); #define left OnRev(OUT_C);Off(OUT_A); #define buck_left OnFwd(OUT_A);Off(OUT_C); #define off Off(OUT_A + OUT_C); #define up OnRev(OUT_B); #define down OnFwd(OUT_B); #define Stop Off(OUT_B); int count = 0; int count2 = 0; int timer = 0; int cm_per_s = 0; int metel = 0; int circuit = 0; task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while(1){ while(count < 2){ if((SENSOR_1 > light) && (SENSOR_2 > light) && (SENSOR_3 > light)){ straight; }else if((SENSOR_1 <= light) && (SENSOR_2 > light) && (SENSOR_3 > light)){ straight; }else if((SENSOR_1 <= light) && (SENSOR_2 <= light) && (SENSOR_3 > light)){ left; }else if((SENSOR_1 > light) && (SENSOR_2 <= light) && (SENSOR_3 > light)){ left_turn; }else if((SENSOR_1 <= light) && (SENSOR_2 > light) && (SENSOR_3 <= light)){ right; }else if((SENSOR_1 > light) && (SENSOR_2 > light) && (SENSOR_3 <= light)){ right_turn; }else if((SENSOR_2 <= light2) && (SENSOR_3 <= light2)){ count++; Wait(10); switch(count){ case 1: Wait(10); straight; ClearTimer(0); break; case 2: timer = FastTimer(0); cm_per_s = 25 / timer; metel = 8 / cm_per_s; circuit = (32 / cm_per_s) * 2 - 10; Wait(metel); off; Wait(20); right_turn; Wait(circuit); off; break; } } } straight; Wait((40 / cm_per_s) * 3); off; Wait(20); left_turn; Wait(circuit); off; Wait(20); buck_turn; Wait((25 / cm_per_s) * 3); off; Wait(20); down; Wait(70); Stop; Wait(20); straight; Wait((25 / cm_per_s) * 3); off; Wait(20); left_turn; Wait(circuit); off; Wait(20); straight; Wait((40 / cm_per_s) * 3); off; Wait(20); left_turn; Wait(circuit); off; Wait(20); straight; Wait((25 / cm_per_s) * 3); off; Wait(20); right; Wait(20); off; Wait(20); straight; Wait((30 / cm_per_s) * 3); off; Wait(20); right; Wait(20); off; Wait(20); straight; Wait((30 / cm_per_s) * 3); off; Wait(20); right; Wait(20); off; Wait(20); straight; Wait((25 / cm_per_s) * 3); off; Wait(20); left_turn; Wait(circuit); off; Wait(20); straight; Wait((40 / cm_per_s) * 3); off; Wait(20); right_turn; Wait((25 / cm_per_s) * 3); } } **プログラム解説 [#de008a19] -今回最終的に使用したプログラムはこのプログラムです。見ても分かると思いますが、製作途中です。つまり、大会に参加した段階ではまだ未完成だったのです。ここに準備不足が顕著に表れています。ちなみに、この形になるまでに6回ほど書き直しました。大会会場でも二回ほど書き直したのですが、今考えてみると一つのプログラムを詰めていった方が確実だったのかと思います。 -まず、このプログラムではswitch文を最初から最後まで使おうとしていました。理由としては、最初にプログラムを書くにあたって十字(三つのセンサーが同時に黒)の部分を数えていって旋回をしようと考えていたためです。そのため、if文を大量に使うよりもswitch文でケース分けした方が楽だろうと考えていたのです。 -まず、文の冒頭でif文を用いて旋回をさせています。センサーがそれぞれどのように反応したかでどちら側に旋回をするか、外輪のみを回すのか、外輪を正転・内輪を逆転させるのか、といった感じで条件をかけて旋回運動をさせようとしてみました。 -switch文のcountは全てのセンサーが黒を認識した場合のみカウントしています。これによって十字の数を認識しています。 -switch文の内部は、このプログラムでは一つめの十字(T字)は直進、二つめの十字は左に旋回をするようにしています。 -その後はcountを使って、秒指定で動かしています。 **言い訳 [#y0ce5591] -このプログラムになるまでにはいくつかの経緯があります。 -まず最初の段階では二台のマシンが、中央まで運ぶマシン・ゴールまで運ぶマシンに分けようということになっていました。そして、このマシンはゴールまで運ぶマシンだったのです。なので、後^ゴールまで運ぶプログラムとして書いていました。ですがなかなかうまくいかず、この段階で二回ほど書き直していました。一方マシンの方は、途中でこの二台で活用するのは難しいだろうということで、このゴールを運ぶマシンのみで全てをまかなうことになりました。この判断は多分正しかったと思います。しかし、決断を下したのが大会の前日だったという点がネックでした。一度全てプログラムを書き直し(といっても基盤は同じなのですが)てプログラムを作ったのですが、どうしても間に合いませんでした。 -