#contents
*課題 [#d9a8f66f]
半径1m以内にある空き缶を探して、25cmの距離からボールを転がしてその空き缶に当てるロボットを製作しなさい。ただし25cm以内に空き缶がある場合には、30cmまで離れること。
*ロボットの説明、アームの動かし方 [#afe91d8e]
#ref(./DSC_0014~2.jpg) 
#ref(./DSC_0017~2.jpg)
ロボット本体は課題2のロボットに超音波センサを取り付けただけである。また、課題2と同じでアームを上下に動かし、光センサと横につけたブロックの間にボールを入れアームを上からかぶせるようにして、ボールを運ぶようにした。そして、空き缶に当てるときはアームを上に上げてロボットを前進させることでロボット本体がボールにぶつかり、ボールが前に転がるようにした。
*プログラムの説明 [#cbe5b999]
 #define SPEED 50         //   高速
 #define SPEED_SLOW 30       //   低速
 #define go_forward OnFwd(OUT_BC,100);Wait(500);Off(OUT_BC);       //   直進
 #define arm_up OnRev(OUT_A,100);Wait(500);Off(OUT_A);         //   アームを上げる 
 const float diameter = 5.45;          //   タイヤの直径
 const float track = 10.35;         //   タイヤのトレッド幅
 const float pi = 3.1415;        //   円周率
 void fwdDist(float d)      //   距離 d �� 前進
 {
     long angle;
     angle = d/(diameter*pi)*360.0;          //   角度を計算する
     RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, true);
 }
 void turnAng(long ang)        //   角度 ang 度の時計回りの旋回
 { 
     long angle;
     angle = track/diameter * ang;
     RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, true);
 }
 int serchDirection(long ang)            //   現在の方向を中心にang度の範囲で探し
 {                                       //   障害物までの距離を返す
     long angle,tacho_min=0, tacho_corr ;
     int d_min;
     d_min=300;            //   仮の最小値
     angle = (track/diameter)*ang;                //   旋回角度からタイヤの回転を計算
     turnAng(ang/2);                      //   指定された角度の半分を旋回
     ResetTachoCount(OUT_BC);                //    角度計測をリセット
     OnFwdSync(OUT_BC,SPEED_SLOW,-100);                //   
     OnFwdSync(OUT_BC,SPEED_SLOW,-100);                //   反時計回りに旋回
     while(MotorTachoCount(OUT_B)<=angle){
         if (SensorUS(S1)<d_min){
            d_min=SensorUS(S1);                //    仮の最小値を更新
            tacho_min=MotorTachoCount(OUT_B);
          }
     }
     OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
     until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d_min);
     Wait(14);               //   微調整
     Off(OUT_BC);Wait(500);
     return d_min;
 }
 task main()
 {
     SetSensorLowspeed(S1);                           
      //   缶の方向を探した後、近づいて35�兌蠢阿把篁漾               �
     int d = serchDirection(360);   
     if (d > 35) {            
         fwdDist(d-35.0);                    
      }                                          
      //  ボールを発射                                   
       arm_up;       
      go_forward;   
 }                    
*工夫したところ [#z40a8a83]
初め、缶にボールを当てるために缶の25�兌蠢阿妊蹈椒奪箸鯆篁澆気擦董△修海�らボールを発射させていたが、ボールを発射する位置が缶にすごく近くなってしまったので、停止する位置を35�兌蠢阿砲靴燭箸海蹇■横記儖幣緡イ譴謄棔璽襪鯣�射することができ缶にボールを当てることができた。また、ロボット本体ををできるだけシンプルにすることで空き缶を探すときに回転しやすくなりボールを持ったままの動きもスムーズになった。そして、課題2ではシュートの時にアームを上げて、後退してからアームを下げ、前進するようにしていたがそれではボールがシュートをする前に転がってしまい上手くシュートすることができなかったので、今回はアームを上げてすぐそのまま前進するようにしたところ上手くシュートすることができた。
*反省点 [#o31780b0]
今回の課題は、「半径1m以内にある空き缶を探して、25cmの距離からボールを転がしてその空き缶に当てるロボットを製作しなさい。ただし25cm以内に空き缶がある場合には、30cmまで離れること。」ということだったが、「25cm以内に空き缶がある場合には、30cmまで離れること」というプログラムを加え忘れてしまったことである。

*感想 [#l724f140]
今回の課題は、サンプルプログラムが配布されていたので、プログラミングに関してはそのプログラムを少し変えただけで動かすことができたのでそれほど苦労することはなかった。また、ロボットも課題2のロボットに超音波センサを取り付けるだけだったのでスムーズに作業することができた。しかし、配布されたプログラムが難しく、理解するのにかなり苦労した。また、今回は配布されたプログラムを少し変えただけなので、今度やるときは、自分でプログラミングして、ロボットを動かしたい。そして、課題に取り組むときは、しっかりと文を読み、間違いが無いように取り組みたい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS