[[2009b]]
#contents
*課題3  [#vc5171e0]
~
懐中電灯に向かってブロックを投げるロボットを作ろう!~

*チーム [#jcf2f834]
チーム名「 株式会社 とだ 」~
 社長:とだ~
 社員:なかみう~
*ロボット [#k8d080ba]
~
~
今回は、「ディファレンシャルギア」を使用した。~
「一つのギアで前進・回転できるギア」で、後退はできない。~
これが、ディファレンシャルギア。
&ref(2009b/A1/課題3右/TS3M0039.JPG,30%,これがディファレンシャルギア);~
~
~
ギア一つでロボを動かすので、大きくて重いロボは作れない。~
というわけで、ロボの土台はこんな感じになった。~
&ref(2009b/A1/課題3右/TS3M0040.JPG,30%,これがロボ);~
光センサーもつけた。~
~
~
次に、ブロックを投げる装置を考え、取り付けた。
それがこれ。&ref(2009b/A1/課題3右/TS3M0049.JPG,30%,これで投げる);~
ピラミッドで高さを出して、装置が回転するようにした。~
~
~
どの様に投げるのかというと、「アームの回転」を使う。~
ブロックを、図の位置につけ(4個装填可能)、発射する。~
~

*プログラム [#hb34a8d7]
**とだのプログラム [#xeb637c4]
**なかみうのプログラム [#rfb2a5d9]
今回は(も?)、頑張った。
2つのプログラムを考えた。
最初に考えたのはこちら。~

 #define fo 300
 #define ma 80
 #define su 200
 #define na 500
 #define l_mini 60
 #define l_max  85
  int t = 0;
 task main ()
 {
 
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     SetSensor(SENSOR_3, SENSOR_LIGHT);
         
     
     while ( t < 1 ) { 
 
         if (SENSOR_1 > l_mini && SENSOR_3 > l_mini ) {
         if (SENSOR_1 > l_mini && SENSOR_3 > l_mini ) {  //両方のセンサーが、光を感知して、
                 PlaySound(SOUND_CLICK);    
             if(SENSOR_1 < l_max || SENSOR_3 < l_max) {
                 OnRev(OUT_A);
             } else { 
             until( SENSOR_1 >= l_max && SENSOR_3 >= l_max );
             if(SENSOR_1 < l_max || SENSOR_3 < l_max) {  //どちらかが「光の最大値」ほど明るく感じないとき
                 OnRev(OUT_A);               //回転
             } else {                             //両方「光の最大値」をとっているとき                
             until( SENSOR_1 >= l_max && SENSOR_3 >=l_max)//両方「光の最大値」を取るまで
             PlaySound(SOUND_DOUBLE_BEEP);
             Off(OUT_A);
             Wait(fo);
             t = t+1;
             OnFwd(OUT_A);                //前進
             t = t+1;                   //t=1となり、これ以上繰り返さない
             }  
                    
         
             
         } else {
         } else {                    //光を感知していないとき、
             
             OnRev(OUT_A);
             OnRev(OUT_A);               //前進や
             Wait(ma);
             OnFwd(OUT_A);
             Wait(su);
             OnFwd(OUT_A);                //後退で光をさがす。
             Wait(su);   
             
         } 
     }
     
     Off(OUT_A);
                              //ライトに近づいたら
     Off(OUT_A);                    //停止し、
     PlaySound(SOUND_FAST_UP);
     OnRev(OUT_C);
     OnRev(OUT_C);                   //ブロック発射。
     Wait(na);
     Off(OUT_C);
     Off(OUT_C);                    //停止。
     
            
 }            
~
文系な僕でしたが、数学の「場合分け」のように、ライトの明るさを中心に考えました。~
しかし、問題点が多く、~
-
-
-
-
+プログラムが複雑
+ライトを追えない時がある
+一回しか作動しない
+なんかよくわかんない。

など、山積みだった。~
(改良を加えれば動くには動くと思いますが。)~

そこで、M先生の助けをかり、~
もう一つのプログラムを考えた。~

 #define time 700
 #define time 700    //ロボが1回転する時間
 
 task main()
 {
      
      int l_max = 0;
      int t_max = 0;
      int l_max = 0;          //「光の最大値」をきろくするための変数
      int t_max = 0;          //時間を記録するための変数
      
      SetSensor(SENSOR_1, SENSOR_LIGHT);
      
      ClearTimer(0);
      while(FastTimer(0) <= time){
           OnRev(OUT_A);
           if(SENSOR_1 > l_max){
              l_max = SENSOR_1;
              t_max = FastTimer(0);
           }
      }
      ClearTimer(0);          
      while(FastTimer(0) <= time){    //ロボが1回転するまでで、
           OnRev(OUT_A);         //回転して 
           if(SENSOR_1 > l_max){     //光センサーの値が「光の最大値」より明るいとき
              l_max = SENSOR_1;     //その時の値を「光の最大値」に更新
              t_max = FastTimer(0);   //その時の時間を記録。
           }               //1回転した時には、
      }                 //「光の最大値」とその時間が分かります。
      PlaySound(SOUND_DOUBLE_BEEP);
      OnRev(OUT_A);
      Wait(t_max);
      Off(OUT_A);
      if(SENSOR_1 < 100 ){
         OnFwd(OUT_A);
      } else {
         Off(OUT_A);
         OnFwd(OUT_C);
      OnRev(OUT_A);           //再び回転を始めます。
      Wait(t_max);            //上で求めた、最も明るいところまで回転
      Off(OUT_A);            //そして停止。
      if(SENSOR_1 < 100 ){        //もしライトから30cm以上はなれている場合
         OnFwd(OUT_A);          //前進します。
      } else {              //30cmの位置にあれば、
         Off(OUT_A);           //前進をやめて
         OnFwd(OUT_C);          //ブロックを発射。
      }
      Off(OUT_C);
      Off(OUT_C);            //停止。
      
 }
      
こちらの方がシンプル。~
*コメントのコーナー [#nd5b8867]
コメントをどうぞ。
- ロボットの説明と、プログラムの説明の追加をお願いします。 -- [[こさか]] &new{2010-02-10 (水) 16:00:35};
- こさかさんと同じです。終わっていないと判断したため、採点しませんでした。レゴを返してしまって写真が難しいなら、図や説明でお願いします -- [[FI]] &new{2010-02-18 (木) 06:06:56};

#comment



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