まだページ制作中です。 *黒い線に沿って動くロボット [#e9227f4e] *&size(25){パターン1}; [#y21254fc] モータを1つ、光センサを1つ使用しました。モータ1つでは右折と左折のジグザグ走行がやっとです。 // 作成者:山崎 畠山 // 作成日:2005-11-28 #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); while (true) { OnFwd(OUT_A); //左折します。 ClearTimer (0); until ((SENSOR_1 > THRESHOLD) && (Timer(0)>5));//ラインからはみでて、左折開始から0.5秒後まで OnRev (OUT_A); //右折します。 ClearTimer (0); until ((SENSOR_1 < THRESHOLD) && (Timer(0)>5));//ラインに戻り、右折開始から0.5秒後まで } } *&size(25){パターン2}; [#j599fd00] モータを2つ、光センサを1つ使用しました。高速に移動できるようなプログラムを考えてみました。 int i; //どのサブルーチンを行うかを決める変数です。 //右折から試すサブルーチン(i==0のとき) sub right_first() { while (i==0) { OnFwd(OUT_A+OUT_C);//前進 if (SENSOR_2 > 40){ //ラインから外れたら ClearTimer(0);//右折時間を計るタイマースタート OnFwd(OUT_C); OnRev(OUT_A);//右折 until((SENSOR_2 < 40) || ((Timer(0)>2) && (SENSOR_2 > 40))); //センサーがラインに戻る または 0.2秒してもラインに戻らないと右折終了 if ((Timer(0)>2) && (SENSOR_2 > 40)){ //0.2秒してもラインに戻らないときは ClearTimer(0); OnFwd(OUT_A); OnRev(OUT_C);//左折 until((SENSOR_2 < 40) || ((Timer(0)>4) && (SENSOR_2 > 40))); i=1; if ((Timer(0)>4) && (SENSOR_2 > 40)){ //0.4秒してもラインに戻らないときは OnFwd(OUT_C); OnRev(OUT_A);//再び右折 until(SENSOR_2 < 40); i=0;} } } } } //左折から試すサブルーチン(i==1のとき) sub left_first() { while (i==1) { OnFwd(OUT_A+OUT_C);//前進 if (SENSOR_2 > 40){ //ラインから外れたら ClearTimer(0);//左折時間を計るタイマースタート OnFwd(OUT_A); OnRev(OUT_C);//左折 until((SENSOR_2 < 40) || ((Timer(0)>2) && (SENSOR_2 > 40))); //センサーがラインに戻る または 0.2秒してもラインに戻らないと左折終了 if ((Timer(0)>2) && (SENSOR_2 > 40)){ //0.2秒してもラインに戻らないときは ClearTimer(0); OnFwd(OUT_C); OnRev(OUT_A);//右折 until((SENSOR_2 < 40) || ((Timer(0)>4) && (SENSOR_2 > 40))); i=0; if ((Timer(0)>4) && (SENSOR_2 > 40)){ //0.4秒してもラインに戻らないときは OnFwd(OUT_A); OnRev(OUT_C);//再び左折 until(SENSOR_2 < 40); i=1;} } } } } task main () { i = 0; SetSensor(SENSOR_2, SENSOR_LIGHT); while (true){ right_first();//右折から試すサブルーチンをします。 left_first();();//左折から試すサブルーチンをします。 } } このプログラムはわかりづらいので、だいたいの流れをまとめてみました。(実際は精度をよくするためどちらに曲がるかというのを右、左、また右と、曲がれないときは3回試します。) #ref(説明.jpg) -カーブでは連続で右折または左折の一方を行います。そこで、一度右折(左折)すると次も右折(左折)から試すようにし、右、左どちらのカーブも高速で曲がれるようにしました。 *&size(25){難しかった点}; [#b0c538f1] -モータ1つでの移動方法を考えるのが苦労した。 -ギアが多くなり、ギア比を考えるのが大変だった。 *&size(25){工夫した点}; [#fba1df2f] -0.5秒以上ずつ曲がるので確実に前進できます。 *&size(25){反省点}; [#e33ec352] - *&size(25){感想}; [#sc3bfd89] - *&size(20){コメントはこちらまで}; [#a5cd97d1] -タイマを有効に活用していますね。あと、どうでもいいコメントで申し訳ありませんが、最初に左折するサブルーチンの名前は left_fast より left_first のほうがいいかも。 -- [[松本(教員)]] &new{2005-11-30 (水) 09:47:20}; -しまったぁぁぁ!!すぐ直します。 -- [[山崎]] &new{2005-11-30 (水) 17:10:48}; #comment [[戻る>2005/C6]] RIGHT: tya&counter(today); &counter(yesterday); &counter(all); //11月28より