- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*メンバー [#e548edde]
-TOKIO
-あしもぷ
*コースの紹介 [#c8a7e718]
-TOKIO
・近道担当
-あしもぷ
・直角担当
*マシンの紹介 [#wad561b2]
*プログラムなど、工夫したところ [#wad561b2]
-TOKIO
・初め、交差点などはタイマーを使って攻略しようとしていたが、そのときのロボットのコンディションにより時間がバラバラだったのであきらめ、交差点の数を数える方法に変更した。
・ロータリーを進んでいくとき、なぜか知らないが交差点の数を数え間違える時があるので、黒線を踏んで軌道を修正するとき、細かくではなく大きく曲がるようにした。そうすることでうまくいった。
・「黒線を踏んだ」と認識させるとき、初めは{(SENSOR_1<XX)}などと片方についてしか定義していなかったが、そうすると、たまに間違えて反応したりしてしまったので、{((SENSOR_1<XX) && (SENSOR_3>XX))} と、左右のセンサーについてそれぞれ定義することによりこれを克服した。
・音を出すことにより、今どのプログラムが実行されているかを確認できるようにした。
・曲がるときも、2種類の曲がり方をその都度適したところでそれぞれ使用した。
・センサーどうしの感覚を広くとることによって、カーブなどで曲がった時にお互いが黒線の上に乗るのを防いだ。
・ロボットについては色々と考えたがやはり無難なシンプル四輪車にした。
-あしもぷ
*プログラムの紹介 [#f539fa26]
**TOKIOのプログラム [#h78e4c8a]
#define GO OnFwd(OUT_A+OUT_C); //直進
#define TR OnFwd(OUT_A);Off(OUT_C); //右に大きく曲がる
#define TL OnFwd(OUT_C);Off(OUT_A); //左に大きく曲がる
#define TRX OnFwd(OUT_A);OnRev(OUT_C); //右に曲がる
#define TLX OnFwd(OUT_C);OnRev(OUT_A); //左に曲がる
#define XX 40 //閾値の値
#define STOP Off(OUT_A+OUT_C); //止まる
#define TIME 50 //タイマーなどの時間
task main()
{SetSensor(SENSOR_1, SENSOR_LIGHT);SetSensor(SENSOR_3, SENSOR_LIGHT);
int a = 0; //交差点の数を数える
while( a <= 2 ) //初めは二回数える
{
if((SENSOR_1>XX) && (SENSOR_3>XX)) //どっちのセンサーも黒線に乗っていないときは直進
{GO;}
if((SENSOR_1<XX) && (SENSOR_3>XX)) //もし左が黒線に乗ったら左に曲がる
{TLX;}
if((SENSOR_3<XX) && (SENSOR_1>XX)) //もし右が黒線に乗ったら右に曲がる
{TRX;}
if((SENSOR_1<XX) && (SENSOR_3<XX)) //両方のセンサーが黒線に乗ったら直進
{STOP;GO;Wait(TIME);a = a+1;}
}PlaySound(SOUND_UP); //動作終了確認音
TRX;until((SENSOR_1<XX) && (SENSOR_3>XX)); //ここからロータリー開始
PlaySound(SOUND_DOWN);
int t = 0; //一回めの交差点は無視する
while( t <= 0 )
{
if((SENSOR_1<XX) && (SENSOR_3>XX)) //細かく曲がるのではなく少し大きく曲がる
{TLX;Wait(20);}
if((SENSOR_1<XX) && (SENSOR_3<XX))
{TLX;Wait(20);}
if((SENSOR_1>XX) && (SENSOR_3<XX))
{TLX;Wait(20);t = t+1;}
if((SENSOR_1>XX) && (SENSOR_3>XX))
{GO;}
}PlaySound(SOUND_UP);
//ロータリー終了
int u = 0;
while( u<=1 )
{TRX;if(SENSOR_1<XX){u=u+1;};}PlaySound(SOUND_DOWN); //軌道が戻るまで右旋回
ClearTimer(0); //近道に近づくまでは今まで通り進む
while( Timer(0) <= 22 )
{
if((SENSOR_1<XX) && (SENSOR_3>XX))
{TLX;}
if((SENSOR_3<XX) && (SENSOR_1>XX))
{TRX;}
if((SENSOR_1>XX) && (SENSOR_3>XX))
{GO;}
}PlaySound(SOUND_UP);
TRX;Wait(80);GO;until((SENSOR_1<XX) || (SENSOR_3<XX));PlaySound(SOUND_DOWN); //近道に入って通り抜ける
TRX;until((SENSOR_1<XX) && (SENSOR_3>XX));PlaySound(SOUND_UP); //近道終了
int c = 0; //交差点の数を数えロータリーに入る。それまでは今まで通り進む。
while( c <= 1 )
{
if((SENSOR_1>XX) && (SENSOR_3>XX))
{GO;}
if((SENSOR_1<XX) && (SENSOR_3>XX))
{TLX;}
if((SENSOR_3<XX) && (SENSOR_1>XX))
{TRX;}
if((SENSOR_1<XX) && (SENSOR_3<XX))
{STOP;GO;Wait(TIME);c = c+1;}
}PlaySound(SOUND_DOWN);PlaySound(SOUND_DOWN);
TRX;until((SENSOR_1<XX) && (SENSOR_3>XX)); //ロータリー開始
int z = 0;
while( z <= 1 )
{if(SENSOR_1<XX){u=u+1;}
if((SENSOR_1<XX) && (SENSOR_3>XX))
{TLX;Wait(20);}
if((SENSOR_1<XX) && (SENSOR_3<XX))
{TLX;Wait(20);}
if((SENSOR_1>XX) && (SENSOR_3<XX))
{TLX;Wait(20);z= z+1;}
if((SENSOR_1>XX) && (SENSOR_3>XX))
{GO;}
}PlaySound(SOUND_UP); //ロータリー終了
int n = 0;
while( n<=0 )
{TRX;if(SENSOR_1<XX){n=n+1;}}PlaySound(SOUND_DOWN); //軌道が乗るまで右旋回する
int y = 0; //交差点を無視しながら線に沿って今まで通り進む
while( y <= 1 )
{
if((SENSOR_1>XX) && (SENSOR_3>XX))
{GO;}
if((SENSOR_1<XX) && (SENSOR_3>XX))
{TLX;}
if((SENSOR_3<XX) && (SENSOR_1>XX))
{TRX;}
if((SENSOR_1<XX) && (SENSOR_3<XX))
{STOP;GO;Wait(TIME);y = y+1;} //ゴールしたら止まる
}
}
**あしもぷのプログラム [#c93196bb]