2009a

2009a

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

A11R メンバー/ ダークホース タイラー

ロボット

ディファレンシャル・ギア

今回は「移動用に使っていいモータは一つ」という縛りがあったため、説明書のトップシークレットに載っていたデファレンシャル・ギアを用いた。
今回は左右回転だけが可能であればよいので、前進移動はいらないロボットを作成した。
gia.jpg

車体

トップシークレット、去年の先輩の作成したロボットを元に作成した。
どうしてもギアが噛み合わなくしばしばギアが緩むこともあるが走れるのでご愛嬌。
yoko.jpg

発射砲の作成

一度はカタパルト法を考えたが、いろいろなグループとかぶってしまい、面白みがないので、輪ゴムで飛ばす考えに至った。
命中精度、威力ともに抜群にした。
dai.jpg
gan.jpg

センサー

センサーは意外と曖昧でなかなか狙った場所に方向が向かないことに苦戦。
しかし、先輩のアイディアを参考にさせていただき、L路のブロックを装着。
これにより、とてもシビアで正確なセンサーになった。
mae.jpg

完成

マシンの完成
だいぶ厳つい形になった。
発射砲なんてなんかミサイルでも出そうな感じ。
かっこ良く仕上がっているが、少し重いせいか移動がスムーズではない。
yoko2.jpg
yoko3.jpg

プログラム

1・全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる

#define HIKARI 50
#define KYORI  75
#define gs OnFwd(OUT_A);Wait(30);OnRev(OUT_A);Wait(30);
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);          //センサー1を光センサー
 SetSensor(SENSOR_3,SENSOR_LIGHT);         //センサー3を光センサー
 SetPower(OUT_A+OUT_B,7);                   //モーターの出力を設定
 while(SENSOR_1<=HIKARI){
     OnFwd(OUT_A);  
     while(SENSOR_1 == SENSOR_3){               SENSOR_1とSENSOR_3が同じになるまで繰り返す
     if(SENSOR_1 > SENSOR_3){
         OnRev(OUT_A);
         Wait(10);
         Off(OUT_A);                            //小刻みに左を向く
     }
     else if(SENSOR_1 < SENSOR_3){
         OnFwd(OUT_A);
         Wait(10);
         Off(OUT_A);               //小刻みに右を向く
     }
     }
      while((SENSOR_1<=KYORI) && (SENSOR_3<=KYORI)){
              gs;
         }
         OnFwd(OUT_B);
         Wait(20);
         Off(OUT_B);
     }
  }
 }
}

[#qfda865c] 作成者:ダークホース

2・動く懐中電灯に向かって進み、懐中電灯が止まったらブロックを投げる

#define WHEEL_SPEED 4
#define INERTA_PAUSE 5
#define PAUSE 15
#define SEARCH_X_TIMES 3
#define THRESH3 300
#define THRESH4 400
#define THRESH5 500
#define THRESH6 600
int threshTmp1;
int gMax = 1000;
int r_thresh=1000;
int iBdir = 0;
//about 300 (very light) to 800 (very dark). This
void turn(int turn_time)
{
  //This works by moving the wheels forward the same distance    //両方のホイールを同じ距離だけ動かすようにして前進する
  //only in increments     //
  OnFwd(OUT_B);Wait(turn_time);
  Off(OUT_B);Wait(INERTA_PAUSE);
  OnRev(OUT_B);Wait(turn_time*2);
  Off(OUT_B);Wait(INERTA_PAUSE);
  OnFwd(OUT_B);Wait(turn_time);
  Off(OUT_B);Wait(INERTA_PAUSE);
}
void kaiten(int drive_time)//変数を使って、その時間だけ回転
{
   OnFwd(OUT_B);Wait(drive_time);
}
sub globalMax()
{
//To avoid getting local maixma when searching for the light   //光を見つけるとき、ローカルのmaixmaを手に入れるのを避けるために   
//do some spins to find to max value from the flashlight    //懐中電燈から最大の値を見つけるために回転をします。
 ClearTimer(0);
 gMax = 1000;
 while(Timer(0) < 100) //10秒間回転して、光の値を更新し続ける
 {
    OnFwd(OUT_B);
    if((SENSOR_1 <= gMax)|| (SENSOR_3 <= gMax)) //センサの見つけた光を、最初に決めた変数gmaxから20ずつ減らすことによって。
    {
      gMax = gMax - 20;
    }
 }
 Off(OUT_B);
}
void recusiveLightFinder()
{
  if((SENSOR_1 <= r_thresh)|| (SENSOR_3 <= r_thresh))//If sensor is brighter   than 6      センサが6より明るいなら
  {//If not brighter than current max keep driving 現在より明るくないときは動き続ける、センサの値が6以下になるまで
     r_thresh = r_thresh - 25;
  }
    if(iBdir == 0)
    {
      OnFwd(OUT_B);
      Wait(PAUSE);
    }
    else
    {
      OnRev(OUT_B);
      Wait(PAUSE);
    }
  Off(OUT_B);
}
task main()
{
   SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
   SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
   SetPower(OUT_B, WHEEL_SPEED);
   globalMax();//光の最大値を探す
   while((r_thresh >= gMax+(gMax/20)))// gMaxがr_threshより、小さくなるまで繰り返す
   {
      PlaySound(4);
      recusiveLightFinder();
   }
   Wait(70);
   PlaySound(5);
   turn(40);  //Drive foward
   OnFwd(OUT_C); //Fire
   Wait(10);
}

作成者:タイラー

感想

コメント

コメントをどうぞ

  • プログラム中に無限ループと書いてありますが、投げたら抜けるようにしてください。ロボが停止しても、プログラムは動き続けてしまいます。タイラーさんのプログラムでは「while*1||(r_thresh >= (gMax+(gMax/20))))」がよくわかりません…説明を付け足してください。 -- こさか? 2009-08-10 (月) 00:58:20


*1 r_thresh >= gMax+(gMax/20

添付ファイル: fileyoko3.jpg 251件 [詳細] fileyoko2.jpg 247件 [詳細] fileyoko.jpg 237件 [詳細] filemae.jpg 240件 [詳細] filegia.jpg 241件 [詳細] filedai.jpg 240件 [詳細] filegan.jpg 239件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-15 (土) 15:59:25 (3656d)