- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#cd996728]
#contents
*課題の説明 [#e7d1f95d]
***条件 [#s21d30c7]
半径1m以内にある空き缶を探し、25cmの距離からボールを空き缶に当てるロボットを作成せよ。~
ただし最初に空き缶が25cm以内の距離にある場合は、30cmまで離れてボールを当てよ。
*ロボットの説明 [#m8e08e9b]
**本体 [#k95eb888]
&ref(./image[2].jpeg,20%);
&ref(./写真 2 (1).JPG,20%);
これが今回私たちのチームが制作したロボットである。
アームでボールを囲み、ゴールまで運ぶ。
これが今回私たちのチームが制作したロボットである。~
アームでボールを囲み、空き缶の前まで運ぶ。
**アーム [#tf32c8b8]
***アーム1 [#l46722a4]
&ref(./image.jpeg,13%);
本体の下部にあり、ボールをキャッチし外に出ないようにする役割をもつ。
本体の下部にあり、ボールが外に出ないようにする役割をもつ。~
***アーム2 [#i6257fa7]
&ref(./image[6].jpeg,15%);
&ref(./写真 4.JPG,15%);
本体の上部にあり、最初は開いている。
本体の上部にある。~
ボールを囲み、空き缶の手前まで運ぶためのもの。~
空き缶にボールを当てるときに開く。
*コンセプト [#xa432ce3]
&ref(./NX.png,50%);
ボールが射程範囲に入るころに閉じ、ゴールまで運べるようにプログラムしてある。
まず超音波センサーで周囲360°をサーチし、最短距離にあるものの場所を記録しておく。~
サーチ終了後最短距離にあるものの方向を向き、距離に応じて移動する。~
最後にシュートして終了する。
シュートのときは再度開く。
*コンセプト [#xa432ce3]
*プログラム [#k483a0ef]
プログラムは以下の通りである。~
今回は配布資料と課題2を参考に、少し手を加えた。
シュートはアーム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;//最小値を返す
}
*プログラム [#k483a0ef]
**マクロ [#d86bc84c]
**サブルーチン [#s4b3bb30]
**メイン [#fffc3410]
***メイン [#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]
*感想 [#h90db6ee]
ロボットの重心がかなり前にあるのだが、時間に追われて改善できなかった。~
プログラミングについては、サンプルプログラムをベースにしているためほとんど個性が出せなかった。