NXTでライントレースをやってみた
とりあえずNXTでライントレースをやってみたまあ、基本的なところは誰が作ってもほぼ一緒なので、難しいところはないです。白い床に黒のビニルテープでラインを引くことを想定しています。(直角のカーブまでしか曲がれません)1:両方白の時、速めの速度で前進します。2:右のみ黒の時、右が白になるまで右にその場回転をします3:左のみ黒の時、左が白になるまで左にその場回転をします4:両方黒の時、今回のポイントです。 両方黒となった場合、ラインは90°かちょっときつめのカーブです そこで、以下のようにラインを越しながら曲がって行きます。 ・両方が白になるまでゆっくり前進します ・前進の途中でどちらかが白になればカーブと反対側のセンサと判断します ・両方が白になったところで判断した方と反対方向にその場回転をします ・判断したセンサが黒になれば、通常のライントレースに戻ります こんな判断をしていますので、90°よりきついカーブは判定がうまくいかず、 失敗します^^;以下ソース(タブがうまくいかないので、フォーマッターでも使ってください)--------------//Motor output#define OUT_LEFT OUT_A#define OUT_RIGHT OUT_C#define OUT_BOTH OUT_AC//Motor direction#define DIRECTION -1//speed#define SPD_TRACKING 50#define SPD_SLOWMOVING 40#define SPD_SEARCH 20//Motor Function Macro#define OnFwdDir(a,b) OnFwd(a,(DIRECTION)*(b))#define OnRevDir(a,b) OnRev(a,(DIRECTION)*(b))#define OnFwdRegDir(a,b,c) OnFwdReg(a,(DIRECTION)*(b),c)#define OnRevRegDir(a,b,c) OnRevReg(a,(DIRECTION)*(b),c)#define OnFwdSyncDir(a,b,c) OnFwdSync(a,(DIRECTION)*(b),c)#define OnRevSyncDir(a,b,c) OnRevSync(a,(DIRECTION)*(b),c)//SENSOR Select#define SENSOR_RIGHT IN_2#define SENSOR_LEFT IN_1//SENSOR VALUE#define RIGHT_BLACK_VALUE 15#define RIGHT_WHITE_VALUE 44#define LEFT_BLACK_VALUE 21#define LEFT_WHITE_VALUE 54//THRESHOLD Black-White#define THRESHOLD_RIGHT_BLACK (RIGHT_BLACK_VALUE+RIGHT_WHITE_VALUE)/2#define THRESHOLD_LEFT_BLACK (LEFT_BLACK_VALUE+LEFT_WHITE_VALUE)/2task main() { int iLR_flag; SetSensorLight(SENSOR_RIGHT); SetSensorLight(SENSOR_LEFT); while(true) { if ( Sensor(SENSOR_RIGHT) < THRESHOLD_RIGHT_BLACK ) { if (Sensor(SENSOR_LEFT) < THRESHOLD_LEFT_BLACK ){ //両方黒 iLR_flag = 0; while(true) { OnFwdRegDir(OUT_BOTH, SPD_SEARCH, OUT_REGMODE_SYNC); if ( iLR_flag == 0 ) { if (Sensor(SENSOR_RIGHT) > THRESHOLD_RIGHT_BLACK) { iLR_flag = 2; } if (Sensor(SENSOR_LEFT) > THRESHOLD_LEFT_BLACK) { iLR_flag = 1; } } if ( (Sensor(SENSOR_RIGHT) > THRESHOLD_RIGHT_BLACK) && (Sensor(SENSOR_LEFT) > THRESHOLD_LEFT_BLACK) ){ break; } } while(true) { if ( iLR_flag == 1 ) { OnRevDir(OUT_RIGHT,SPD_SLOWMOVING); OnFwdDir(OUT_LEFT,SPD_SLOWMOVING); if (Sensor(SENSOR_LEFT) < THRESHOLD_LEFT_BLACK) { break; } } else { OnFwdDir(OUT_RIGHT,SPD_SLOWMOVING); OnRevDir(OUT_LEFT,SPD_SLOWMOVING); if (Sensor(SENSOR_RIGHT) < THRESHOLD_RIGHT_BLACK) { break; } } } } else { //右のみ黒 OnRevDir(OUT_RIGHT,SPD_SLOWMOVING); OnFwdDir(OUT_LEFT,SPD_SLOWMOVING); } } else { if (Sensor(SENSOR_LEFT) < THRESHOLD_LEFT_BLACK ){ //左のみ黒 OnFwdDir(OUT_RIGHT,SPD_SLOWMOVING); OnRevDir(OUT_LEFT,SPD_SLOWMOVING); } else { //両方白 OnFwdSyncDir(OUT_BOTH,SPD_TRACKING,0); } } }}