[[2011a]] #contents *チームメンバー [#eaf74067] -オ(運ぶ) -MIYA(転がす) *課題内容 [#na7bce20] 課題2で作ったコース上にランダムに3個のテニスボールをおいて、ボールを中央のランタンに向かって運ぶまたは転がすロボットを作る。 ただし -転がす場合はボールのあった位置から直接転がす。(押さずに運んだりしないこと) -運ぶ場合はボールのあった位置から最短距離で運ぶ。 -ロータリーの中央にランタンを置き、3個のボールをランダムに置く。 &Ref(ju.jpg); *ロボット紹介 [#i567d96e] **全体 [#fe56d250] &Ref(1.JPG); ハサミを2つ使うことによりしっかりと安定したボール運びをできるようにしました。 **アーム部分 [#c61048fb] &Ref(DSC_0739.jpg); 道を探すセンサーは本体の真ん中に、 光を探すセンサーはできるだけ上に、 タッチセンサーはボールがタッチできたらすぐつかめるようにアームの真ん中にしました。 **センサーの位置 [#b436a834] &Ref(DSC_0737.jpg); ランタンの光を探すセンサーの光が広がらないように横にブロックを付けました。 &Ref(DSC_0738.jpg); &Ref(DSC_0745.jpg); ボールがタッチセンサーに当たったらすぐボールをつかめるようにしました。 *プログラミング [#v5f31fd3] **オ(ボールを運ぶ) [#a2991919] #define go(t) OnRev(OUT_A+OUT_C); Wait(t); #define back(t) OnFwd(OUT_A+OUT_C); Wait(t); #define hidari(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t); #define migi(t) OnFwd(OUT_C); OnRev(OUT_A); Wait(t); #define off(t) Off(OUT_A+OUT_C); Wait(t); #define catch_on OnFwd(OUT_B); Wait(10); Off(OUT_B); #define catch_off OnRev(OUT_B); Wait(10); Off(OUT_B); #define THERSHOLD 50 int T = 200; int lmax1 = 0; int lmax2 = 80; int tmax = 0; int a = 0 ; task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //1番センサーを付ける SetSensor(SENSOR_2, SENSOR_LIGHT); //2番センサーを付ける SetSensor(SENSOR_3, SENSOR_TOUCH); //3番センサーを付ける ClearTimer(0); while(true) { start go_line; until((Timer(0) > 10000) || (a == 1) || (SENSOR_3 == 1)); //三つの条件まで前に行く off(0); stop go_line; if(a == 1) //関数が1になったら { start search; until(SENSOR_2 <= THERSHOLD); stop search; off(5); a--; continue; } else if(Timer(0) > 10000) //Timerが1000秒過ぎたら { break; } else if(SENSOR_3 == 1) //タッチセンサー(センサー3)がボールを認識したら { catch_on; hikari_sagsu(); gotolight(); continue; } } off(0); } sub hikari_sagasu() //一番明るい光を探す { ClearTimer(1); while(FastTimer(1) < T) { hidari(1); off(0); if(SENSOR_1 > lmax1) { lmax1 = SENSOR_1; tmax = FastTimer(0); } } off(0); } task go_line() //前に行く { while(true) { if(SENSOR_2 <= THERSHOLD) //THERSHOLDより暗ければ { go(0); } else if(SENSOR_2 > THERSHOLD) //THERSHOLDより明るければ { a++; off(0); } } } task search() //道を探す { hidari(10); migi(20); hidari(50); migi(50); } sub gotolight() //一番明るい光がある所にに行く { migi(T-tmax); off(10); go(0); until(SENSOR_1 >= lmax2); off(0); catch_off; back(0); until(SENSOR_2 <=THERSHOLD); off(0); } **MIYA(ボールを転がす) [#b4c29ec2] #define THRESHOLD 40 task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2をタッチセンサーと定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3を光センサーと定義 while(true){ start folow_line; until(SENSOR_2 == 1); stop folow_line; start ball_kick; Wait(1000); stop ball_kick; } } task folow_line() { while(true){ if(SENSOR_1<THRESHOLD){ //センサー1が黒線上の時 OnFwd(OUT_A);Wait(15); }if(SENSOR_1>THRESHOLD){ //センサー1が黒線上に無い時 OnFwd(OUT_C);Wait(15); } } task ball_kick() { int l=0; int l_max=0; int t_max=0; OnFwd(OUT_B); Wait(50); ClearTimer(0); while(FastTimer(0) <= 400) { OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_1>l_max){l_max=SENSOR_1;t_max=FastTimer(0);} } OnFwd(OUT_C); OnRev(OUT_A); Wait(400-t_max); Off(OUT_A+OUT_C); OnRev(OUT_B); Wait(50); OnFwd(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); } *感想 [#kefa2b4c] -ロボットを作ることやプログラミングするのは難しくてパートナーに教えてもらったりして頑張ることができてよかった。最終的にはうまくできなかったのが残念です。(MIYA) -センサーを三つ、モターを三つしか使えないのが難しかった。それに、タッチセンサーがボールを認識するようにするものが一番難しかった。 - それぞれの変数が何のための変数なのかきちんと説明しましょう。 -- [[松本]] &new{2011-07-24 (日) 08:41:28}; #comment