[[2015b/MemberOnly]] *ボール打ち出しロボット [#ucbc2881] **目的 [#gb654b97] 今回は2つのロボットを用いて一つがAから発進しボールをつかみ缶にあてる。もう一つがBから発進しそのボールを回収する、という課題だった。 #ref(2015b/Member/nakamura/Mission3/2015b-mission3.png,50%,コース) **ロボット本体 [#ib05a45e] ロボット本体はライントレースができるようにドライブベースを使った。そしてボールをつかむ、なげる動作が必要なのでアームを付けた。 **プログラム [#ye1e08ae] 今回はモーターの配置の関係でモーター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つ目のボールをつかみ運ぶ途中でボールを受け取るロボットと連携がうまくいかず接触してしまった。