ラインをトレースしパックを回収、その後サークル内に移動するためのプログラム
なおセンサー1は光センサー(右)、センサー3は光センサー(左)、OUT_Aはキャタピラ(右)、OUT_Cはキャタピラ(左)に接続
#define THRESHOLD 40 //黒線白線の区別の境界 #define SIGNALON 1 //メッセージ送受信用 #define SIGNALOFF 2 //メッセージ送受信用 #define SIGNALkeep 4 //メッセージ送受信用 #define SIGNALfin 5 //メッセージ送受信用 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに設定 int i; int i_min=1,i_max=4; //関数iを設定 int x; int x_min=1,x_max=2; //関数xを設定 ClearMessage(); //メッセージをクリア while(Message() == SIGNALOFF);{ Off(OUT_A+OUT_C);} //OFFのメッセージ受信中はモーターを停止 if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_A+OUT_C);} //両側のセンサーが白と判断した場合直進 while((SENSOR_1<=THRESHOLD)&&(SENSOR_3>THRESHOLD)){ //右側のセンサー黒と判断した場合 for(i=i_min;i<i_max; i++){ //それが1〜3回目の時 OnFwd(OUT_A+OUT_C); Wait(30);}} //30進む for(x=x_min;x<x_max; x++){ //4回目の時 OnFwd(OUT_A); OnRev(OUT_C); Wait(90); //45度曲がる Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(100); //100進む Off(OUT_A+OUT_C); ClearMessage(); //クリアメッセージ SendMessage(SIGNALkeep); //メッセージを送る until(Message()==SIGNALfin); //メッセージを受信するまで続ける OnRev(OUT_A+OUT_C); Wait(100); 100戻る OnFwd(OUT_C); OnRev(OUT_A); Wait(90);} //45度曲がる if((SENSOR_1>THRESHOLD)&&(SENSOR_3<=THRESHOLD)){ //左側のセンサーが黒と判断した場合 OnFwd(OUT_C); OnRev(OUT_A);} //軌道修正 if((SENSOR_1<=THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //両側のセンサーが黒と判断した場合 OnFwd(OUT_A+OUT_C);} //前に進む }
&ref(): File not found: "robocon-2007a-field-a2.gif " at page "2007a/A2/ロボコン"; このようなルートを」たどる・・・はずだった
実はこのプログラムは間違っている。原因はforの働きを勘違いしていたことにある。このプログラムのまま動かすと、for以下終わるまで連続で動作することになってしまう。右側のセンサーで超えた黒線の数をカウントしたい場合
int count==0; if(SENSOR_1>THRESHOLD){ count++} while(count==3 || count==6){
などとしなければならなかった。
ロボットの完成日と自分の予定により、プログラムの製作開始が当日の朝になってからであった。もっと早くから取り掛かることができていればと思うと非常に残念。
以前にもロボットにこだわりすぎて、肝心のプログラムに手が回らないという失敗をしているのにもかかわらず、今回またそれを繰り返してしまったことがなによりふがいなく思う。
また、本番ではパックの置かれる位置を勘違いしていたり、タッチセンサーがうまく働かないなど、2台の連動がうまくいかなかったりとトラブルが相次いだ。結果は1つも積み重ねられないという残念なものだった。
本番2回目は、なんとしてでも積むために
task main() { repeat(3){ ClearTimer(0); SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearMessage(); while(Message() == SIGNALOFF);{ Off(OUT_A+OUT_C);} while((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_A+OUT_C); } while((SENSOR_1>THRESHOLD)&&(SENSOR_3<=THRESHOLD)){ OnFwd(OUT_C); OnRev(OUT_A);} while((SENSOR_1<=THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_A); OnRev(OUT_C);} while((SENSOR_1<=THRESHOLD)&&(SENSOR_3<=THRESHOLD)){ OnFwd(OUT_A+OUT_C);} if(FastTimer(0)>=5000); OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(280); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(500); Off(OUT_A+OUT_C); } }
というプログラムを急遽作成し、センサーもメッセージも関係なく動かした。結果3点取れたものの、これで良かったのか?と考えると後悔しか残らない結果である。
#define SIGNALON 1 #define SIGNALOFF 2 #define SIGNAL 3 #define SIGNALkeep 4 sub lift_up() { OnFwd(OUT_B); Wait(500); Off(OUT_B); } sub lift_down() { OnRev(OUT_B); Wait(500); Off(OUT_B); } sub move_narrow() { OnFwd(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); } sub move_wide() { OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); } task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); int i; int i_min=1,i_max=1; int x; int x_min=1,x_max=1; int j; int j_min=1,j_max=1; ClearMessage(); while(SENSOR_2 == 1) { for(i=i_min;i<=i_max; i++){ SendMessage(SIGNALOFF); move_narrow(); lift_up(); SendMessage(SIGNALON); for(x=x_min;x<=x_max; x++){ SendMessage(SIGNALOFF); move_wide(); lift_down(); move_narrow(); lift_up(); SendMessage(SIGNALON); for(j=j_min;j<=j_max; j++){ SendMessage(SIGNALOFF); move_wide(); lift_down(); move_narrow(); lift_up(); SendMessage(SIGNALON); } } } } while(Message() == SIGNALkeep) { lift_down(); move_wide(); } }