*ロボットの紹介 [#de0a99bc] はじめは三輪で小回りの聞くロボットを作ろうと考えましたが、安定性と高さを考慮してコンパクトな四輪にしました。~ コンパクトながらも安定感が欲しかったので、車軸を支える点を一輪につき二箇所にしてより強固にしました。~ その結果車軸周りの重さが増して、重心が低く安定感のあるロボットになりました。~ 鋏の部分は鋏自体を大きく広くすることで挟みやすく外れにくい構造に仕上がりました。~ また、うまく鋏同士が噛みあうようにしたので、持った時の安定感がより増しました。~ ただ、鋏部分と本体部分の接続が弱いので簡単に壊れてしまうのが欠点です。~ タッチセンサー部分は説明書の完成品を参考に作りました。~ 軽い缶にも反応するようにできたと思います。~ *コース攻略 [#leb8b290] **時計回り [#d8cb9e2c] +はじめの角を交差点と誤認識して逆方向に曲がってしまうので、本当の交差点に差し掛かるまでは交差点無しのライントレースをするように時間で管理する。 +円に差し掛かったら交差点有りのライントレースに直し、4つの交差点を越える。 +交差点が終わったらまた交差点無しのライントレースに戻し、時間での管理で缶を離す。 +そのまま交差点無しのライントレースでゴールする。 **反時計回り [#r05fb3ab] +基本的に時計回りの逆をたどるだけ。 +時間を細かく見る。 *プログラム [#h30b0a79] #define BLACK1 38 #define BLACK2 42 #define WHITE1 45 #define WHITE2 49 #define HIPOWER 7 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_fwd set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C); #define turn_right1 set_power_L; OnFwd(OUT_A); Off(OUT_C); #define turn_left2 set_power_H; OnRev(OUT_A); OnFwd(OUT_C); #define turn_right2 set_power_H; OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define nMAX 2 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 30 #define cross_line set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; #define time1 1600 #define time2 3400 #define time3 4600 #define time4 5400 #define time5 ↑明るさなどの定数や右に曲がるなどの一連の動きを定義する task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); int nOnline=0; ClearTimer(0); if(SENSOR_2 == 0) { OnRev(OUT_B); } while(FastTimer(0) <= time1){ if(SENSOR_2 == 1){ OnFwd(OUT_B); } if(SENSOR_1 < BLACK1) { turn_left2; } else if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } Wait(STEP); } ↑交差点の前まではただのライントレース PlaySound(SOUND_LOW_BEEP); while(FastTimer(0) > time1) { while(FastTimer(0) <= time2) { while(nOnline < nMAX){ if(SENSOR_1 < BLACK1) { turn_left2; nOnline++; } else { if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } nOnline=0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; turn_right1; Wait(nMAX*STEP); cross_line; nOnline=0; } } ↑交差点を三つこえる PlaySound(SOUND_LOW_BEEP); while(FastTimer(0) > time2) { while(FastTimer(0) <= time3) { while(nOnline < nMAX) { if(SENSOR_1 < BLACK1) { turn_left2; } else if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } Wait(STEP); } ↑ここは輪の内側なので間違えて交差点と認識して一回転しないようにただのライントレースに直す PlaySound(SOUND_LOW_BEEP); while(FastTimer(0) > time3) { while(FastTimer(0) <= time4) { while(nOnline < nMAX){ if(SENSOR_1 < BLACK1) { turn_left2; nOnline++; } else { if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } nOnline=0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; turn_right1; Wait(nMAX*STEP); cross_line; nOnline=0; } } ↑再び交差点ありに直す PlaySound(SOUND_LOW_BEEP); while(FastTimer(0) > time4) { while(FastTimer(0) <= time5) { while(nOnline < nMAX) { if(SENSOR_1 < BLACK1) { turn_left2; } else if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } Wait(STEP); } ↑ただのライントレース PlaySound(SOUND_LOW_BEEP); Off(OUT_AC); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(150); Off(OUT_AC); OnRev(OUT_B); OnRev(OUT_AC); Wait(200); OnFwd(OUT_A); OnRev(OUT_C); Wait(150); ↑缶を置く while(true){ if(SENSOR_1 < BLACK1) { turn_left2; } else if (SENSOR_1 < BLACK2) { turn_left1; } else if (SENSOR_1 < WHITE1) { go_fwd; } else if (SENSOR_1 < WHITE2) { turn_right1; } else { turn_right2; } Wait(STEP); } } } ↑ゴールする *苦労した点 [#z6491a08] -輪の内側を走る際に交差点と認識して一回転してしまうことが多かった。 -缶が軽いのでタッチセンサーがなかなか反応しなかった。