光を追いかけ、光の動きが止まれば、その方向にブロックを投げつける。
*正確に光の方向を向くこと。 *光の方向にブロックを飛ばすこと。
#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])
#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])
#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])
#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])
#define DEGREE_OF_LIGHT 40 #define STOP_TIME 100 // 止まっている時間 #define BACK_TIME 70 // 交差点で逆に行く時間 #define GO_TIME 150 // 交差点でまっすぐ行く時間 #define NUMOFCROSS 4*3 // コースの中にある交差点の数 #define GO 0 #define BACK 1 #define RIGHT 0 #define LEFT 1 #define AWARE 40 // コースを外れたと判断する時間 int iNumOfCross = 0; // 走っている間に数える交差点変種 int iDirection = LEFT; // 曲がっている方向 int iGoOrBack = 0; // 前進しているか後進しているか判断変種 task main ( ) { SetSensor ( SENSOR_1, SENSOR_LIGHT ); // 光センサを設定 SetSensor ( SENSOR_2, SENSOR_TOUCH ); // タッチセンサを設定 SetSensor ( SENSOR_3, SENSOR_LIGHT ); // 光センサを設定 PlaySound ( SOUND_UP ); ClearTimer ( 0 ); while ( iNumOfCross <= NUMOFCROSS ) { // 指定された交差点の数まで繰り返す if ( SENSOR_1 > DEGREE_OF_LIGHT ) { // 光センサ1が黒い線を見つかったら。。。 if ( SENSOR_3 > DEGREE_OF_LIGHT ) { // 光センサ3が黒い線を見つかったら。。。 if ( Timer ( 0 ) >= AWARE) { // 指定された時間まで何もしなくて行ったら コースを外れたと判断する。 // 黒い線を見つかるまでに後進する until ( SENSOR_1 < DEGREE_OF_LIGHT || SENSOR_3 < DEGREE_OF_LIGHT ) { OnRev ( OUT_A ); OnRev ( OUT_C ); } if ( iDirection == RIGHT ) { OnRev ( OUT_C ); OnFwd ( OUT_A ); Wait ( 30 ); until ( SENSOR_1 > DEGREE_OF_LIGHT && SENSOR_3 > DEGREE_OF_LIGHT ) { OnRev ( OUT_C ); OnFwd ( OUT_A ); } } else { OnRev ( OUT_A ); OnFwd ( OUT_C ); Wait ( 40 ); until ( SENSOR_1 > DEGREE_OF_LIGHT && SENSOR_3 > DEGREE_OF_LIGHT ) { OnRev ( OUT_A ); OnFwd ( OUT_C); } } ClearTimer ( 0 ); } // 前進する OnFwd ( OUT_A ); OnFwd ( OUT_C ); } else { //右に曲がる iDirection = RIGHT; OnRev ( OUT_C ); OnFwd ( OUT_A ); Wait ( 10 ); ClearTimer ( 0 ); } } else { // 左に曲がる if ( SENSOR_3 > DEGREE_OF_LIGHT ) { iDirection = LEFT; OnFwd ( OUT_C ); OnRev ( OUT_A ); Wait ( 10 ); ClearTimer ( 0 ); } else { //交差点を見つかったとき // 指定された交差点の数だったらここで止まる if ( iNumOfCross == NUMOFCROSS ) { break; } //前進するとき交差点を見つかったら少し止まった後で出発 if ( iGoOrBack == GO ) { iNumOfCross++; OnRev ( OUT_A ); OnRev ( OUT_C ); PlaySound ( SOUND_DOUBLE_BEEP ); Wait ( BACK_TIME ); Off ( OUT_A ); Off ( OUT_C ); Wait ( STOP_TIME ); OnFwd ( OUT_A ); OnFwd ( OUT_C ); Wait ( GO_TIME ); ClearTimer ( 0 ); } } } // トッチセンサに何かぶつかったら少し止まった後で出発 if ( SENSOR_2 == 1 ) { Off ( OUT_A ); Off ( OUT_C ); PlaySound ( SOUND_CLICK ); Wait ( STOP_TIME ); } } // コースを走ることが終わったら止まる Off ( OUT_A + OUT_C ); PlaySound ( SOUND_LOW_BEEP ); }
1.初めは、センサーを黒線の上をたどるようにしたが、いったん黒線を外れると、元の位置に戻るのが難しかった。よって、黒線の外側にタッチセンサーがくるようにした。
2.カーブするときタイヤを微妙に逆回転させることによって、黒線をたどるようにした。
3.黒線をたどることはできたが、黒線から外れてしまった場合、元に戻すことが難しかった。そこで、五秒間直進した場合、ロボットにコースから外れたことを認識させ、黒線が見つかるまでバックし、黒線を見つけ次第、再び黒線をたどるようにした。