*課題 [#ja0fc808] #ref(2015a-mission2.png) 黒い線に沿って移動するロボットを製作した。 私はCからAに向かうコースを選んだ。 C地点からA地点へ (Q交差点では直進、P三叉路では右折) *ロボットの説明 [#u0efaa8d] #ref(robo.jpg) **概要 [#oa1e4b68] ロボットは、機体前部に光センサーとピン球保持アームを取り付けた。光センサーはできるだけ機体中央に位置するほうが位置ずれを抑えて小回りが効くが、左右の旋回でのライン前進を求めたために中央から遠い位置に設置した。 **アーム [#m6f348f7] #ref(arm.jpg) アームはモーター駆動で開閉するようになっている・しかし走行中の揺れやピン球の慣性でアームに当たるので次第にアームが開いていく欠陥がある。 *プログラム [#b892865b] ***定義 [#e9f16468] #define THRESHOLD 44 #define HIPOWER 5 // 直線用のパワー #define LOWPOWER 3 // カーブのパワー #define A_LOWPOWER 2 //アーム開閉のパワー #define A_set_power SetPower(OUT_B,A_LOWPOWER); #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_A);OnRev(OUT_C); #define turn_left1 set_power_L;\ OnRev(OUT_C); OnRev(OUT_A);//左折両輪 #define turn_left0 set_power_L;\ OnRev(OUT_C); Off(OUT_A);//左折片輪 #define turn_right0 set_power_L;\ OnFwd(OUT_A); Off(OUT_C);//右折片輪 #define turn_right1 set_power_L;\ OnFwd(OUT_A); OnFwd(OUT_C);//右折両輪 #define arm_hold A_set_power;\ OnFwd(OUT_B);//アーム閉じ #define arm_open A_set_power;\ OnRev(OUT_B);Wait(50);Off(OUT_B);//アーム解放 #define cross1 75 #define cross2 30 #define shoot_time 75 OnFwdやOnRevはロボットの配線によって片方のモーターの回転が逆になっている。そのためOnFwd(OUT_AC)で右折となる。 ***ライントレースのサブルーチン [#ee7d3229] sub line_trace() { if (SENSOR_2 < THRESHOLD -8) { turn_right1; // 右旋回 } else{if (SENSOR_2 < THRESHOLD +3) { go_forward; // 直進 } else{ turn_left1; // 左旋回 } ClearTimer(0); } Wait(1); } ライントレースはラインの右側を沿っていくようになっている。直進無い方が脱線なく走れるが、あまりにも遅いので付け足した。 ***メイン [#ndfe8402] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0) < 30) { line_trace(); } PlayTone(440,10);//一回目の交差点判定 Off(OUT_AC);Wait(50); turn_left1;Wait(cross2);//向きの修正 go_forward;Wait(cross1); arm_hold;//ピン球の保持 ClearTimer(0); while(FastTimer(0) < 30){ line_trace(); } PlayTone(440,10);//二回目の交差点判定 Off(OUT_AC);Wait(50); turn_right1;Wait(cross2);//右折 ClearTimer(0); while(FastTimer(0) < 30){ line_trace(); } PlayTone(440,10);//ゴール判定 Off(OUT_AC);Wait(50); arm_open; go_forward;Wait(shoot_time);//ボールをゴールにシュート } FastTimerで交差点を感知、それまでサブルーチンのライントレースを行う。最後にA地点の枠に交差点判定することでシュートに入る。アームが次第に開いていく欠陥については常時弱いパワーでアームを閉じることで対策した。 } FastTimerで黒の判定時間により交差点を感知、それまでサブルーチンのライントレースを行う。最後にA地点の枠に交差点判定することでシュートに入る。アームが次第に開いていく欠陥については常時弱いパワーでアームを閉じることで対策した。 *反省点 [#e433b9d5] PQ間のピン球の保持が難しい。これはピン球が同じ場所になかったり、ロボの振動で動くからだ。他にも、交差点の判定がうまくいかないことがあった。おそらく初期位置がずれていた為と思われる。 *感想 [#r20787bd] 定義付け、行動の略記ができたことや、基本的にライントレースが成功しているので微調整という作業ができたのがよかった。