ライン上にいるときは前進するようにプログラムしてみました。 左右に振りながら動くプログラムよりはっきりと速いのがわかります。 精度もよく、ヘアピンカーブもOKです。 /* 黒い線をトレースするロボット のプログラム */ // 作成者:山崎 // 作成日:2005-11-18 //右折のサブルーチン sub right() {OnRev(OUT_C); OnFwd(OUT_A);} //左折のサブルーチン sub left() {OnRev(OUT_A); OnFwd(OUT_C);} task main () { SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーをセンサー2にひとつだけ付けました while (true ) { OnRev(OUT_A+OUT_C);//前進 if (SENSOR_2 > 40){ //ラインから外れたら ClearTimer(0);//右折時間を計るタイマースタート right();//右折 until((SENSOR_2 < 40) || ((Timer(0)>2) && (SENSOR_2 > 40))); //センサーがラインに戻る または 0.2秒してもラインに戻らないと右折終了 if ((Timer(0)>2) && (SENSOR_2 > 40)){ //0.2秒してもラインに戻らないときは left();//左折 until(SENSOR_2 < 40);//ラインに戻るまで } } } } &size(25){わかったこと}; -光センサーは、白いところではセンサー>40、黒いところではセンサー<40。 -複雑な条件式でも()でくくってやればできる。 -untilはWaitより大事かもしれない。 -二つの処理のうちどちらかを選ぶ(今回は右折と左折)場合、どちらかをさせて、間違っていたらもう一方の処理に変える方法がある。 **Timerを使うと処理時間が計れる。これを利用すればそろそろ終了しているはずの処理が未完了のとき、その処理が間違った処理であったと判断できる。 [#u11a8be4] これはこれからもよくでてきそうなのでテンプレート感覚で使えるようにまとめてみました。 AまたはBの処理をしてやらないといけないとき { ClearTimer(0);//Aの行動時間を計るタイマースタート A(); until((処理効果が出たときの条件式) || ((Timer(0)>効果が出るまでの予想タイム) && (効果なしのときの条件式))); //効果がでる または 予想タイムになっても効果なしならAを終了 if ((Timer(0)>効果が出るまでの予想タイム) && (効果なしのときの条件式)) { //場合によってはここにAの処理でしてしまった間違った動作を訂正する文を挿入する B(); until(処理効果が出たときの条件式);//効果が出るまで } } **アドバイスなどありましたらこちらへ [#z8a29125] #comment [[戻る>2005/C6/y0]] [[C6のTOPへ>2005/C6]] RIGHT: tya&counter(today); &counter(yesterday); &counter(all); //11月18より