#contents


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


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

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

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


*マシン紹介 [#c903fde1]
&ref(./DSCF14311.JPG,10%); &ref(./DSCF1430.JPG,10%);
&size(20){←};今回のマシンはモグラをイメージした形になっています。そのため、名前は&size(20){''モース''};です。
&br;&br;&br;


**ベース [#saa9ecc4]

&size(20){''マ''};シンのベースは資料やヒントをもとに作成しました。最初の予定ではタイヤを使ったマシンを作成するはずでした。

&size(20){''が、''};ターンがうまくいかなかったり、噛み合わせの悪さから耳障りな音が出てしまったりと走行させられるものではなかったため断念しました。
熟考した結果、キャタピラならばうまくいくのでは?という考えに至り早速作成することにしました。

&size(20){''し''};かし実際に走らせてみるとターンが遅く、耳障りな音も消すことが出来ませんでした。またストッパーもうまく噛ませることが出来なかったため、これも断念しました。

&size(20){''ど''};うすればいいか分からなくなってしまったので、一個ずつ問題を解決していく形をとることにしました。そして下の写真のような過程を経てマシンのベースが完成しました。



&size(20){''ベース''};

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


&size(20){''車輪''};

&ref(./DSCF1423.JPG,10%);&size(20){''→''};&ref(./DSCF1453.JPG,10%);


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


**アーム [#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%); &ref(./DSCF1413.JPG,10%);

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


**光センサー[#u0119ca5]

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

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

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


**タッチセンサー [#hfd4556a]
ホースを使ってタッチ部分を作ってみました。&br;
センサーが反応するとマシンが止まりアームが動きます。

&ref(./DSCF1424.JPG,10%); &ref(./DSCF1425.JPG,10%);
-&size(18){''苦労・工夫した点''};
--光源にあたったときにマシンが停止するようにタッチセンサーを取り付けました。
--写真のU字になっている所にあたるとセンサーが反応します。
&br;&br;&br;


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

今回のロボットはかなりよくできたと思います。ギアの微妙なずれや方向転換もうまく改善することができていたのでよかったと思いました。ただ、自分たちの班のロボットは直進することができません。中にはそれができるロボットを作った班もあったので、ホームページを見て作り方を見て作れるようになっておきたいと思います。ロボットの強度に少し不安を覚えました。ベースと本体との装着部分が少し外れやすくなってしまっています。ロボットを動かすモーターを一つしか使っていないため、できるだけ軽くシンプルに作り、動作に支障がないようにしました。
また今回は壱号機と弐号機があります。壱号機は光センサーの間に仕切り板を取り付けていましたが、そうするとタッチセンサーを取り付ける妨げになったため弐号機のような形になりました。目をつけたのは…動きが&size(20){''かわいかった''};からです!!他にも前方の車輪のゴムをはずして摩擦を少なくしました。

&ref(./DSCF1411.JPG,15%); →&ref(./DSCF14311.JPG,15%);




*プログラム [#edc72e59]

**一人目 [#daaa0ef4]

ブロックを投げる動作を色々試行錯誤したため2つのプログラムができあがりました。&br;
どちらが良いとは言い切れなかったので両方とも載せることにします。

***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(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);            //タイヤを動かすギアの力を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;            //変数を操作して、式から抜ける
       }
    }
 }


 -1つ目のプログラム
 ---ライトが一定以上の強さになるとブロックを投げる条件。
 ---ライトに一定以上近づくことにより反応する仕組みにしました。
 
 --メリット
 ---忠実にライトに向かって進んでいくことができる。
 --デメリット
 ---反応する際のライトの値を正確に取る必要がある。


***2つ目 [#j486b868]

 #define run_right OnFwd(OUT_A);  //右回りに前進
 #define run_left OnRev(OUT_A);    //左回りに前進
 int end_t ;                        //投げ終わった後に式から抜けるための変数
 int turn_t ;                       //2秒間でターンした回数を計測させる変数


 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);                        //タイヤを動かすギアの力を7に設定
    SetPower(OUT_B,4);                        //アームを動かすギアの力を4に設定
 
    end_t = 0;                                 //変数を0に設定
    turn_t = 0;                                //変数を0に設定
    ClearTimer(0);                             //タイマーをリセット
    while(end_t == 0){
       if(SENSOR_1 > SENSOR_3){                 //ライトが左側にある場合
          turn_t++ ;                //変数を1増やす
      run_left;                               //左回りに進む
       }
       if(SENSOR_1 < SENSOR_3){                 //ライトが右側にある場合
          turn_t++ ;                //変数を1増やす
          run_right;                              //右回りに進む
       }
       if((FastTimer(0) > 200)&&(turn_t < 4)){  //2秒間でターンが4回未満の場合
          turn_t = 0 ;                            //ターン回数リセット
          ClearTimer(0);              //タイマーリセット
       }
       if((FastTimer(0) < 200)&&(turn_t >= 4)){ //2秒間で4回以上ターンしてる場合
          end_t = 1 ;                              //変数を1に変えて次の式へ
          ClearTimer(0);               //タイマーリセット
       }
    }
    while(end_t == 1){            //ブロックを投げるための式
          Off(OUT_A);               //ロボットを止める
          PlaySound(SOUND_DOUBLE_BEEP);      //音を鳴らす
          throw();                 //ブロックを投げる
          end_t = 2;                //変数を2に変更して、プログラムを終了させる
    }
 }


 -2つ目のプログラム
 ---単位時間に一定回以上向きを変えると、ブロックを投げる条件。
 ---ライトを振ったらブロックを投げる動作にするようにしました。
 
 --メリット
 ---反応するタイミングを自由に指定できる。
 --デメリット
 ---直進する際に誤作動してしまうことがある。


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

---どちらのプログラムも共に長所・短所があり、どちらがいいかかなり悩まされました。できれば、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);                 //アームのモーターのパワーを4に設定

        
        end_t = 0;                         //変数を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);      //モーターAを停止させる
                          OnFwd(OUT_B);    //モーターBを動かし、投げる
                          Wait(20);
                          OnRev(OUT_B);    //元の位置に戻す
                          Wait(20);
                          Off(OUT_B);      //モーターBを停止させる
                          end_t = 1;       //変数を操作して式から抜ける
                          }
                      }
 }

--&size(18){''苦労・工夫した点''};
---久々のプログラミングだったためとても苦労したが宏君に手伝ってもらい何とか完成させることができた。
---アームを投げるとき、モーターを回転させすぎるとほかのパーツが壊れたり、モーターが取れたりと問題が多かった。そのためモーターを回転させる時間を設定するのが大変だった。


*感想 [#o1a1cdf4]

-新井田

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

今回の課題ではプログラムを組む際に、「どういった条件付けをするか」もしくは「どのようなプログラムにするか」といった所でずいぶんと悩まされました。&br;
講義も後半に入って、色々なことができるようになったおかげかなぁと思います。&br;

今回はロボットのギア部分でかなり悩まされたり、プログラムでも結構ミスしてしまいました。後から考えると「もっと色々な(複雑な)プログラムを作れたんじゃないかなぁ」などと思うこともあります。&br;
次の課題では、もっとしっかりと構想を練ってしっかりとしたプログラムを作りたいです。


-藤田

今回のロボの作成はとても大変でした。何度調整してもモーターの空回りが起きてしまい、どうしてそうなってしまうかもわかりませんでした。あと前輪の車輪の回転を抑える必要も出てきてしまい、てんてこまいでした。しかし自分の納得がいくものができ、目をつけたりする余裕ができてよかったです。次回のロボコンでもいいロボットが作れれぼいいと思います。思いの他プログラミングが大変に思えました。



*コメント [#p5808348]
-「耳障りな音も消すことがでした」直しておいてください&sad; あとプログラムにコメントを。 -- [[まいける(TA)]] &new{2007-07-05 (木) 00:48:03};
-上と同じくですが、文字を強調しているのが逆に見にくくなっていて残念な部分があります。 -- [[ヒロヤ]] &new{2007-07-05 (木) 09:24:39};
-写真を多用することでわかりやすくなったと思います。 -- [[ヒロヤ]] &new{2007-07-14 (土) 22:52:41};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS