- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015b/MemberOnly]]
*ボール打ち出しロボット [#ucbc2881]
**目的 [#gb654b97]
今回は2つのロボットを用いて一つがAから発進しボールをつかみ缶にあてる。もう一つがBから発進しそのボールを回収する、という課題だった。
今回は2つのロボットを用いて一つがAから発進しボールをつかみ缶にあてる。もう一つがBから発進しそのボールを回収する、という課題だった。コースは下の図である。
#ref(2015b/Member/nakamura/Mission3/2015b-mission3.png,50%,コース)
**ロボット本体 [#ib05a45e]
ロボット本体はライントレースができるようにドライブベースを使った。そしてボールをつかむ、なげる動作が必要なのでアームを付けた。
**プログラム [#ye1e08ae]
今回はモーターの配置の関係でモーターA,Cは「OnFwd」と入力すると逆回転してしまった。そこでプログラム上では前進するときは
最初に、今回はモーターの配置の関係でモーターA,Cは「OnFwd」と入力すると逆回転してしまった。そこでプログラム上では前進するときは
「OnRev(OUT_AC)」
と入力している。
***数値の定義づけ [#u298e3c4]
int light_max = 0; //光の一番大きい数値
int turn_time = 500; //光を探すために旋回する時間
int time_max = 0; //回り始めてから最大の明るさの値を見つけるまでの時間
int t = 0;
int s = 0;
***光の方向に向くサブルーチン [#cd0c2ced]
sub light(){
/* センサー1,2を光センサーに設定 */
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
/* 時間をはかりながら旋回 */
ClearTimer(0);
OnFwd(OUT_A);OnRev(OUT_C);
/* 光センサーが最も明るい値を示した時の旋回した時間を求める */
while(FastTimer(0) < turn_time){
if(SENSOR_2 > light_max){
light_max = SENSOR_2;
time_max = FastTimer(0);
}
}
Off(OUT_AC);Wait(100);
/* 光のほうへむける */
OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time - time_max);
Off(OUT_AC);Wait(100);
}
***メインプログラム [#j887c224]
まずは1つ目のボールについてのプログラム
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); //アームの持ち上げ
/* 1つ目のボールをつかみに行く */
OnRev(OUT_AC);Wait(200);
OnRev(OUT_A);OnFwd(OUT_C);Wait(100);
OnRev(OUT_AC);Wait(200);
Off(OUT_AC);Wait(100);
SetPower(OUT_B, 1);OnRev(OUT_B);Wait(100);
OnRev(OUT_C);OnFwd(OUT_A);Wait(150);
OnRev(OUT_AC);Wait(300);
/* 光の最大値が65以上になるまで光源に近づく */
while(light_max < 65){
OnRev(OUT_AC);Wait(50);Off(OUT_AC);
light();
}
PlaySound(SOUND_CLICK);
light(); //最後にもう1回光の方向を確認する
SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); //ボールを投げる
次に2つ目のボールについてのプログラム
/* 2つ目のボールをつかみに行く */
OnFwd(OUT_C);OnRev(OUT_A);Wait(150);
Off(OUT_AC);Wait(100);
OnRev(OUT_AC);Wait(200);
OnRev(OUT_AC);until(SENSOR_1 < 41);
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100); //黒線まで進む
/* 角を認識してボールへ近づく */
ClearTimer(1);
while(FastTimer(1) < 50){
if(SENSOR_1 > 49){
OnRev(OUT_A);OnFwd(OUT_C);
} else if(SENSOR_1 > 46){
OnRev(OUT_A);Off(OUT_C);
} else if(SENSOR_1 > 40){
OnRev(OUT_AC);ClearTimer(1);
} else if(SENSOR_1 > 37){
OnRev(OUT_C);Off(OUT_A);ClearTimer(1);
} else{
OnRev(OUT_C);OnFwd(OUT_A);ClearTimer(1);
}
}
OnRev(OUT_A);OnFwd(OUT_C);Wait(80);
OnRev(OUT_AC);Wait(150);
Off(OUT_AC);Wait(100);
/* ボールをつかむ */
SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
SetPower(OUT_B,1);OnRev(OUT_B);Wait(100);Off(OUT_B);
/* 光センサーの値が50以上になるまで近づく */
OnFwd(OUT_A);OnRev(OUT_C);Wait(350);
OnRev(OUT_AC);Wait(200);
while(SENSOR_2 < 50){
OnRev(OUT_AC);Wait(50);Off(OUT_AC);
light();
}
PlaySound(SOUND_CLICK);
light();
OnRev(OUT_A);OnFwd(OUT_C);Wait(35); //投げる方向の微調整
Off(OUT_AC);Wait(100);
SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
OnFwd(OUT_AC);Wait(100);
Off(OUT_AC);
}
**結果 [#z7856c00]
結果としては1つ目のボールを缶に当てることはうまくいった。しかし2つ目のボールをつかみ運ぶ途中でボールを受け取るロボットと連携がうまくいかず接触してしまった。