[[2011a]] *ハードウェア [#f69f9e3c] *ソフトウェア [#s2af5312] **hiros [#gfa35d61] ***作戦(ロータリー) [#wbec58d9] 2つの光センサを使って、黒線を挟み、適時修正しながら進めていく。 まずはロータリーについては考えない事にした。 交差点に到達したら、まっすぐ先に進んでいくというプログラムを考えた。 交差点の判定は、「右も左も黒であれば、交差点」と考えた。 ***コード [#af8f3e5f] #define isBlack <40 #define isWhite >40 #define R SENSOR_3 #define L SENSOR_1 #define RM OUT_C #define LM OUT_A #define LINE 8 void go(){ OnFwd(RM+LM); } void tr(){ OnFwd(LM); //Off(RM); OnRev(RM); } void tl(){ OnFwd(RM); // Off(LM); OnRev(LM); } void move(){ if (L isWhite && R isWhite) go(); else if (L isWhite && R isBlack) tr(); else if (L isBlack && R isWhite) tl(); else if (L isBlack && R isBlack){ /* PlaySound(SOUND_CLICK); go(); Wait(LINE); } } task main (){ SetSensor (R, SENSOR_LIGHT); SetSensor (L, SENSOR_LIGHT); while (1){ move(); } } ***作戦(ロータリー改) [#w644155f] 上のコードでは、直角な交差点ではまっすぐに進むが、私たちの交差点はかなり斜めで、「右も左も黒」、という判定になりにくい。よって、コードを新しく考える必要があった。 例えば、右が黒で、左は白であるとき、上のコードでは「右に道がある」ということになり、すぐ右に回転をしてしまう。これだと、斜めな交差点にさしかかると「右に回転ー>左に回転」の無限ループに陥って、その場から動かなくなってしまう。 なので、判定を入れる事にした。 ***コード [#zdd515b3]