2009b

課題3 


懐中電灯に向かってブロックを投げるロボットを作ろう!

チーム

チーム名「 株式会社 とだ 」
 社長:とだ
 社員:なかみう

ロボット



今回は、「ディファレンシャルギア」を使用した。
「一つのギアで前進・回転できるギア」で、後退はできない。
これが、ディファレンシャルギア。 これがディファレンシャルギア


ギア一つでロボを動かすので、大きくて重いロボは作れない。
というわけで、ロボの土台はこんな感じになった。
これがロボ
光センサーもつけた。


次に、ブロックを投げる装置を考え、取り付けた。 それがこれ。これで投げる
ピラミッドで高さを出して、装置が回転するようにした。


どの様に投げるのかというと、「アームの回転」を使う。
ブロックを、図の位置につけ(4個装填可能)、発射する。
矢印の方向に回転する。
投げる

プログラム

とだのプログラム

なかみうのプログラム

今回は(も?)、頑張った。 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 ) {  //両方のセンサーが、光を感知して、
                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)//両方「光の最大値」を取るまで
            PlaySound(SOUND_DOUBLE_BEEP);
            OnFwd(OUT_A);                //前進
            t = t+1;                   //t=1となり、これ以上繰り返さない
            }  
                   
        
            
        } else {                    //光を感知していないとき、
            
            OnRev(OUT_A);               //前進や
            Wait(ma);
            OnFwd(OUT_A);                //後退で光をさがす。
            Wait(su);   
            
        } 
    }
                             //ライトに近づいたら
    Off(OUT_A);                    //停止し、
    PlaySound(SOUND_FAST_UP);
    OnRev(OUT_C);                   //ブロック発射。
    Wait(na);
    Off(OUT_C);                    //停止。
    
           
}            


文系な僕でしたが、数学の「場合分け」のように、ライトの明るさを中心に考えました。
しかし、問題点が多く、

  1. プログラムが複雑
  2. ライトを追えない時がある
  3. 一回しか作動しない
  4. なんかよくわかんない。

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

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

#define time 700    //ロボが1回転する時間

task main()
{
     
     int l_max = 0;          //「光の最大値」をきろくするための変数
     int t_max = 0;          //時間を記録するための変数
     
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     
     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 ){        //もしライトから30cm以上はなれている場合
        OnFwd(OUT_A);          //前進します。
     } else {              //30cmの位置にあれば、
        Off(OUT_A);           //前進をやめて
        OnFwd(OUT_C);          //ブロックを発射。
     }
     Off(OUT_C);            //停止。
     
}
     

こちらの方がシンプル。

ちなみに、「PlaySound]は
プログラムの進行状況を確認する為につけた。

問題点


問題点は、
発射装置にあった。
回転が遅いので、ブロックが飛ばず、
ポロッと落ちてしまった。
改良が必要だった。

コメントのコーナー

コメントをどうぞ。



添付ファイル: fileroo.JPG 338件 [詳細] fileTS3M0051.JPG 188件 [詳細] fileTS3M0050.JPG 209件 [詳細] fileTS3M0049.JPG 358件 [詳細] fileTS3M0048.JPG 191件 [詳細] fileTS3M0041.JPG 184件 [詳細] fileTS3M0040.JPG 353件 [詳細] fileTS3M0039.JPG 337件 [詳細] fileTS3M0038.JPG 193件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-19 (金) 16:22:02