2008b/MemberOnly/進行状況A

課題 懐中電灯に向かってブロックを投げるロボットの作成

内容

1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。

2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。

懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。

目次

ロボットの製作

コンセプト

・懐中電灯は、3Dでさがす
・ホイールは、ちゃんと届かせる

2Dでは面白くないと思い、3Dでの実現を目指して形を創っていった。 懐中電灯に向ってブロックを投げるのはY太郎のアイデアを採用した。

ベース

今回の課題ではモータの3個で、「投げる」「上を向く」「動かす」の三つの動作をしなければならない。前の2つは、一つのモーターで動作できるが、最後の一つはモーターが2個必要である。これではモーターの数が足りなくなるため、今回はベース部分に、ディファレンシャルギアを使用した。

ギア

発射台

50cm先の目標物を目がけて投げれるようにゴムを使った。このおかげでとても鋭い弾が打てるようになった。

発射台

ストッパーであるトリガーをモーターによって引けるようにした。

トリガー

光センサー

光センサーは2つ前方に取り付け、その下にキャスターを取り付けることでロボを安定させた。光センサーを上下に分けてつけることで3Dの実現に成功した。また課題2はセンサーを左右につけることで懐中電灯を追えるようにした。

センサー
左右センサー

また、車体を持ち上げて的を狙えるような台を光センサーの下に設置した。

台

最終的にこのようなかっこいい全体像になった。

全体

プログラム

課題1 まつ

#define THRESHOLD 50                                    //閾値
#define STRATE 53
#define MAX 65
int move_count;                                        //変数
task main()
{ 
  SetPower(OUT_C,4);        
  SetSensor(SENSOR_1,SENSOR_LIGHT);                              //センサー1は光センサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);                               //センサー3は光センサー
  move_count = 0;                                        //変数に0を代入
   
while(move_count == 0){                                    //変数が0の間
 if((SENSOR_1<THRESHOLD) || (SENSOR_3<THRESHOLD))                       //値が49以下のとき
 {OnRev(OUT_C);}                                        //その場で回転する
 if(((SENSOR_1>=THRESHOLD)&&(SENSOR_1<MAX))||((SENSOR_3>=THRESHOLD)&&(SENSOR_3<MAX)))
  {
  {                         
while(((SENSOR_1>=THRESHOLD)&&(SENSOR_1<MAX))||((SENSOR_3>=THRESHOLD)&&(SENSOR_3<MAX)))
   {Off(OUT_C);Wait(30);OnFwd(OUT_C);Wait(140);Off(OUT_C);Wait(30);
               OnRev(OUT_C);                                               //値が50以上、65未満の時ジグザグに前へ進む
               until(((SENSOR_1>= STRATE)||(SENSOR_3>= STRATE)); 
               until((SENSOR_1>=MAX)||(SENSOR_3>=MAX)));
   }}
 
 if ((SENSOR_1>MAX) || (SENSOR_3>MAX))                            //値が65以上の時
  {Off(OUT_C);Wait(30);OnFwd(OUT_A);                             //センサー1とセンサー3が65以上になるまで車体前方を持ち上げる
   until((SENSOR_1>MAX)&&(SENSOR_3>MAX));
   Off(OUT_A);Wait(50);OnRev(OUT_B);Wait(50);Off(OUT_B);Float(OUT_A);             //トリガーが引かれタマが飛ぶ
   (move_count);move_count = move_count +1;                          //変数が1になって停止する
   }
}
}

課題2 Y太郎

#define THRESHOLD 50                                                                            //閾値
#define STRATE 53
#define MAX 65

task main(){  
  SetSensor(SENSOR_1,SENSOR_LIGHT);                                    //センサー1は光センサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);                                         //センサー3は光センサー
  int light_1;                                                              //変数1
  int light_2;                                               //変数2
  int light_max;         
  int max_time; 
  light_1 = SENSOR_1+5; 
  light_2  = SENSOR_3+5; 
  
while((SENSOR_1 <= light_1) && (SENSOR_3 <= light_2)){                       //センサー1が変数1以下、またはセンサー3が変数2以下の時
    ClearTimer(0);                              //タイマーをリセット
    while(Timer(0) < 40){                                             //タイマーが40以下の時
      if(SENSOR_3 < SENSOR_1){                                               //センサー1がセンサー3より大きい値の時
        OnFwd(OUT_C);                                                        //右に旋回
     }
      if(SENSOR_3 > SENSOR_1){                                         //センサー3がセンサー1より大きい値の時
        OnRev(OUT_C);                             //左に旋回
}
   }  
    Off(OUT_C); 
    light_1 = SENSOR_1; 
    light_2  = SENSOR_3; 
    Wait(100); 
 }

  if(((SENSOR_1>=THRESHOLD)&&(SENSOR_1<MAX)) || ((SENSOR_3>=THRESHOLD)&&(SENSOR_3<MAX))) 
  {
   while(((SENSOR_1>=THRESHOLD)&&(SENSOR_1<MAX)) || ((SENSOR_3>=THRESHOLD)&&(SENSOR_3<MAX)))
    {Off(OUT_C);Wait(30);OnFwd(OUT_C);Wait(190);Off(OUT_C);Wait(30);
                OnRev(OUT_C);
                until((SENSOR_1>= STRATE) || (SENSOR_3>= STRATE));
                until((SENSOR_1>=MAX) || (SENSOR_3>=MAX));
    }}


  ClearTimer(1); 
  
  while(FastTimer(1) < 200){
   
    OnFwd(OUT_A); 
    
    if(SENSOR_1>light_max){
    
      light_max = SENSOR_1; 
      max_time = FastTimer(1);
    }
  } 
  Off(OUT_A); 
  OnRev(OUT_A); 
  Wait(100); 
  OnFwd(OUT_A); 
  Wait(max_time); 
  Off(OUT_A); 
  Wait(50); 
  OnRev(OUT_B); 
  Wait(100); 
  Off(OUT_B); 
}

製作を終えて

3Dにしてみると懐中電灯の光の当て方でセンサーが反応しないなど、さまざまな問題がでてきて解決策を考えるのが難しかった。また、50cmに近づいて弾を発射するために光センサーの値を変えて対応したがなかなか値測るのが大変でした。


添付ファイル: fileDSC00439.JPG 182件 [詳細] fileDSC00438.JPG 180件 [詳細] fileDSC00437.JPG 172件 [詳細] fileDSC00436.JPG 208件 [詳細] fileDSC00435.JPG 382件 [詳細] fileDSC00434.JPG 175件 [詳細] fileDSC00433.JPG 188件 [詳細] fileDSC00432.JPG 166件 [詳細] fileDSC00431.JPG 195件 [詳細] fileDSC00430.JPG 387件 [詳細] fileDSC00428.JPG 359件 [詳細] fileDSC00429.JPG 222件 [詳細] fileDSC00425.JPG 362件 [詳細] fileDSC00424.JPG 357件 [詳細] fileDSC00422.JPG 386件 [詳細] fileDSC00423.JPG 330件 [詳細] fileDSC00421.JPG 191件 [詳細] fileDSC00418.JPG 155件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-10 (火) 23:24:27