歯車を多用することにより、回転扉式のアームを製作。 青の矢印方向にアームを回すと、外側から回り込んで玉を前へ押し出す。 赤の矢印方向にアームを回すと、内側から回り込んで、玉を捕獲する。
今回は、2本のバーがコースに設けられており、回転式のいアームが邪魔になりやすい。 そこで赤い線で示したように、アームを車体の中心にずらした。
試行の過程で、ライトセンサーの反応を高くするためには車輪の対角線上の近くにもってくることが良いことがわかった。
#define THRESHOLD 47 #define SPEED_H 50 #define SPEED_L 30 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); #define turn_left1 OnRL(SPEED_L,-SPEED_L); //左旋回 #define turn_left0 OnRL(SPEED_L,0); //左折 #define turn_right0 OnRL(0,SPEED_L); //右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L); //右旋回 #define STEP 1 //1回の判断で動作させる時間 #define nMAX 250 //通常のカーブとして許容できる繰り返しの最大値(調整する) #define short_break Off(OUT_BC); Wait(100); //小休止 #define CROSS_TIME 600 //交差点通過にかかる時間 /*交差点を渡る*/ #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; #define short_back OnRL(-SPEED_L,-SPEED_L);Wait(CROSS_TIME);short_break; #define ball_catch OnFwd(OUT_A,-40);Wait(500); #define shoot_ball OnFwd(OUT_A,70);Wait(1);
↑各々の行動を定義
task main() { SetSensorLight(S3); int nOnline=0; //続けて黒になった回数(カウンタ) int n1nline=0; // 交差点を渡った回数 long startTime; long cross1Time; startTime = CurrentTick(); //測る直前の時刻をlong型変数t0に代入 go_forward //ボールのある位置まで進む Wait(500); Off(OUT_BC); ball_catch; //ボールをキャッチ Off(OUT_A); go_forward; Wait(100); turn_right0;Wait(1500); //ラインに移る Off(OUT_BC);
↑ボールをアームでつかんで黒線に移るまで
while (n1nline< 2){ /*黒を続けてnMAX回繰り替えさない間、通常のライトレースをする*/ while(CurrentTick() - startTime < 12000){ //12秒間交差点無視 if (SENSOR_3 < THRESHOLD-12) { turn_left1; } else { if (SENSOR_3 < THRESHOLD-7){ turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } nOnline=0; } Wait(STEP); } nOnline=0; while ((nOnline < nMAX)&&(n1nline < 1)){ if (SENSOR_3 < THRESHOLD-12) { turn_left1; nOnline++; //カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } nOnline=0; //カウンタリセット } Wait(STEP); } short_break; // 小休止 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; //交差点を渡る n1nline++; //交差点一回目 nOnline=0; //カウンタをリセット cross1Time = CurrentTick(); while (CurrentTick() - cross1Time < 16000) { if (SENSOR_3 < THRESHOLD -12) { turn_left1; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { } else { turn_right1; } nOnline=0; //カウンタをリセット } Wait(STEP); } while (nOnline < nMAX){ if (SENSOR_3 < THRESHOLD-12) { turn_left1; nOnline++; //カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7){ go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る n1nline++; nOnline=0; // カウンタをリセット
↑黒線の左境界をトレースして、シュートに移るまで
if(n1nline == 2){short_break; short_back; shoot_ball; Off(OUT_BC); } } }
↑ボールをシュートしてライトレース終了
ロボットの機構自体はイメージ通りの機構となって、製作する分には苦とはならなかった。今でも様々なピン球を掴んではじき出す機構が頭の中に湧いてきて、様々な形に作り替えてみたいほどである。一方、プログラミングに関しては思ったとおりにロボットが動いてくれず試行錯誤に苦労し相方なしでは完成には程遠かったと思える。ライトレースを完璧にこなすロボットを作り上げた時の相方との喜びを忘れない。少しずつ自分の将来就くであろう仕事のイメージ像が沸いてきた。大学人生の僅かな時間をロボット製作に割く必要が自分にあることがわかって良かった。次のロボット製作では、全体の設計を企ててから取り組みたいと考える。