2015b/MemberOnly

ボール打ち出しロボット

課題

今回の課題は2つのロボットを用いて一つがAから発進しボールをつかみ缶にあてる。もう一つがBから発進しそのボールを回収する、というものだ。コースは下の図の通りであり缶の上には電球が乗っていて光を発している。

22015b-mission31.png

ロボット -打ち出し側-

車体はライントレースができるようにドライブベースを使った。そしてボールをつかむ、なげる動作が必要なのでアームを付けた。

IMG_0735 - コピー.JPG

ロボットは図のようであり、全体的に上にパーツを盛る形となった。これは缶の上にある電球の光を感知するために光センサーの位置を調整したためである。また光センサーの周りをブロックで囲むことにより光の方向がほぼ正確にわかるようになった。下にも光センサーを取り付けライントレースもできるようにした。

車体

車体は前回と同様にドライブベースを用いたので説明は省略する。

アーム

アームは1つのモーターでボールをつかむ動作、投げる動作を行う必要があった。そこでボールを固定する部分の場所に前向きの押し出す部分を加えることでボールの固定をやめたとき、前へ押し出すことに成功した。

IMG_0738.JPG

図の中では黄色のブロックが押し出す部分である。初めは固定するときに邪魔になるのではないか、 と考えた。しかし前についている黒いブロックを横に広げ、さらに奥行きも加えることにより黄色のブロックとボールの間に適度な間隔が空いた。これによりがっしりとつかんでいるときだけボールに触れるのでつかむのを邪魔せず押し出せるようになった。

ロボット-受け取り側-

IMG_0804.JPG

受け取り側のロボットは、はさみ状のアームでボールをつかむようになっている。またアームが長いので広い範囲をカバーでき、超音波センサーもついているのでボールを探知して近づき取ることができる。

プログラム -打ち出し側-

最初に、今回はモーターの配置の関係でモーターA,Cは「OnFwd」と入力すると逆回転してしまった。そこでプログラム上では前進するときは

「OnRev(OUT_AC)」

と入力している。

プログラムの内容はまずA地点から出て1つ目のボールへ向かう。この時は大体の時間を決めてボールの近くへ行くようにした。そしてボールをつかみ光へ近づきボールを投げる。次に2つ目のボールを取りに行き投げるというものだ。

・1つ目はスタートの位置から動くのである程度時間操作でボールへ近づける。しかし2つ目はボールを投げたあとであり動いてしまっているのでボールの位置がわかりにくい。そこで最初の図にある「 廚粒僂鯡椣にすることにした。交差点の識別方法は知識として知っているのでそれを使いロボットが0.5秒連続して右へ曲がり続けると角として識別させた。

・光へ近づくときは正確さを求め、0.5秒進むごとに光の方向を確認するようにプログラムした。

・アームを動かすときは下げるときはあまり力がいらないので上げるときにパワー5、下げるときにパワー1とした。

数値の定義づけ

int light_max = 0;     //光の一番大きい数値
int turn_time = 500;   //光を探すために旋回する時間
int time_max = 0;      //回り始めてから最大の明るさの値を見つけるまでの時間

光の方向に向くサブルーチン

sub light(){
  
     /*   センサー1,2を光センサーに設定   */
        SetSensor(SENSOR_1, SENSOR_LIGHT);
        SetSensor(SENSOR_2, SENSOR_LIGHT);
  
     /*   時間をはかりながら旋回   */
        ClearTimer(0);
        OnFwd(OUT_A);OnRev(OUT_C);
  
     /*   光センサーが最も明るい値を示した時の旋回した時間を求める   */
        while(FastTimer(0) < turn_time){
            if(SENSOR_2 > light_max){
                light_max = SENSOR_2;
                time_max = FastTimer(0);
            }
         }
         Off(OUT_AC);Wait(100);
  
     /*   光のほうへむける   */
         OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time - time_max);
         Off(OUT_AC);Wait(100);
}

メインプログラム

まずは1つ目のボール

task main(){
         SetSensor(SENSOR_2,SENSOR_LIGHT);
         SetSensor(SENSOR_1,SENSOR_LIGHT);
     
  
         SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);    //アームの持ち上げ
  
     /*   1つ目のボールをつかみに行く   */
         OnRev(OUT_AC);Wait(200);
         OnRev(OUT_A);OnFwd(OUT_C);Wait(100);
         OnRev(OUT_AC);Wait(200);
         Off(OUT_AC);Wait(100);
  
         SetPower(OUT_B, 1);OnRev(OUT_B);Wait(100); 
  
         OnRev(OUT_C);OnFwd(OUT_A);Wait(150);
         OnRev(OUT_AC);Wait(300);
  
     /*   光の最大値が65以上になるまで光源に近づく   */
         while(light_max < 65){
              
                    OnRev(OUT_AC);Wait(50);Off(OUT_AC);
                    light();
         }
  
         PlaySound(SOUND_CLICK);
         light();                                    //最後にもう1回光の方向を確認する
  
         SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);    //ボールを投げる

  次に2つ目のボール

     /*   2つ目のボールをつかみに行く   */
         OnFwd(OUT_C);OnRev(OUT_A);Wait(150);
         Off(OUT_AC);Wait(100);
  
         OnRev(OUT_AC);Wait(200);
         OnRev(OUT_AC);until(SENSOR_1 < 41);
         Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100);    //黒線まで進む
  
     /*   角を認識してボールへ近づく   */
         ClearTimer(1);
  
         while(FastTimer(1) < 50){
            if(SENSOR_1 > 49){
                OnRev(OUT_A);OnFwd(OUT_C);
  
            } else if(SENSOR_1 > 46){
                OnRev(OUT_A);Off(OUT_C);
  
            } else if(SENSOR_1 > 40){
                OnRev(OUT_AC);ClearTimer(1);
  
            } else if(SENSOR_1 > 37){
                OnRev(OUT_C);Off(OUT_A);ClearTimer(1);
  
            } else{
                OnRev(OUT_C);OnFwd(OUT_A);ClearTimer(1);
  
              }
  
        }
         OnRev(OUT_A);OnFwd(OUT_C);Wait(80);
         OnRev(OUT_AC);Wait(150);
         Off(OUT_AC);Wait(100);
  
     /*   ボールをつかむ   */
         SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
         SetPower(OUT_B,1);OnRev(OUT_B);Wait(100);Off(OUT_B);
  
     /*   光センサーの値が50以上になるまで近づく   */
         OnFwd(OUT_A);OnRev(OUT_C);Wait(350);
         OnRev(OUT_AC);Wait(200);
  
         while(SENSOR_2 < 50){
              OnRev(OUT_AC);Wait(50);Off(OUT_AC);
              light();
         }
         PlaySound(SOUND_CLICK);
         light();
         OnRev(OUT_A);OnFwd(OUT_C);Wait(35);        //投げる方向の微調整
         Off(OUT_AC);Wait(100);
  
         SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
  
         OnFwd(OUT_AC);Wait(100);
         Off(OUT_AC);
}

プログラム-受け取り側-

大まかな流れとしてはまず、打ち出し側のロボットがボールを打ち出すまで停止させておく。その後ボールが打ち出されたら超音波センサーを使ってボールを見つけ、アームでつかみゴールまで運ぶ。受け取り側はこのようなプログラムになっている。

結果

結果としては1つ目のボールを缶に当てることはうまくいった。しかし2つ目のボールをつかみ運ぶ途中でボールを受け取るロボットと接触してしまった。連携がうまく取れなかったと感じた。 しかし接触がなければ近づいて投げるところまではできていたのがうれしかった。

問題点としてはアームを持ち上げるときにモーターを止めてしまうとアームが下がってきてしまうことだった。モーターを止めないのでずっと動いていることになってしまっていた。やはり重いのが原因だと思うが軽量化は難しかった。

今回のロボットは十分考えた末に出来上がったものであるがアーム部分をもう少し工夫できるかもしれなかった。だが動作の正確性は高いほうだったと思う。


添付ファイル: fileIMG_0804.JPG 113件 [詳細] fileIMG_0738.JPG 118件 [詳細] fileIMG_0735 - コピー.JPG 117件 [詳細] fileIMG_0735.JPG 61件 [詳細] file22015b-mission31.png 108件 [詳細] file2015b-mission31.png 66件 [詳細] file2015b-mission3.png 56件 [詳細]

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