課題3:ランタンに向かってテニスボールを転がす(または運ぶ)ロボット

課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって

1.転がす
2.最短距離で運ぶ

ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿らなくてもよい。

メンバー

製作過程

今回の課題で用いたセンサは光センサ2つ、タッチセンサ1つです。各センサの役割は次の通り↓
センサ1:光センサ・・・ライントレース用の光センサ
センサ2:光センサ・・・ランタンの光を検出するためのセンサ
センサ3:タッチセンサ・・・ボールやランタンに触れた際に機能するセンサ
となっています。

まずはセンサ1の光センサを

光センサ.png

のように、少し顔を出すよな感じでセット!

そして車体前方に光センサとタッチセンサをつけた

センサ.png

この課題の運ぶ側の人はテニスボールをランタンまで持っていくまでにボールをキープしていなければならない。そのために車体後方にアームを取り付けてみた。このアームは自由に上げ下げ可能だ。
まずは、上げた状態

閉じた状態.png

     ↓そしてこれを下げると・・・!?

開いた状態.png

↑こんな感じに

そしてできあがった今回のロボットがこちら

全体図.png

また、課題2と同様にこちらのコースを用います。

P1010120.jpg

プログラム

ばば(運ぶ)

#define THRESHOLD 30  //閾値
#define go_straight OnFwd(OUT_A+OUT_C);  //前進
#define back OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C);  //0.8秒間後退

int T=460;  //関数をそれぞれ定義
int lmax=0;
int tmax=0;

sub search_max()
{ while(FastTimer(0)<T)  //Tより小さいとき右にTだけ旋回
  { OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(T);
    if(SENSOR_2>lmax)  //lmaxより大きい光を検知したらその値を新たなlmaxに
    { lmax=SENSOR_1;   //lmaxまでの時間をtmaxとする
      tmax=FastTimer(0); } }
    OnRev(OUT_A);  //先ほどとは逆に左にT-tmaxだけ旋回
    OnFwd(OUT_C);
    Wait(T-tmax);
    Off(OUT_A+OUT_C); }

 sub ball_catch()
 { OnRev(OUT_A+OUT_C);  //0.3秒間後退
   Wait(30);
   OnFwd(OUT_A);  //180°回転
   OnRev(OUT_C);
   Wait(230);
   OnRev(OUT_A+OUT_C);  //0.3秒間後退
   Wait(30);
   OnRev(OUT_B);  //アームを下げる
   Wait(15); }

sub ball_release()
{ OnRev(OUT_A+OUT_C);  //0.3秒間後退
  Wait(30);
  OnFwd(OUT_A);  //180°回転
  OnRev(OUT_C);
  Wait(230);
  OnRev(OUT_A+OUT_C);  //0.3秒間後退
  Wait(30);
  OnFwd(OUT_B);  //アームを上げる
  Wait(200);
  Off(OUT_A+OUT_C);
  PlaySound(SOUND_CLICK); }  //テニスボールを運んだら音を鳴らす

sub search_line()
{ while (true){
  if (SENSOR_1 < THRESHOLD)   //センサ1が黒を検知したら左に修正
  { OnFwd(OUT_C);
    Off(OUT_A); }
 else  //センサ1が白を検知したら右に修正
 { OnFwd(OUT_A);
   Off(OUT_C); } }
}

 
task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサ1は光センサ
  SetSensor(SENSOR_2,SENSOR_LIGHT);  //センサ2は光センサ
  SetSensor(SENSOR_3,SENSOR_TOUCH);  //センサ3はタッチセンサ
repeat(3){  //カッコ内を3回繰り返し
go_straight;  //センサ1が黒になるまで前進
until(SENSOR_1<THRESHOLD);
search_line();  //センサ3が押される(ボールを見つける)までライントレース
until(SENSOR_3 == 1);
ball_catch();  //ボールをキャッチ
search_max();  //ランタンの方向を探す
go_straight;  //センサ3が押される(ランタンに触れる)まで前進
until(SENSOR_3 == 1);
ball_release();  //ボールをリリース
back;  //後退
}
Off(OUT_A+OUT_C);
PlaySound(SOUND_DOUBLE_BEEP);  //終わったら音を鳴らす
}

イシイ(蹴る)

#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);             //直進
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);           //後退
#define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);  //右旋回
#define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);  //左旋回
#define arm_down OnRev(OUT_B);Wait(20);Off(OUT_B);                     //アームを下げる
#define arm_up OnFwd(OUT_B);Wait(20);Off(OUT_B);                       //アームを上げる
#define THRESHOLD 30                                                   //閾値

int T=460;
int lmax=0;
int tmax=0;

task main()
{
  repeat(3)                                //以下の動作を3回繰り返す
  {
    SetSensor(SENSOR_1,SENSOR_LIGHT);      //ライントレースのセンサー
    SetSensor(SENSOR_2,SENSOR_LIGHT);      //ランタンを探すセンサー
    SetSensor(SENSOR_3,SENSOR_TOUCH);      //タッチセンサー

    until(SENSOR_3==1);
    {
      OnFwd(OUT_A+OUT_C);                  //前進
      if(SENSOR_1>THRESHOLD)
      {
        turn_r(10);                        //センサー1がラインからはずれたら0.1秒右旋回
        if(SENSOR_1>THRESHOLD)
        {
          turn_l(20);                      //それでもラインからはずれていたら0.2秒左旋回
        }
      }
    }
    back(30);
    turn_r(230);
    back(100);
    arm_down;
    OnFwd(OUT_A);OnRev(OUT_C);Wait(460);   //タッチセンサーが反応したら180度ターンし、アームを下げてボールを確保
    while(FastTimer(0)<T)
    {
      turn_r(T);
      if(SENSOR_2>lmax)
      {
        lmax=SENSOR_2;                     //センサー2がlmaxよりも大きい値になったらlmaxにセンサー2の値を代入
        tmax=FastTimer(0);
      }
    }
    turn_l(T-tmax);                        //最も明るい方向(ランタンのある方向)まで逆回りで戻る
    Wait(100);
    arm_up;
    go(50);
    back(100);
    Wait(100);
    go(50);                                //アームを上げてボールをケツで蹴り出す
    until(SENSOR_1<THRESHOLD)
    {
      OnFwd(OUT_C);OnRev(OUT_A);
    }
    Off(OUT_A+OUT_C);
  }
}

評価

感想

今回の課題はロボット本体の作成が難しかった。組み立てにおいて工夫したところはランタンを見つける光センサの両側に壁を作ってより正確な値を検知することができた、前にタッチセンサと光センサを取り付け、後ろにアームをつけて前後で役割を分担したなどです。
また、一番苦労したのは運ぶ側において「どこでテニスボールを止めるか」でした。この問題が浮上してアームを後ろにして前にタッチセンサをつけ替えました。さらに、ランタンを見つける光センサの高さにも苦労しました。普通につけると高くて正確な値が検知できませんした。なので下の方に設置しました。最終的にできた本体はバランスもよく、良い仕上がりだと思いました。

反省

反省点は、ロボットの作成に時間をとられ過ぎてプログラミングに時間を割けなかったことです。今回は問題が出る度にロボットを作り替えていたのでプログラムに時間をかけられませんでした。また、走らせるときの場所や明るさなどの条件によって成功したりしなかったりという問題がありました。どんな条件でも成功できるようなプログラムを組むようにしていきたいです。
次回はいよいよロボコンです。2つのロボットを駆使することが予想されるのでロボットの組み立てはより複雑化されるはずです。なので今回の反省を生かし、あらかじめ起きそうな問題を把握してロボットの作成に励み、適切なプログラムを書いてロボコンに臨みたいと思います。

コメント



Today:1

Yesterday:0

All:&counter([total|today|yesterday]);


添付ファイル: fileP1010120.jpg 242件 [詳細] file閉じた状態.png 232件 [詳細] file全体図.png 234件 [詳細] file開いた状態.png 239件 [詳細] fileセンサ.png 219件 [詳細] file光センサ.png 241件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-15 (金) 17:52:29