2016b/Member 目次

ロボット本体の説明

ピッチャーロボットについて

左右のタイヤにそれぞれモーターをつけた。前方にはキャスターのようなパーツを付け移動するようにした。もう1つのモーターは投球動作に使った。ロボットにレールのようにパーツを付け、その上をボールを転がし投球させた。スタート時、ボールは縦に5個積んだ。モーターを用いて1番下のボールを押し出すことで投げている。また、センサーは光、回転、タッチの3種類使った。risのボタンが押しにくかったため、タッチセンサーを押すことで動作を始めるようにプログラムを作った。回転センサーは投球動作でモーターを正確に1回転させるために使用した。光センサーはバッターの方向を向くために使用した。

ピッチャー
ピッチャー2

バッターロボットについて

高得点を狙うため、ボールを受け取ったら角度を調整してゴールを狙うようにした。また、移動の際に正確に動くために光センサーを2個使い黒い線に対して垂直に入れるようにした。

バッター

通信の仕方

ピッチャー、バッター双方に光センサーを付けた。ピッチャーがバッターについている光センサーを感知し、バッターの方を向きメッセージを送る。バッターはメッセージを受け取ったらピッチャーに送り返す。ピッチャーはメッセージを受け取ったら次の動作に移る。メッセージを受け取れなかった場合バッターの方を向くところからやり直す。

プログラムの説明

定義について

今回の課題では下の9個の動作や数値と2個の変数を定義した。

#define GO OnFwd(OUT_AC);            //前に進む
#define BACK OnRev(OUT_AC);                      //後ろに進む
#define CURVE_LEFT OnFwd(OUT_C);                 //左に曲がる   
#define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);    //右に旋回
#define TURN_LEFT OnFwd(OUT_C);OnRev(OUT_A);     //左に旋回
#define PUSH_BALL OnFwd(OUT_B);                  //ボールを押し出す
#define NUMMBER1 111                             //ピッチャーが送る数値
#define NUMMBER2 222                             //バッターが送る数値 
#define kaiten_time 120                          //サブルーチンFACEで回るときの時間
int light=0;                                     //光の値を測る変数(初期値は0)
int n=0;                                         //投球数を数える変数(初期値は0)

サブルーチンについて

今回はバッターの方を向く動作と投球動作をサブルーチンにした。

投球動作

  • 上で説明したような投球機構であるため、モーターをちょうど1回転させるため回転センサーを使い制御した。
    sub THROW()                  
    {
       SetSensor(SENSOR_2,SENSOR_ROTATION);       //センサー2は回転センサー
       ClearSensor(SENSOR_2);                     //センサー2の値を0に戻す
       until(SENSOR_2>=16){                       //回転センサーの値が16(1回転分)になるまで
           PUSH_BALL;                             //ボールを押し出す
       } 
       Off(OUT_B);                                //動きを止める
    }

向き合う動作

  • ピッチャー、バッター両方に向かい合うように光センサーを付け、ピッチャーが光の最大値をとるまで回るようにプログラムした。向かい合ったときに2機で番号を送りあい、正しい方向を向いているか確かめるようにした。バッターから番号を受け取るまで強い光を探して回るようにタスクメインでプログラムしたため1度では正しい方向を向けなくてもいずれはバッターを向くことができるようにした。
sub FACE()
{
    SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー3は光センサー
    ClearTimer(0);                         //タイマー(0)をリセット
    light=SENSOR_3;                        //lightの値をこの時の光センサーの値に置き換える
    while(FastTimer(0)<kaiten_time){       //タイマー(0)が定義した時間より低い間以下の動作をする
        if(light<SENSOR_3){                //lightの値が光センサーのとる値より低いとき
           light=SENSOR_3;                 //lightの値をこの時の光センサーの値に置き換える
         }
        if(light>=SENSOR_3){               //lightの値が光センサーのとる値より低いとき
           TURN_RIGHT;                     //右に旋回する
         }
    }
   Off(OUT_AC);                             //止まる
   until(light<=SENSOR_3){                 //光センサーの値がlight以上になるまで
       TURN_LEFT;                          //左に旋回する
   } 
   Off(OUT_AC);                            //止める
    Wait(300);                              //300秒待つ
}   

タスクメインについて

ロボットの構造上risのボタンを押しづらくなってしまったため、タッチセンサーを押しやすい場所に付け、タッチセンサーを押せば動くようにした。プログラムを作る際、移動、向き合う動作、投球動作の3つに分割した。

task main()
{                                                             スタートから移動まで
   SetSensor(SENSOR_1,SENSOR_TOUCH);    //センサー1はタッチセンサー
   until(SENSOR_1==1){                      //タッチセンサーが反応するまで
       Off(OUT_AC);                         //止まる
   }      
   CURVE_LEFT;                               //左に曲がる
   Wait(110);                                
   GO(OUT_AC);                               //前に進む
   Wait(520);                                
   Off(OUT_AC);                              //止まる(マウンドに到着)
   Wait(1500);                               //バッターがピッチャーの前に来るまで待つ
   ClearTimer(1);                            //タイマー(1)をリセット                           移動から向き合うまで
   ClearMessage();                           //メッセージをリセット
   until(Message()==NUMMBER2){               //バッターからメッセージが送られてくるまで以下の動作をする
       if(FastTimer(1)>100){                 //タイマー(1)が100を越えた場合
           TURN_RIGHT;                       //少し右に旋回する(少しづつ光を測る場所を変えるため)
           Wait(40);                         
           FACE();                           //光の一番強いところを向く
           SendMessage(NUMMBER1);            //バッターにメッセージを送る
           ClearTimer(1);                    //タイマー(1)をリセット
        }
   }
   TURN_RIGHT;                               //向きの微調整のために右に旋回
   Wait(7);                                  
   Off(OUT_AC);                              //旋回を止める
   PlaySound(SOUND_UP);                      //投げる合図として音を鳴らす                        向き合ってから終わりまで
   Wait(143);                                //バッターの準備を待つ
   THROW();                                  //ボールを投げる
   ClearTimer(2);                            //タイマー(2)をリセット
   while(n<4){                               //投球数が4より小さい間以下の動作
       if(FastTimer(2)>200){                 //タイマー(2)が200を越えた場合
            PlaySound(SOUND_UP);             //投げる合図として音を鳴らす
            THROW();                         //ボールを投げる
            ClearTimer(2);                   //タイマー(2)をリセット
            n++;                             //投球数を+1
        }
   }
   Off(OUT_AC);                              //止める
}

感想

今回のロボコンでは結果的には1位だったので良かった。本番では成功したが、安定感は他のチームに劣っていたと感じた。移動に回転センサーを使うなどすればもっと安定して成功したかもしれないと思った。私はピッチャーを担当したが思い通りに動くロボットが作ることができた。作っている時に問題などにぶつかっても4人で協力して出来たので上手くいったのだと思った。授業外での活動が多く大変だったが、その分学べたことも多かったので良かった。


添付ファイル: fileIMG_1780.jpeg 80件 [詳細] fileIMG_1792.jpeg 122件 [詳細] fileIMG_1769.jpeg 88件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-11 (土) 23:35:38