#contents
*課題3:懐中電灯に向かってブロックを投げるロボット[#l522b75d]

ブロック(一番太いホイール)を投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)

-全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 
-懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。 
-懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。

#ref(課題3 前景改.jpg);
''(作者:クノピー、ハネウマ、ネタ切れ)''
''(製作者:クノピー、ハネウマ、ネタ切れ)''


**本体の作成 [#eb452e34]
-今回の課題では、モーター2個でブロックを投げるのと動くのとをしなければならないので、モーター1つで動き回る機構を作らなければならない。そこで、以下で説明するディファレンシャルギアを使うことによってモーターが1つだけでも走らせることができる。たとえば、右折では以下のように動く。
#ref(右折.JPG);
また、このような動きで左右に繰り返されることで直進の代用をすることもできる。

***ディファレンシャルギアとブレーキについて [#ce1bef3b]
今回の課題で、モーター1つで走らせるための最大のポイント。
-[[ディファレンシャルギアについて>2007a/A9/課題3左/ディファレンシャルギアについて]]
(詳しくは、左記のページを御覧ください。)
***ディファレンシャルギアを使った本体 [#zdf23d21]
駆動は[[ディファレンシャルギア>2007a/A9/課題3左/ディファレンシャルギアについて]]を使い、一つのモーターで移動する。~


***本体の構造 [#za70dd06]
-全体の機構

ディファレンシャレルギアの機構の上に本体を乗せ、センサーを取り付けただけの単純な機構になっている。(ディファレンシャルギア自体は決して単純な機構ではないが)
#ref(課題3 前景改.jpg);
駆動はディファレンシャルギアを使い、一つのモーターで移動する。

前方の二つの光センサーが光を感知する。
***キャスター型の補助輪 [#j76c71a6]
タイヤが二つでは安定しないので、前回の課題と同じように、ターンの邪魔にならないような補助輪を取り付けた。でも、それだけでは芸がないので、今回はキャスター型の補助輪を作成した。
#ref(課題3 キャスター改.jpg);

***センサーを使った直進方法 [#af7432ee]
前方の二つの光センサーが光を感知する。あまり改造はしていない。ひさしをつけるべきか悩んだが、特に何も改良せずただ取り付けただけの状態でも、プログラムを遂行してくれたのでそのままの状態でそっとしておいた。反応の仕方は(図の青い四角が光センサです。)
#ref(光源反応機構.jpg);
まず、図の1の状態では右のセンサが左のセンサより明るいを認識しているので、右折した。しかし、図の2のように、今度は左のセンサが右のセンサより明るくなってくるので、図の3のように左折を開始する。そして、それを繰り返すことによって前進する。
#ref(直進.jpg);

-ブロックを投げる機構

条件を満たすと、モーターが回転するプログラムを組んであるので、条件を満たすとブロックを投げる。
#ref(課題3 投擲機改.jpg);
この機構では、頂点部分でモーターの回転が止まるので、そこから図の絵のように投擲をすることができる。

**プログラム [#jd6fbdc8]
-今回は3人がそれぞれ1つずつプログラムを担当します。
プログラムが3つということで、長くなってしまうので、3の途中過程である1と2は別ページにリンクを張りました。

***プログラム1 [#y00b6b7f]
全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。&br;
&size(20){[[''プログラム1''>2007a/A9/課題3左/プログラム1]]};
RIGHT:(担当:ハネウマ)
-スタートの向きから最も明るい向きにいくまでの時間がわかっても、スタートの向きから1周して再びおなじ向きになるまでの時間がある程度正確に出ていないと、最も明るい方向を向くことができず、見当違いの方向にブロックを投げてしまう。そこで、1周の時間をはかることが必須。


***プログラム2 [#i7e784a3]
懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。&br;
&size(20){[[''プログラム2''>2007a/A9/課題3左/プログラム2]]};
RIGHT:(担当:クノピー)
-モーターが1つだけなので、直進はなく、左折と右折のみで動かさなくてはならない。なので、右のセンサーのほうが強い光を感知したのならば右折、そうでないのなら左折という2つの場合分けでプログラムを組んだ。

***プログラム3 [#jd3b143e]
懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
RIGHT:(担当:ネタ切れ)&br;
 #define TURN_TIME 225           //1周にかかるだいたいの時間
 #define RUN_TIME 20
 int time_max=0;                 //
 int turn_dir=0,last_turn=0;     //曲がる方向turn_dirと前回の方向last_turnを定義
 int i;                          //forループのための変数
 int i_min=0,i_max=5;            //iの最大値と最大値を指定
 int light_max=0;


 sub throw_block()
 {
   OnFwd(OUT_B);
   Wait(7);
   Off(OUT_B);
 }

 task main(){
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
 ClearTimer(0);OnRev(OUT_A);        //タイマーをリセットして右のタイヤを中心に回転
 while(FastTimer(0)<TURN_TIME){     //1周まわるまでの間
     if(SENSOR_1>light_max)         //最も強い光を探す
      {
      light_max=SENSOR_1;
      time_max=FastTimer(0);
      }
     }
      OnRev(OUT_A);                 //最初の向きをむいたので、最も強い光の場所まで再び回転
      Wait(time_max); 
 for(i=i_min; i<i_max;){         //iが1から5の間のときに繰り返す
   if(SENSOR_1>SENSOR_3){         //左のほうが強い光を感知したとき
    OnRev(OUT_A); Wait(RUN_TIME); Off(OUT_A);  
    turn_dir=1;                   //左に1回(0,2秒)進み、今回の動きをしめすturn_dirという変数を1に変える
      if(turn_dir==last_turn){
        i=0;                       //かつ、前回と今回の動きが同じならば、変数iを0に変える
      }else{
        i++;                       //前回と異なる動きをしたならば、変数iを1増やし、前回の動きをしめすlast_turnをturn_dirの動きである1に変える
        last_turn=turn_dir;
     }
   }else{                        //右のほうが強い光を感知したとき
     OnFwd(OUT_A); Wait(RUN_TIME); Off(OUT_A);
     turn_dir=0;                 //右に1回(0,2秒)進み、turn_dirという変数を0に変える
      if(turn_dir==last_turn){    //かつ、前回と今回の動きが同じならば、変数iを0に変える
        i=0;
      }else{                      //前回と異なる動きをしたならば、変数iを1増やし、last_turnをturn_dirの0に変える
        i++;
        last_turn=turn_dir;
      }
   }
 }
  throw_block();                 //iが5を越えたので、ブロックを投げて停止。
  Off(OUT_A+OUT_B);
 }

-''プログラム3の流れ''(今回のプログラムは文中のコメント文だけでは説明しづらいのであらためて…。)&br;
#ref(流れ.jpg);&br;
0.2秒で1回の右or左折としてカウントする。(iはこの回数をカウントするための変数)&br;
iが5回に達したら(光が停止していると判断して)ブロックを投げるが、途中で同じ動きを続ける(直進しない)と、カウントは0に戻す。
#ref(投.jpg);

**苦労&工夫した点 [#xbf8b0c3]
-ロボットに光の動きの停止を認識させる&br;
→右折と左折と交互に繰り返すのがモーターが1つの場合における直進にあたると考え、左右交互に動いたならば光が停止していると認識させる。(右右など、同じ動きが続いた場合は光が動いていると考え、おいかけさせる。)~

-モーターの片方はブロックを投げるのに使ってしまうので、1つのモーターのみで移動しなければならない。&br;
→ディファレンシャルギアとストッパーを使うことで、片方のタイヤを止めればもう片方のタイヤのみが動くことを利用して、右のみで前進(左折)と左のみで前進(右折)の2つの動きで移動をさせる。
→ディファレンシャルギアとブレーキを使うことで、片方のタイヤを止めればもう片方のタイヤのみが動くことを利用して、右のみで前進(左折)と左のみで前進(右折)の2つの動きで移動をさせる。

-いかにパーツを少なくして必要なところにまわすかという点で苦労しました。
-いかにパーツを少なくするか。&br;
ディファレンシャルギアはパーツを多く使用するので、必要なところにパーツをまわすために余剰パーツと不足パーツを考慮に入れて、ディファレンシャルギアのパーツを代用がきくものは代用パーツにしたり、小型化することにしたこと。

-今回はプログラム3の場合わけが多く、わかりづらい。&br;
プログラム3に関しては、プログラムの下に動きの流れの説明を加えました。

**感想 [#t196cf4b]
-(クノピー)今回の課題は期限が短く、ロボを何とか組み上げ、自分の担当した2の部分もできたのですが、最も苦しい3をネタ切れにまるまるやってもう形になり、自分も知恵を絞ってみましたが、力にはなれなかったのでプログラミングの習熟の必要があると感じました。ネタ切れに感謝です。
-(クノピー)今回の課題は期限が短く、ロボを何とか組み上げ、自分の担当した2の部分もできたのですが、最も苦しい3をネタ切れにまるまるやってもらう形になり、自分も知恵を絞ってみましたが、力にはなれなかったのでプログラミングの習熟の必要があると感じました。ネタ切れに感謝です。

-(ハネウマ)今回初めてまともにプログラミングをし、全然わかんなくてクノピー
とネタ切れに助けてもらいなんとか終わらせることができた。次はいよいよロボコンなので、今回の感覚を忘れず頑張りたいと思いました。本当にありがたかったぁ。

-(ネタ切れ)今回の課題は、1週間の期限の中で3人が分業でプログラムを書かなければならないので、予定をあわせるのが多少大変だったように思います。今回もまたまたクノピー様に組み立てを任せきりにしてしまい、非常に申し訳なかったです。
プログラムのほうは3を担当したのですが、光の停止を認識させるのに苦心しました。(今回の出来はちょっと自信がないですねぇ。)
プログラムのほうは3を担当したのですが、光の停止を認識させるのに苦心しました。

**コメントをどうぞ。 [#m22edab2]
-図示しているので、投擲ギミックなど見やすくてよいと思います。 -- [[ヒロヤ]] &new{2007-07-05 (木) 09:38:40};

#comment


-[[2007a]]
-[[2007a/A9]]
-[[2007a/MemberOnly/進行状況A]]


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