*目次 [#cd996728]
#contents

*課題の説明 [#e7d1f95d]
半径1m以内にある空き缶を探し、25cmの距離からボールを空き缶に当てるロボットを作成せよ。~
ただし最初に空き缶が25cm以内の距離にある場合は、30cmまで離れてボールを当てよ。

*ロボットの説明 [#m8e08e9b]
**本体 [#k95eb888]
&ref(./写真 2 (1).JPG,20%);

これが今回私たちのチームが制作したロボットである。~
アームでボールを囲み、空き缶の前まで運ぶ。
**アーム [#tf32c8b8]
***アーム1 [#l46722a4]
&ref(./image.jpeg,13%);

本体の下部にあり、ボールが外に出ないようにする役割をもつ。~
***アーム2 [#i6257fa7]
&ref(./写真 4.JPG,15%);

本体の上部にある。~
ボールを囲み、空き缶の手前まで運ぶためのもの。~
空き缶にボールを当てるときに開く。
*コンセプト [#xa432ce3]
&ref(./NX.png,50%);

まず超音波センサーで周囲360°をサーチし、最短距離にあるものの場所を記録しておく。~
サーチ終了後最短距離にあるものの方向を向き、距離に応じて移動する。~
最後にシュートして終了する。

*プログラム [#k483a0ef]
プログラムは以下の通りである。~
今回は配布資料と課題2を参考に、少し手を加えた。

***マクロ [#ebc1f78f]
 #define speed 50
 #define speed_slow 30
 #define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(300);//アーム2を下げる
 #define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300);  //アーム2を上げる
 #define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500);\
  up;OnFwd(OUT_BC,80);Wait(300);Off(OUT_BC);                 //ボールを発射する
 
***サブルーチン・関数 [#b9609457]
 const float diameter = 5.45;//タイヤの直径
 const float track = 12.35; //タイヤ間の距離
 const float pi = 3.1415;//π
 
 void fwdDist(float d)//引数dの分だけ前進
 {
  long angle;
  angle = d/(diameter*pi)*360.0;//d進むために必要な数angleを計算
  RotateMotorEx(OUT_BC,speed_slow,angle,0,true,true);//左右のタイヤを同期させてより正確に前進
 } 
 
 int searchDirection(long ang)//最も近い物体を探す
 {
  long angle,tacho_min=0;
  int d_min;
 
  d_min=300;//仮の最小値を設定
  
  angle = (track/diameter)*ang; //引数からモーターの回転角度を計算
  ResetTachoCount(OUT_BC); //角度のカウントをリセット
 
  while(MotorTachoCount(OUT_B)<=angle)//angの範囲内での最小値の探索
  {
   RotateMotorEx(OUT_BC,speed_slow,1,-100,true,true);//1°左旋回
   if(SensorUS(S1)<d_min)//それまでの最小値より近いなら
   {
   d_min=SensorUS(S1);//最小値を更新
   tacho_min=MotorTachoCount(OUT_B);//最小値を記録した位置を記憶しておく
   }
  }
  RotateMotorEx(OUT_BC,speed_slow,angle-tacho_min,100,true,true);//最も近い物体の方を向く
  return d_min;//最小値を返す
 }

***メイン [#g843a410]

 task main()
 { 
  SetSensorLowspeed(S1);//超音波センサ
  int d=searchDirection(360);
  
  if(d>25)//物体が25cmより離れた距離にある場合
  {
   fwdDist(d-25.0);//25cm手前まで移動;
  }
  if(d<=25)//物体が25cm以内の距離にある場合
  {
   fwdDist(d-30.0);//30cm手前まで移動;
  }
  goal;
 }
*結果 [#z5f77ff6]
無事に空き缶にボールを当てることができた。

*苦労したところ・反省点 [#r62b91e7]
**苦労したこと [#m5964f10]
配布資料に書いていないものが使われていたため、サンプルプログラムの理解に苦労した。~
今回はサンプルプログラムが配布されたため、プログラミングにはそこまで苦労はなかった。~
またロボットについても課題2のものを流用しているため、特に苦労はなかった。
**反省点 [#o162d167]
ロボットの重心がかなり前にあるのだが、時間に追われて改善できなかった。~
プログラミングについては、サンプルプログラムをベースにしているためほとんど個性が出せなかった。


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