目次

課題3

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

インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)

課題を行うにあたって

以下の動作をするロボットを製作する

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

ロボットの説明

全体

今回の課題は前回の様な小刻みの方向転換を繰り返すことがなくよりスムーズな方向転換を想定してタイヤを用いた。
まずは「四輪」の機体を作成してみたものの、
「三輪」が方がはるかにスムーズな動作が可能であると判断した。
しかし、実際にプログラムをして動作確認したところ、あえてタイヤをつけるよりも簡単な土台をつけることによりゴムのタイヤをつけることにより生じる摩擦を軽減させたほうがさらにスムーズな動作が確認できた。

内部構造

ディファレンシャルギアを利用し、一つのモーターで前後運動及び回転運動をすることができるようにした。

内部機構

前から見た状態

一度はタイヤをつけ回るようにしたが、実際に動かしてみたところ回転した後に前進した場合にタイヤが捩れてしまいうまく動作しなかった。
そのため簡単な土台を設置することで、問題を解決することに成功。

前方

後ろから見た状態

後方には発射台を設置した。
機体に設置するスペースが全くなかったために、新たに設置するのに苦労した。

後方

発射台

発射台は連射が可能なように制作した。
最初は発射台上部のアームが固定されていなかったため、連射ではなく散弾になっていたので、改善した。
上部アームを若干の余裕を持たせつつ、固定し込めた弾が投擲したときに全て飛ばないとうにする。

発射台

光センサー

光源を探すために前方に光センサーを設置した。
左右それぞれ光の強さを判断出来るように、間に衝立を設置した。
最初は光センサーを斜めに設置しようとしたが、そうすると間に衝立を設置できなくなりまた固定が出来なくなってしまうため断念した。

光センサー


プログラム

プログラムの概略

全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。

#define TURN_TIME 225               //1周にかかる時間
int light_max=0,time_max=0;         //変数を定義
sub throw_block()
{
OnRev(OUT_B);
Wait(15);
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);
  Off(OUT_A);
  throw_block();
}

懐中電灯をゆっくり動かす時のプログラミング

#define THRESHOLD 65       //閾値    
task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ−1を光センサーに定義する
  SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサ−3を光センサーに定義する
  SetPower(OUT_A+OUT_C,7);        //AとCのモーターの出力を7にする
  while(true) {
      if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサー1と3が受ける光が閾値より強ければ前進
      OnRev(OUT_C); Wait(15);
      OnFwd(OUT_C); Wait(15);
      }
      if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //センサ−3が受ける光が暗くなったら左折
      OnRev(OUT_C);
      Off(OUT_A); 
      }
      if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサ−1が受ける光が暗くなったら右折
      OnFwd(OUT_C);
      Off(OUT_A);                                                                                                                                                             }
      if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //光がなければ時計回りに回転
      OnFwd(OUT_C);
      Off(OUT_A); 
      }
      }
Off(OUT_A+OUT_C);
}

懐中電灯を追いかけ懐中電灯の動きが止まればブロックを投げるプログラミング

#define THRESHOLD 65       //閾値
#define RUN_TIME 25        //RUN_TIMEを2,5秒に定義する
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ−1を光センサーに定義する
 SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサ−3を光センサーに定義する
 SetPower(OUT_A+OUT_C,7);        //AとCのモーターの出力を7にする
 ClearTimer(0);               //タイマーをクリアする
 while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD) || (Timer(0) <= RUN_TIME)) {//光が閾値より弱くタイマーが2,5秒以下ならば実行
      if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサー1と3が受ける光が閾値より強ければ前進
      OnRev(OUT_C); Wait(15);
      OnFwd(OUT_C); Wait(15);
      }
      if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //センサ−3が受ける光が暗くなったら左折
      ClearTimer(0);               //タイマーをクリアする
      OnRev(OUT_C);
      Off(OUT_A); 
      }
      if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサ−1が受ける光が暗くなったら右折
      ClearTimer(0);               //タイマーをクリアする
      OnFwd(OUT_C);
      Off(OUT_A);                                                                                                                                                                                                                        
      }
      if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //光がなければ時計回りに回転
      ClearTimer(0);               //タイマーをクリアする
      OnFwd(OUT_C);
      Off(OUT_A); 
      }
      }
Off(OUT_C); 
OnRev(OUT_A); Wait(50);           //前進を2,5秒以上続けたらブロックを投げる
OnFwd(OUT_A); Wait(50);
Off(OUT_A);
}

コメント

コメントをお願いします

  • 最初の課題では、各方向の明るさを調べて最大値を求めてください。 -- 松本 2008-07-08 (火) 08:53:48

課題1を相対的に最も明るい方向を探すようにしてください。
細かいことを言えば、課題1のwhileの中に Off(OUT_A);はいらないだろうし、(SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)の否定は
「両方とも受ける光が閾値より強い」ではないです。I


添付ファイル: file080710_165326.JPG 222件 [詳細] file080703_175445.JPG 246件 [詳細] file080710_165357.JPG 130件 [詳細] file080710_165340.JPG 242件 [詳細] file080710_165305.JPG 120件 [詳細] file080710_165251.JPG 252件 [詳細] file内部構造.JPG 247件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-04 (月) 17:48:41