*目次 [#o6391a41]
#contents
*課題について [#d4d18473]
課題3は超音波センサーを使ったロボットの製作。

半径1m以内にある空き缶を探し、25cmの距離からボールを転がしてそれにあてる。ただし、25cm以内に空き缶があるときは30cmまで離れること。
*ロボット本体について [#u3e5a9dd]
課題2では超音波センサーがついていなかったのでまずそれを取り付けた。なるべく位置がわかりやすく測れるように、超音波センサーはロボットの一番前に取り付けた。

モーターBCで進み、Aでアームの上げ下げを行う。

アームはロボットの正面につけた。モーターごとロボットの正面に取り付けた。上からアームを下してボールをつかむ。基本的な発想は課題2と同じであるが、ロボット本体の下側にもボールを固定するパーツがついているためアームのほうにはボールが後ろへ転がらないようにするパーツはついていない。また、今回はアームを下した状態でスタートするので、アームの上にセンサーを付けた。

また、ボールがまっすぐ転がるように、レールのような補助のパーツを付けることにした。とはいっても、ボールを固定しておくためにロボット本体の下側についているパーツを少し延長したようなものである。
*プログラムについて [#zfe7b45b]
**定義 [#db88cca1]
 #define SPEED 35
 #define shoot OnRev(OUT_BC,SPEED);Wait(1000);\
     OnRev(OUT_A,SPEED);Wait(500);\
     OnFwd(OUT_BC,SPEED1);Wait(500);
 #define pose Off(OUT_BC);Wait(200);
 
 int kyori=100;       //仮の距離の最小値
 long time=0;                 //ロボットの回転した角度を割り出すために使う。初期値を0にしておく
**空き缶を探す [#l5245601]
タイヤの半径やモーターを動かした角度から移動した位置を割り出すより、タイマーを使ったほうが簡単そうだったので、そちらを使うこととした。
 sub search(int runtime)
 {
     long t0=CurrentTick();                   //プログラムが始まった時間をt0とおく
     OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);   //ロボットを回転させる
     while(CurrentTick()-t0<runtime){
        if(SENSOR_4<kyori){                   //もし、kyoriよりも近くにものがあれば、
         kyori=SENSOR_4;                      //kyoriをより近いほうに書き換え、
         time=CurrentTick()-t0;               //timeをプログラムが始まってからその時の時間に書き換える
         }
      }
     pose;                                    //探し終わったら、わかりやすいように少し止まる
     OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);
     Wait(runtime-t0-time);                   //一番近くにあるものの位置まで戻る
     pose;
 }
**本文 [#mf4073ec]
 task main()
 {
     SetSensorLowspeed(S4);
     search(600);                   //空き缶を探す
  
      if(kyori>25){                //ifもし、空き缶が半径25cm以内にないなら
          OnFwd(OUT_B,SPEED);OnFwd(OUT_C,SPEED+2);
          until(SENSOR_4<=30);Off(OUT_BC);
          search(300);
          shoot;                   //25cmの位置からボールをあてる
          Off(OUT_BC);
      }else{                     //elseさもなくば=空き缶が半径25cm以内にあるとき
          OnRev(OUT_BC,SPEED);            //30cmまで離れてボールをあてる
          until(SENSOR_4>=30);
          shoot;
          Off(OUT_BC);
       }                                       //elseのかっことじ
 
 }                          //task mainのかっことじ

*感想 [#kbad753c]
今回はうまくsubを取り入れられた。少しだが、プログラムの軽量化ができてうれしかった。また、どこまでをsubの中に含めるかも重要だと分かった。defineにしてしまったほうがいい長さなど、実感できて面白かった。

ただし遠くにボールがあった時に、当たらないことを防ぐため、二度searchを使ったが、その時間を距離によって変えられればよりよくなると思う。現在は、空き缶が25cm以内になかったときは一律の時間でsearchを実行する。

ほかに、工夫した点としては、searchを流用できるように、回転の向きと反対に少し曲がるようにプログラムを組んだことである。昔読んだ、山道からの復帰の方法を参考にした。

やはり文字化けするようだ。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS