[[2015a/MemberOnly]]
**はじめに [#k52e254b]
今回は先生からいただいたプログラムをもとに、缶の位置を探しながらボールを運び25兌蠢阿妊棔璽襪鯲イ郡未砲屬弔韻襪箸いΣ歛蠅鬚靴泙靴拭
**ロボット本体の説明 [#ra4535b2]
今回は課題2で使用したロボットを主体としてそれに赤外線センサーを周りを見渡しやすいロボの上に取り付けました。
&ref(./1438255748799[1].jpg,,30%);
&ref(./1438255744666[1].jpg,,30%);
&ref(./1438255746328[1].jpg,,30%);
**プログラムの説明 [#m117015b]
#define SPEED 50
#define SPEED_SLOW 30
#define shoot OnRev(OUT_A,10);Wait(500);OnFwd(OUT_BC,SPEED);Wait(1000);//シュートの動きを定義しました。

const float diameter=5.45;//タイヤの直径」
const float track=10.35;//タイヤのトレッド幅
const float pi=3.1415;//円周率

void fwdDist(float d)
{
    long angle;
    angle=d/(diameter*pi)*360.0;//角度を計算する
    RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
  }
 void turnAng(long ang)//角度ang度の時計周りの旋回
 {
  long angle;
  angle=track/diameter*ang;
  RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
}
  int searchDirection(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);//反時計回りに旋回
  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);
//缶を探した後、25兌蠢阿把篁

  int d = searchDirection(120);
  if (d > 25){
      fwdDist(d-25.0);
   shoot;//シュートの動きする
   }
}
**シュートの動き [#z4b6a136]
ボールを止めているストッパーを外しロボットを前進させ止めることによってボールだけが慣性の法則に従ってまえに進み缶にぶつかるようにしました。
&ref(./1438255742597[1].jpg,,30%);
**反省点 [#s069b64e]
時間が少し少なかったのでプログラムがあまり工夫できず、さらにボールが真っ直ぐに進むようにもう少し勢いのあるシュートかんがえていきたいです。

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