[[2008b/MemberOnly/進行状況A]] 2008b/A7/課題3右 #hr CENTER:&size(25){光追跡ロボット}; #hr CENTER:製作者:タキさ Y田 目次 #contents ------- *課題についての説明 [#d306895c] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、 以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで 懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを 止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、 タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく 懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。 *製作したマシン [#e6da836a] |>|CENTER:COLOR(#808080):''マシン''| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/zentai_yoko3.jpg,50%,);| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/zentai_ue3.jpg,50%,);| |>|CENTER:COLOR(#808080):''アーム''| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/aim_light3.jpg,50%,);| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/arm_left3.jpg,50%,);| |>|CENTER:COLOR(#808080):''マシン''| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/gia3.jpg,50%,);| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/stoper3.jpg,50%,);| |>|CENTER:COLOR(#808080):&ref(2008b/A7/課題3右/kiteibu3.jpg,50%,);| *モータ・センサに対応する端子 [#d352300d] モータ、センサについては以下の端子に接続してあります。 -出力側 A端子 → モータ:タイヤ(正回転:右回転,逆回転:左回転) B端子 → 使用せず C端子 → モータ:アーム(正回転:使用せず,逆回転:投げる) -入力側 1端子 → 光センサ(右) 2端子 → 使用せず 3端子 → 光センサ(左) *プログラムの紹介 [#n9e8de4f] task main(){ int s1, s3; s1 = 0; s3 = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > s1)s1 = SENSOR_1; if(SENSOR_3 > s3)s3 = SENSOR_3; } s1 = s1 - 5; s3 = s3 - 5; while(1){ if((SENSOR_1 > 75) || (SENSOR_3 > 75)){ Off(OUT_A); OnRev(OUT_C); Wait(17); Off(OUT_C); break; } if(SENSOR_1 < s1 && SENSOR_3 >= s3){ while(SENSOR_1 < s1)OnFwd(OUT_A); } if(SENSOR_1 >= s1 && SENSOR_3 < s3){ while(SENSOR_3 < s3)OnRev(OUT_A); } } } /* 光追跡ロボット */ /* 定数を定義 */ #define SHI_J 75 void move_fwd(void){ OnFwd(OUT_A); Wait(27); OnRev(OUT_A); Wait(20); Off(OUT_A); } task main(){ int ligth_max, left_max; ligth_max = 0; left_max = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > ligth_max)ligth_max = SENSOR_1; if(SENSOR_3 > left_max)left_max = SENSOR_3; } ligth_max = ligth_max - 5; left_max = left_max - 5; while(1){ if((SENSOR_1 > SHI_J) || (SENSOR_3 > SHI_J)){ Off(OUT_A); OnRev(OUT_C); Wait(17); Off(OUT_C); break; } if(SENSOR_1 >= ligth_max && SENSOR_3 >= left_max){ while((SENSOR_1 >= ligth_max) || (SENSOR_3 >= left_max))move_fwd(); } else if(SENSOR_1 < ligth_max && SENSOR_3 >= left_max){ while(SENSOR_1 < ligth_max)OnFwd(OUT_A); } else if(SENSOR_1 >= ligth_max && SENSOR_3 < left_max){ while(SENSOR_3 < left_max)OnRev(OUT_A); } else if(SENSOR_1 < ligth_max && SENSOR_3 < left_max){ while((SENSOR_1 < ligth_max) || (SENSOR_3 < left_max))OnRev(OUT_A); } } } *工夫した点 [#u55de425] *製作日誌 [#u1068eb7] *皆さんのコメント [#g72ad519] よろしければコメントをどうぞ - テスト -- [[タキさ]] &new{2009-01-22 (木) 18:30:46}; #comment