#contents


*メンバー紹介 [#b5242e4f]
今回のメンバーは我ら&size(20){''A7''};のエースこと&size(20){''新井田宏君''};と、ロボしか作れない私&size(20){''藤田裕介''};であります。


*今回の課題について [#ed926d78]
今回の課題は、&size(24){''懐中電灯に向かってブロックを投げるロボット''};です。

**課題となるプログラム [#t505a106]
+++全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
+++懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。
+++懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

**条件 [#nd2ce38c]
+++重複しないように&size(18){''1人1つ以上''};のプログラムを作ること。
+++光センサ、タッチセンサ、モータは&size(18){''2個まで''};使用可能である。


*マシン紹介 [#c903fde1]

&size(24){全体画像数枚};


**ベース [#saa9ecc4]
&size(28){''マ''};シンのベースは資料やヒントをもとに作成しました。最初の予定ではタイヤを使ったマシンを作成するはずでした。
&size(28){''が、''};ターンがうまくいかなかったり、噛み合わせの悪さから耳障りな音が出てしまったりと走行させられるものではなかったため断念しました。
&size(28){''熟''};考した結果、キャタピラならばうまくいくのでは?という考えに至り早速作成することにしました。
&size(28){''し''};かし実際に走らせてみるとターンが遅く、耳障りな音も消すことがでした。またストッパーもうまく噛ませることが出来なかったため、これも断念しました。
&size(28){''ど''};うすればいいか分からなくなってしまったので、一個ずつ問題を解決していく形をとることにしました。そして下の写真のような過程を経てマシンのベースが完成しました。

&ref(./DSCF1373.JPG,10%);&size(20){''→''};&ref(./DSCF1381.JPG,10%);&size(20){''→''};&ref(./DSCF1397.JPG,10%);


-苦労・工夫した点
--何とかしてギアの噛み合わせの悪さを改善するためにモーターにつけるギアの大きさを変え、それに取り付けるギアの間に物を挟むことでかみ合わせの悪さを改善しました。(赤丸参照)
--次にモーターとギアの大きさに合わせてマシンのベースを作りました。幸いにもブロック2個分大きくなっただけで済んだため調節は簡単に出来ました。
--車体を部分を引きずらないように車輪を取り付けました。これによりマシンが左右に動くときの動作をスムーズにすることができました。
--タイヤにするかキャタピラにするかかなり迷いました。しかし、タイヤにしたほうが車輪などのパーツが使えターンをする事が容易になると考えタイヤにすることに決めました。

**アーム [#e7cf19ac]

&size(20){''モ''};ータを1つ使い、アームを回転させることでブロックを投げる仕組みにしました。&br;
&size(20){''ア''};ームの根元部分にはモータを組み合わせてアームが回転できるようにして、アームの先はブロックを置くことができるようにしてあります。&br;
&size(20){''い''};ままで作ってきたものの中でもっともシンプルなものに仕上げることができました。

&ref(./DSCF1364.JPG,10%);&size(20){''→''};&ref(./DSCF1399.JPG,10%);&size(20){''→''};&ref(./DSCF1409.JPG,10%);

-苦労・工夫した点
--ブロックを持たせる部分を、落ちにくくかつ投げやすい構造にしました。
--最初は1枚目の写真のような形したかったのですが、思ったよりブロックが飛ばなかったことと重くなってしまったことにより改良することにしました。
--改良点1 ギアをモーターに取り付けずに直接アームを取り付けました。これにより最初よりもブロックが飛ぶようになりました。
--改良点2 ブロックを乗せる部分を棒を取り付けるだけにして軽量化しました。
--改良点3 安定性を持たせるために補強をして写真のようなアームになりました。
--モーターの回転でマシンから外れないように補強して本体に取り付けました。

**光センサー[#u0119ca5]

光センサを2つ組み合わせました。&br;
光センサを左右に間隔を開けて設置し、2つのセンサが受ける光量の違いを利用する仕組みです。

&ref(./DSCF1401.JPG,10%);&size(20){→};&ref(./DSCF1402.JPG,10%);   
&ref(./DSCF1407.JPG,10%);

-苦労・工夫した点
--上方向から他の光が侵入してくるのを防ぐために&size(18){''傘''};のようなものを設置しました。
--左右のセンサーの反応をよくするため(両方のセンサが反応するのを防ぐ)ために&size(18){''ついたて''};を加えました。
--できるだけ左右対称にするようにしました。

**タッチセンサー [#hfd4556a]

-苦労・工夫した点



**ロボットの総評 [#b29b146a]

今回のロボットはかなりよくできたと思います。ギアの微妙なずれや方向転換もうまく改善することができていたのでよかったと思いました。ただ、自分たちの班のロボットは直進することができません。中にはそれができるロボットを作った班もあったので、ホームページを見て作り方を見て作れるようになっておきたいと思います。ロボットの強度に少し不安を覚えました。ベースと本体との装着部分が少し外れやすくなってしまっています。ロボットを動かすモーターを一つしか使っていないため、できるだけ軽くシンプルに作り動作に支障がないようにしました。
&size(24){コメントに合わせて画像お願いします};




*プログラム [#edc72e59]

**一人目 [#daaa0ef4]

***1つ目 [#x53e274b]

 #define run_right OnFwd(OUT_A);  //右回りに前進
 #define run_left OnRev(OUT_A);   //左回りに前進
 #define THRESHOLD 70        //ブロックを投げる時の値
 int end_t ;                        //投げ終わった後に式を抜けるための変数

 sub throw()            //ブロックを投げるサブルーチン
 {
    OnFwd(OUT_B);           //投げる
    Wait(30);
    Wait(20);
    Off(OUT_B);
    Wait(20);
    OnRev(OUT_B);           //アームを戻す
    Wait(30);
    Wait(20);
    Off(OUT_B);
 }

 task main()
 {
    SetSensor(SENSOR_1,SENSOR_LIGHT);     //左側の光センサを設定 
    SetSensor(SENSOR_3,SENSOR_LIGHT);     //右側の光センサを設定
 
    SetPower(OUT_A,7);            //タイヤを動かすギアの力を7に設定
    SetPower(OUT_B,4);            //アームを動かすギアの力を4に設定
    
    end_t = 0;                //変数を0に設定
     while(end_t == 0){
       if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)){
          if(SENSOR_1 > SENSOR_3){      //ライトが左側にある
             run_left;            //左回りに進む
             }
          if(SENSOR_1 < SENSOR_3){      //ライトが右側にある
             run_right;            //右回りに進む
             }
          }
       if((SENSOR_1 > THRESHOLD)||(SENSOR_3 > THRESHOLD)){   //ライトに近づく
          ClearTimer(0);           //タイマーをリセット
          Off(OUT_A);             //ロボットを止める
             if(FastTimer(0) > 200)      //2秒以上その距離が保たれる
                PlaySound(SOUND_DOUBLE_BEEP); //音を鳴らす
                throw();           //アームを操作してブロックを投げる
                end_t = 1;          //変数を操作して、式から抜ける
       }
    }
 }



--苦労・工夫した点
***2つ目 [#j486b868]

 #define run_right OnFwd(OUT_A);
 #define run_left OnRev(OUT_A); 
 int end_t ;
 int turn_t ;


 sub throw()
 {
    OnFwd(OUT_B);
    Wait(20);
    Off(OUT_B);
    Wait(20);
    OnRev(OUT_B);
    Wait(20);
    Off(OUT_B);
 }


 task main()
 {
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    SetPower(OUT_A,7);
    SetPower(OUT_B,4);
 
    end_t = 0;
    turn_t = 0;
    ClearTimer(0);
    while(end_t == 0){
       if(SENSOR_1 > SENSOR_3){
          turn_t++ ;
          run_left;                                                                                                                                                                                                                                                                                   
       }
       if(SENSOR_1 < SENSOR_3){
          turn_t++ ;
          run_right; 
       }
       if((FastTimer(0) > 200)&&(turn_t < 4)){
          turn_t = 0 ;
          end_t = 1 ;
          ClearTimer(0);
       }
    }
    while(end_t == 1){
          Off(OUT_A);
          PlaySound(SOUND_DOUBLE_BEEP);
          throw();
          end_t = 2;
    }
 }



-苦労・工夫した点
---条件式に変数を使って、投げ終わった後プログラムを終了させるようにしました。
---できる限りマクロやサブルーチンを使い、式を見やすくしました。
---ブロックを投げる(ライトが止まったことを示す)条件に悩まされました。


-1つ目のプログラム
---ライトが一定以上の強さになるとブロックを投げる条件。
---ライトに一定以上近づくことにより反応する仕組みにしました。

--メリット
---忠実にライトに向かって進んでいくことができる。
--デメリット
---反応する際のライトの値を正確に取る必要がある。


-2つ目のプログラム
---単位時間に一定回以上向きを変えると、ブロックを投げる条件。
---ライトを振ったらブロックを投げる動作にするようにしました。

--メリット
---反応するタイミングを自由に指定できる。
--デメリット
---直進する際に誤作動してしまうことがある。




**二人目 [#h0181027]
 #define run_right OnFwd(OUT_A);
 #define run_left OnRev(OUT_A);
 int end_t ;

 task main()
 {
        SetSensor(SENSOR_1,SENSOR_LIGHT);
        SetSensor(SENSOR_2,SENSOR_TOUCH);
        SetSensor(SENSOR_3,SENSOR_LIGHT);
        SetPower(OUT_B,4);

        
        end_t = 0;
         while(end_t == 0){
              if(SENSOR_1 > SENSOR_3){
                          run_left;
                          }
              if(SENSOR_1 < SENSOR_3){
                          run_right;
                          }
               if(SENSOR_2 == 1){
                          Off(OUT_A);
                          OnFwd(OUT_B);
                          Wait(20);
                          OnRev(OUT_B);
                          Wait(20)
                          Off(OUT_B);
                          end_t = 1;
                          }
                      }
 }

--苦労・工夫した点
久々のプログラミングだったためとても苦労した。




*感想 [#o1a1cdf4]

-新井田

今回自分はプログラムをメインに担当しました。ロボット作成の方は案を少し出したくらいで、作るのはほぼ藤田君に担当してもらいました。


-藤田

*コメント [#p5808348]

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS