2011a

目次

課題3

内容

ボールを探し、ライトがあるところまで持っていくロボット。

ルール

周回コース(黒い線)上にあるボールを探し、運んでいく(又は飛ばす)ロボットを作成せよ。

周回コース(どのように進んでも良い)

  • 通常の交差点が2箇所以上ある。
  • ロータリー型の交差点が1箇所以上ある。
  • 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する。
  • 急なヘアピンカーブが1箇所以上ある。
  • スタート地点に目印がある。
  • 黒い線の幅は15〜20mm程度。
  • センサー、モーターはいくつ使ってもよい。
  • ボールを持ったらその場でライトのところまで飛ばすか、そのまま運んで持っていく。

メンバー紹介

  • 安野
  • 大庭

ロボット紹介

<ロボット概要>

ライントレースをせず、紙の上を自由に動き回ってボールを探す。

ボールを見つけたらその場でライトを探し、持っていく(又は投げる)。

110721_145526.jpg

<センサー>

  • タッチセンサーがうまく感知しなかったので、てこの原理を利用して少ない力でもセンサーを押せるようにした。
  • 広い範囲でセンサーに感知させるように工夫した。
  • 光センサーは、ランタンを見つけるために、本体前部の上に取りつけた。
110721_145538.jpg

<車輪>

  • 車輪は一つの方が安定したので、両方一つずつにした。
  • 車輪を一つにした代わりに、アームの下に安定用のパーツを付けた。
  • 多少前部に重心が偏ってしまった。
110721_145548.jpg

<上部>

  • アーム以外は結構シンプルな作りにした。
  • タッチセンサのコードを長いものにしたので、多少コードがごちゃごちゃしてしまった。
110722_113713.jpg

<アーム部分>

  • タッチセンサが反応したら、アームが閉じてボールをホールドする。
  • できるだけボールが入る面積を大きくした。
  • 安定感が少し悪く、ボールを運ぶときにぐらつくことがある。
110722_172417.jpg

<ギア>

  • 一つのモーターで二つのアームを動かせるようにした。
  • ギアの特徴をいかし、都合のいい方向に変えた。
  • 無理やりつなげた結果、たまにギアがうまく噛まない時があった。

プログラム紹介

安野

<ボールを蹴る>

#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_L(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);
#define turn_R(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);  
#define HOLD OnFwd(OUT_B); Wait(35);                                   //ボールを掴む
#define RELEASE OnFwd(OUT_B); Wait(35);Off(OUT_B);                     //ボールを離す 
task SEARCH()                                                        //ボールを探すプログラム
 {
  while(true)
    {
     GO(200);turn_L(50);
     }
  }
task MISSION()                                                       //ランタンにボール持っていくプログラム
 {
  int lmax=0;                                                                     //光の変数
  int tmax=0;                                                                     //時間の変数
  HOLD;                                                                           
  ClearTimer(0);                                                                  //タイマーをリセット
  while(FastTimer(0)<=400)         
    {
     OnFwd(OUT_A);
     OnRev(OUT_C);
     if(SENSOR_1>lmax)
       {
        lmax=SENSOR_1;tmax=FastTimer(0);                               //lmax、tmaxを随時更新
        }
      }
  turn_R(400-tmax);                                                  //ランタンがある方向に向く
  Wait(20);
  RELEASE;
  BACK(50);
  HOLD;
  GO(70);  
  }
task main()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH); 
  while(true)
    {
     start SEARCH;                                             //サーチプログラム始動
     until(SENSOR_2 == 1);
     stop SEARCH;                                              //サーチプログラム終了
     start MISSION;                                            //ミッションスタート
     Wait(1000);
     stop MISSION;                                             //ミッションコンプリート
     } 
   }

大庭

<ボールを掴んで持っていく>

#define MOVE(t) OnFwd(OUT_A+OUT_C); Wait(t);                    //直進  (関数を使う)
#define BACK OnRev(OUT_A+OUT_B); Wait(200);                     //2秒間後退
#define TURN(t) OnFwd(OUT_C);OnRev(OUT_A); Wait(t);             //右折
#define move(t) OnFwd(OUT_A+OUT_C); Wait(t);                    //直進
#define turn_R(t) OnFwd(OUT_C); OnRev(OUT_A); Wait(t);          //右折
#define turn_L(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t);          //左折
#define tomaru Off(OUT_A+OUT_C);                                //停止
#define tukamu OnFwd(OUT_B); Wait(50);                          //ボールをホールド
#define throw OnRev(OUT_B); Wait(50);                           //ボールを離す
task SEARCH()
{
 while (SENSOR_2==0){
    MOVE(200);                                     //タッチセンサーが押されてない間、自由に動き回ってボールを探す
    TURN(200);
    move(100);
    turn_R(100);
    MOVE(200);
    turn_L(100);
    move(100);
    TURN(200);
    }
}  
task MISSION()
{     
    tukamu;                                    //ボールをつかむ
    tomaru;
    Off(OUT_B);
    Wait(300);
  int lmax = 0;                                //光の変数
  int tmax = 0;                                //時間の変数
  ClearTimer(0);
  while(FastTimer(0)<800){                                //一周回り一番光の強い値を測定する(8秒間続ける)
          OnFwd(OUT_C);OnRev(OUT_A);                      //ランタンを見つける
          if(SENSOR_1>lmax){
          lmax = SENSOR_1;
          tmax = FastTimer(0);
           }
         }
    OnFwd(OUT_A); OnRev(OUT_C);                           //一番光の強い位置(ランタン)へ行く
    Wait(800-tmax);
    PlaySound(SOUND_UP) ;  Wait(20);
    MOVE(200);                                      //ランタンへ向かう
    throw;                                          //ボールを離す
    BACK;
}
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);                //センサー1に光、2にタッチセンサーをセット
   SetSensor(SENSOR_2,SENSOR_TOUCH);
  while(true){
    start SEARCH;                                             //サーチタスクを開始
    until(SENSOR_2 == 1);                                     //タッチセンサが押されたら開始
    stop SEARCH;                                              //サーチタスクを終了
    start MISSION;                                            //ミッションタスクを開始
    Wait(1000);
    stop MISSION;                                             //ミッションタスクを終了
    }
}

まとめ

安野

今回の課題をやっていて気づいた問題は
タッチセンサーが上手く働かない
アームの動きを止めてしまうと、ボールを掴みきれない
の二点だった。
タッチセンサーの件は軽いタッチでも反応する様に、
かませる板とタッチセンサーの位置を工夫して解決。
アームの件はボールを掴んでいる間、常にモーター
を動かしつづける事で解決した。
今回は自分でも上手く出来たと思う。ロボット作りから
プログラムまでいろいろ大変だったけど、最終的にはス
ムーズに動いてくれて良かった。次はロボコン。頑張ります。

大庭

  • 自由に動き回るロボットなので、ボールを見つけるのにすごく時間がかかってしまう。
  • ライントレースをしないので、プログラムは簡単にできたが、ボールの場所によっては見つけ出すのに時間がかかりそう。
  • マクロを多用して、プログラムを短くした。
  • ロボットが止まってからボールを掴むと、ボールがうまく掴めなかったので、掴んでから止まるという形に直した。
  • 最初タッチセンサがうまく動かなかったので、少ない力で反応させるのにすごく苦労した。
  • アームのホールド力が少し弱くて、ボールが離れてしまっていたので、その部分の改善にもとても苦労した。
  • 今回は自分たちが作ったプログラムで、いかにロボットをうまく動かせるかが難しかったと思う。
  • タスクを2つ作り、片方でボールを探し、片方でボールを持っていくという形にした。

コメント



添付ファイル: file110722_172417.jpg 164件 [詳細] file110722_113713.jpg 169件 [詳細] file110721_145548.jpg 181件 [詳細] file110721_145538.jpg 145件 [詳細] file110721_145526.jpg 164件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-29 (金) 18:10:14 (2949d)