- 追加された行はこの色です。
- 削除された行はこの色です。
[[2006b/MemberOnly/進行状況A]]
*課題 光を追いかけるロボット [#p2854809]
**プログラム1(失敗) [#q850c631]
task main()
#define T_Time 450
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int light=0;
int time;
ClearTimer(0);
while(FastTimer(0)<T_Time)
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーと定義
int light=0; //lighという名の変数を作り変数の値を0とする
int time; //timeという名の変数を作る
ClearTimer(0); //タイマ−0の値をリセット
while(FastTimer(0)<450) //タイマ−0の値が450よりも小さいなら以下のプログラムを実行する
{
OnFwd(OUT_C);OnRev(OUT_A);
if(light<SENSOR_1)
OnFwd(OUT_C);OnRev(OUT_A); //左旋回
if(light<SENSOR_1) //変数lightの値がセンサ−1の値よりも小さいなら以下のプログラムを実行
{
light=SENSOR_1;
ClearTimer(1); }}
time=FastTimer(1);
OnFwd(OUT_A);OnRev(OUT_C);
light=SENSOR_1; //変数lightの値をセンサ−1の値にする
ClearTimer(1); //タイマ−1の値をリセット(ifのプログラムの終わり)}}
(whileのプログラムの終わり)
time=FastTimer(1); //変数timeの値をタイマ−1の値にする
OnFwd(OUT_A);OnRev(OUT_C); //右旋回して最も明るい方位を向く
Wait(time);Off(OUT_A+OUT_C);Wait(100);
while(true)
{OnFwd(OUT_A+OUT_C);
if(SENSOR_3<SENSOR_1){OnRev(OUT_A);OnFwd(OUT_C);}
if(SENSOR_1<SENSOR_3){OnRev(OUT_C);OnFwd(OUT_A);}}}
while(true) //以下のプログラムを繰り返す
{OnFwd(OUT_A+OUT_C); //直進
if(SENSOR_3<SENSOR_1) //センサ−1の値がセンサ−3の値よりも大きいなら左旋回
{
OnRev(OUT_A);OnFwd(OUT_C); }
if(SENSOR_1<SENSOR_3) //センサ−3の値がセンサ−1の値よりも大きいなら右旋回
{
OnRev(OUT_C);OnFwd(OUT_A); }}}
最も明るいところを見つけるプログラムを組むのは、意外と簡単にできました。しかしその後、光に向かっていくプログラムを組むのに苦戦しました。プログラム1は、一応光りに向かっていくのですが、ものすごく小刻みに(左右に)動きながら近ずくので、遅いうえに五月蝿いというデメリットばかりのプログラムになりました。
**プログラム1はなぜ小刻みに動くのか? [#cc94dfe5]
プログラム1では右のセンサーの値が小さくなったとき左旋回するがその際勢い余って今度は左のセンサーの値が小さくなってしまうからだと思われる。それを改善しようと手を尽くしたが、あきらめることになった。
**プログラム2(成功) [#ief5d3a4]
task main()
#define T_Time 450
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int light=0;
int time;
ClearTimer(0);
while(FastTimer(0)<T_Time)
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーと定義
int light=0; //lighという名の変数を作り変数の値を0とする
int time; //timeという名の変数を作る
ClearTimer(0); //タイマ−0の値をリセット
while(FastTimer(0)<450) //タイマ−0の値が450よりも小さいなら以下のプログラムを実行する
{
OnFwd(OUT_C);OnRev(OUT_A);
if(light<SENSOR_1)
OnFwd(OUT_C);OnRev(OUT_A); //左旋回
if(light<SENSOR_1) //変数lightの値がセンサ−1の値よりも小さいなら以下のプログラムを実行
{
light=SENSOR_1;
ClearTimer(1); }}
time=FastTimer(1);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(time);Off(OUT_A+OUT_C);Wait(100);OnFwd(OUT_A+OUT_C);Wait(100);
light=0;
ClearTimer(1);
ClearTimer(0); }
light=SENSOR_1; //変数lightの値をセンサ−1の値にする
ClearTimer(1); //タイマ−1の値をリセット(ifのプログラムの終わり)}}
(whileのプログラムの終わり)
time=FastTimer(1); //変数timeの値をタイマ−1の値にする
OnFwd(OUT_A);OnRev(OUT_C); //右旋回して最も明るい方位を向く
Wait(time);Off(OUT_A+OUT_C);Wait(100);
OnFwd(OUT_A+OUT_C);Wait(100); //1秒間直進
Off(OUT_A+OUT_C);
light=0; //変数lightの値を0にする
ClearTimer(1); //タイマー1の値をリセット
ClearTimer(0); //タイマー0の値をリセット
(タイマ−0の値が450よりも小さくなったので、再びwhileのプログラムを実行) }
見てわかる通りプログラム2は、プログラム1を少しいじくっただけです。このプログラムは、最も明るい方位を見つけたら、その方位へ少し進みその後、また最も明るい方位を見つけて進むを繰り返すプログラムです。デメリットは、少し時間がかかることですが、ライトの位置を変えても向かっていくことができるというメリットがあります(まさしく急がば回れ)。
**苦労した点 [#q1ef6a3a]
最も明るい方位を見つけるプログラムはかなり早い段階でできましたが、光に向かっていくプログラムを組むのに苦戦しました。何度か試行錯誤を繰り返しましたが、結局センサーを2つ使うのを断念しました。センサーを1つにしてからは、割と早く完成しました。
**工夫した点 [#d7994098]
プログラム1ではセンサーを2つ、プログラム2では1つ使っています。プログラム次第で、センサーが1つでも十分な結果が出せた。むしろセンサーが1つの方が、プログラムを組むのが簡単だった。
**コメントをどうぞ! [#jd996a43]
-プログラム内にコメント文を書いたり別途プログラムの説明を加えるなど、どの箇所でどのようなことを実行しているのか、レポートとして分かりやすくする工夫をしてみてください。 -- [[松本(教員)]] &new{2007-01-29 (月) 11:52:10};
#comment