[[2009a]] *目次 [#n36a4a43] #contents *更新履歴 [#x1c8920b] ***7/3(Fri) [#p4cb3db1] ディファインシャルギアを理解する。 ***7/6(Mon) [#x8398f53] ロボットの基本構造を作る。 ***7/7(Tue) [#l4bdacc2] HPのup ***7/8(Wed) [#id1825ad] ホームページの骨組を追加しました ***8/9 (Sun) [#gba48dd3] プログラム更新 ロボット本体の記述を更新 プログラムの説明更新 簡単に言うと全部いじってあります(笑) *課題3:懐中電灯に向かってブロックを投げるロボット [#add4bc86] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) 1. 全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる。方向を定めたのち、 懐中電灯の30cm以内に近づかない範囲で必要な距離を移動してもよい。 懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、 懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。 3. 懐中電灯を動かしたとき懐中電灯に向かって進み、見失った時には再び全方向から懐中電灯を探しだす。 7秒以上追尾できたら懐中電灯に向かってブロックを投げる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。 ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。 *課題への取り組み [#rc1a1b00] [[2009a/A7/課題3右/robot]] **プログラム[#v6cc8ec3] リナ=1 haunt=2 のプログラムを担当しました 今回はとても予定を合わせるのが難しかったため 個人個人で相談もなく作成したために かなり似通っていないプログラムになってしまい 非効率的で残念でした。 ***リナ [#se5acc8a] task main() { int s1; int s3; //s1:センサ1の判定値、s3:センサ3の判定値 s1 = 0; s3 = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); OnRev(OUT_A); //左回転 ClearTimer(0); while(Timer(0)<= 50) { s3 = SENSOR_3; //センサ3のmax値を測定 } } if((SENSOR_1>70)||(SENSOR_3>70))//70:おおよそ30cm離れてるときの値 { if(SENSOR_1>s1) { s1 = SENSOR_1; //センサ1のmax値を測定 } if(SENSOR_3>s3) { Off(OUT_A); OnRev(OUT_B); //ブロックを投げる Wait(10); Off(OUT_B); OnFwd(OUT_C); Wait(100); Off(OUT_C); break; } if(SENSOR_1<s1&&SENSOR_3>=s3)//センサ3のみが判定値を超えていたら { while(SENSOR_1<s1) { OnFwd(OUT_A); //センサ1が判定値を超えるまで右回転 } } if(SENSOR_1>=s1&&SENSOR_3<s3)//センサ1のみが判定値を超えていたら { while(SENSOR_3<s3) { OnRev(OUT_A); //センサ3が判定値を超えるまで右回転 } } } 最後のプログラムは正面に向かないと投げられず、 どちらかの光センサーが向いていても当たらないために最後にこのようなプログラムを組み、正面を向かせようとしました。 ***haunt [#e775f5f9] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int t=0; int a=0; ClearTimer(1); while(Timer(1)<100) { OnFwd(OUT_A); if(SENSOR_1>t) { t=SENSOR_1; a=Timer(1); } } OnFwd(OUT_C); Wait(2*(100-a)); if(SENSOR_1<SENSOR_3) {OnFwd(OUT_A); } else { OnRev(OUT_A;); } if((SENSOR_1>70)||(SENSOR_3>70)) { OnFwd(OUT_B); Wait(10); OnFwd(OUT_C); Wait(100); } 流れとしては一周その場で回転していちばんつよい光のところを探します そうすることで懐中電灯の場所を最初に把握します。 そしてそのあとに左右に二つ付けた光センサーのどちらの値が大きいかによって 左右どちらに動いたかを把握しています また、逆回転のときに2倍をしているのはギア比の関係がうまくいかなかったために、プログラムでカバーしているからです。 *コメント [#y1c3ee54] 「☆をとるための」アドバイスをお願いします - ロボットを軽量化したり、小型化した工夫は素晴らしいと思います。プログラムについては、リナさんのプログラムの「s3 = SENSOR_3; //センサ3のmax値を測定」これで本当にmax値が得られるのでしょうか?この動作は「5秒間s3にそのときの光センサの値を代入し続ける」ことになり、s3には5秒後のセンサの値が入るだけになるのではないかと思います。hauntさんのプログラムでは、ところどころ「;」が抜け落ちています。エラーになりませんでしたか…? -- [[こさか]] &new{2009-08-09 (日) 22:55:58}; - コメントの通り動きませんでした、原因が分からなかったのですが。ようやく理解ができました。ありがとうございます!!! -- [[リナ]] &new{2009-08-10 (月) 20:06:44}; #comment