[[2015a/Member]] *ライントレース (A→Bコース) [#q8098b7b] **はじめに [#nb533e1c] このページは2015年ロボティックス前期課題2のライントレースA→Bを説明するページである。 ライントレースとは黒く塗られた道をロボットの光センサーを利用して道なりに進ませるものである。 光センサーに閾値を設定してあげることによってロボットに黒か白か判断させることが可能となり、ライントレースが行える。 **ロボットの説明 [#z2cafbc6] 全体図 #ref(1437009372175.jpg,,30%) 先端部(上) #ref(1437009370384.jpg,,30%) 全体図(下) #ref(1437009368119.jpg,,30%) 裏側の青い部分が光センサーである。 中心より少しずらすことによって少しでも曲がれば光センサーの位置も真下から見るとずれるように設計されている。先端にアームをつけることで球を挟んで勝手に転がりださないようになっている。 シュートするときはアームとシュートする棒が連動しているので開けば自動的にシュートできるようになっている。 **プログラミング [#y196f944] #define THRESHOLD 44 #define HIPOWER 6 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L;\ OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 set_power_L;\ OnFwd(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); OnRev(OUT_C); #define STEP 1 #define short_break Off(OUT_AC); Wait(10); #define MAX 10 #define CLOSE OnRev(OUT_B); Wait(5); #define OPEN OnFwd(OUT_B); Wait(5); task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int count=0; int count_2=0; while(true){ while(count < MAX) { if (SENSOR_2 < THRESHOLD -4) { turn_left1; count++; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward; } else if (SENSOR_2 < THRESHOLD +4) { turn_right0; count=0; } else { turn_right1; } Wait(STEP); } count_2++; if(count_2 == 1){ short_break; CLOSE; turn_right1; Wait(MAX*STEP); count=0;} if(count_2 == 2){ short_break; turn_right1; Wait(MAX*STEP); count=0; go_forward; Wait(30); turn_right1; Wait(MAX*STEP);} if(count_2 == 3){ short_break; turn_right1; Wait(MAX*STEP); OPEN;} } } **プログラミングの説明 [#r281cbb1] #define THRESHOLD 44 しきい値の設定 #define HIPOWER 6 #define LOWPOWER 2 ギアのスピードの設定 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L;\ OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 set_power_L;\ OnFwd(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); OnRev(OUT_C); 直進、左折、右折などのもろもろの設定 #define STEP 1 判断する間隔0.1sの設定 #define short_break Off(OUT_AC); Wait(10); 小休止 #define MAX 10 10回左折し続ける時をMAXとおく #define CLOSE OnRev(OUT_B); Wait(5); #define OPEN OnFwd(OUT_B); Wait(5); ボールを回収、シュートするための開閉を設定 task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int count=0; int count_2=0; 光センサーを設定し、countは左に曲がろうとした回数、count_2は交差点に差し掛かった回数 while(true){ while(count < MAX) { if (SENSOR_2 < THRESHOLD -4) { turn_left1; count++; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward; } else if (SENSOR_2 < THRESHOLD +4) { turn_right0; count=0; } else { turn_right1; } Wait(STEP); } 黒線の左側をトレースするプログラム左折することを計10回するまで行う count_2++; 交差点を判断したということで回数をプラス一回する if(count_2 == 1){ short_break; CLOSE; turn_right1; Wait(MAX*STEP); count=0;} 交差点1回目はボールをつかみ、左折した時間だけ右折させる if(count_2 == 2){ short_break; turn_right1; Wait(MAX*STEP); count=0; go_forward(30); Wait(30); turn_right1; Wait(MAX*STEP);} 交差点2回目は左折した時間だけ右折させ、その直線上にある突き当りまで進み左折する if(count_2 == 3){ short_break; turn_right1; Wait(MAX*STEP); OPEN;} } } 交差点3回目は左折した時間だけ右折してそのあとシュートする **おわりに [#pbd9c5e7] 黒線の上では左車輪も右車輪もlowパワーだったので、交差点をらくらく通過できたのがよかった。 左折をし続けると交差点と判断するようにプログラミングを書いた。 直角のところで左に曲がって戻ってしまうので苦戦したが、2回目の左折の後そのままそこもこなすことで通過した。 シュートは手前で左折するので交差点と判断するはずなのでそれを利用してシュートした。