#contents *コース [#l5e827a1] トレースするコースは、C地点を出発地点とし、そこから十字路をまっすぐ進み、三叉路を右に曲がってゴール地点であるA地点まで行く、というのである。 #ref(./2015a-mission2.png,50%) *プログラム [#l46bf864] **定義 [#wc1fa39e] 今回は繊細な動きが出来るように細かく定義をした。 #define THRESHOLD 45 //しきい値 #define SPEED0 25 #define SPEED1 20 #define OnRL(r,l) OnFwd(OUT_B,r);OnFwd(OUT_C,l); #define GO_STR OnRL(SPEED0,SPEED0); //直進 #define LEFT1 OnRL(SPEED1,-SPEED1); // 左旋回 #define LEFT0 OnRL(SPEED1,0); // 左折 #define RIGHT0 OnRL(0,SPEED1); // 右折 #define RIGHT1 OnRL(-SPEED1,SPEED1); //右旋回 #define short_break Off(OUT_BC);Wait(2000); // 小休止 #define time_cross 150 #define cross_line OnRL(10,SPEED0);Wait(time_cross);short_break; //交差点を渡る #define cross_line2 OnRL(SPEED0,10);wait(time_cross);short_break; //三叉路を渡る #define arm_close(t) OnRev(OUT_A,30);Wait(t); //アームを閉じる #define FinCurve 18324 #define Shoot Off(OUT_BC);Wait(500);OnRev(OUT_BC,30);Wait(1000);Off(OUT_BC);OnFwd(OUT_A,50);Wait(200);OnFwd(OUT_BC,50);Wait(500);Off(OUT_BC); //ボールをシュートする 今回は、速度が速いとカーブがうまく曲がれなかったり、大きく脱線してしまう事が多々あったため、速度は遅めに設定してある。 **本体のプログラム [#raa49e0a] カウンターやタイマー、論理式を用いて構成されている。又、3分割されているプログラムはカウンターが1増加するごとに実行され、交差点、三叉路の時に黒線を認識してカウントするように設定した。ちなみに3分割されているコースは、C地点から十字路前、十字路から三叉路、三叉路からA地点である。 *BLACK_line == 0の時 [#ja64ab75] これはC地点から十字路までのプログラムで、タイマーを用いてC地点から十字路手前の直線までカウンターが起動しないようにしてある。 ちなみにカウンターは、しきい値より15小さい30という値になった時に設定した。 task main() { SetSensorLight(S3); int BLACK_line=0; long t0=CurrentTick(); while(CurrentTick()-t0 <= FinCurve){ //C地点から十字路までで、タイマーを用いてカウンターが起動しないいようにしてある。こうする事で急カーブを十字路と判断しないようにした。 while (BLACK_line == 0){ //カウンターが0の時 if (SENSOR_3 < THRESHOLD-11) { RIGHT1; } else if (SENSOR_3 < THRESHOLD-7) { RIGHT0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { LEFT0; } else { LEFT1; } } } while (ClearTimer()-t0 >= FinCurve){ //ここからタイマーによってカウンターがプラスされない状況が終わり、いつでもカウンターが作動できる状態になっている while(BLACK_line == 0){ if(SENSOR_3 < THRESHILD-15) { PlaySound(SOUND_UP); //交差点を認識すると音がなる Wait(2000); short_break; //小休憩 arm_close(3000); //アームを閉じる cross_line; //交差点をわたる BLACK_line++; //交差点をわたる際にカウンターがプラス1されて、BLACK_line == 1のプログラムへ移行する } else if (SENSOR_3 < THRESHOLD-11) { RIGHT1; } else if (SENSOR_3 < THRESHOLD-7) { RIGHT0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { LEFT0; } else { LEFT1; } Wait(STEP); } } *BLACK_line == 1の時 [#d9a9d689] ここは十字路から三叉路までのプログラムである。交差点を認識後、アームを閉じてボールを確保し交差点を横断する。ここで、交差点を渡るとトレースしていたラインのサイドが逆転するため、ライントレースのプログラムを先ほどのものの右折と左折を入れ替えた。その後、三叉路でカウンターがプラス1されるまでライントレースを継続する。 while(BLACK_line == 1){ //カウンターが1の時 if(SENSOR_3 < THRESHILD-15) { PlaySound(SOUND_UP); PlaySound(SOUND_UP); //三叉路を認識すると音がなる Wait(2000); short_break; arm_close(3000); arm_close(3000); //アームを閉じてボールを捕獲 cross_line; BLACK_line++; BLACK_line++; //カウンターがプラス1され、BLACK_line == 2のプログラムへ移行 } else if (SENSOR_3 < THRESHOLD-11) { RIGHT1; LEFT1; } else if (SENSOR_3 < THRESHOLD-7) { RIGHT0; LEFT0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { LEFT0; RIGHT0; } else { LEFT1; RIGHT1; } Wait(STEP); } *BLACK_line == 2の時 [#fec16037] 三叉路からゴールまでのプログラムで、ゴールのラインを認識するとシュートするようにした。 while(BLACK_line == 2){ if(SENSOR_3 < THRESHILD-15) { Shoot; Shoot; //光センサーの値が一定値以下になるとシュートする } else if (SENSOR_3 < THRESHOLD-11) { RIGHT1; } else if (SENSOR_3 < THRESHOLD-7) { RIGHT0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { LEFT0; } else { LEFT1; } Wait(STEP); } *ロボットについて [#r7b9f2f1] **母機について [#pab89817] ロボットがこの形になるまでに様々な試作機を製作した。特に苦労したのは、アームの機構が決まった後に本体とどのように組み合わせるかであった。 ***光センサー [#i5cab541] この機体は光センサーを2つの前輪の間に設置してある。ここで、機体と光センサーの距離が離れてしまうとヘアピンカーブのような急カーブを認識するのが難しくなり、曲がる際にこまめに旋回のプログラムをいれなければならなくなってしまう。なので、可能な限りこの距離が短くなるように設置した。 この写真はロボットを下から撮ったものである。 真ん中のライトが付いたようなパーツが光センサーである。 #ref(./IMG_2903.JPG,25%) ***後輪 [#c237c719] 前輪はモーターが直接ついており、後輪はその補助輪としての役割を担っている。この時、後輪は柔軟性の優れた動きができるように、360度回転できるような機構を取っている。しかし、この機構は重さに耐性がない事が欠点である。今回のロボットは、パーツの中で最も重量のある本体(ロボットのコンピューター)が、設計上後輪の真上に来てしまっている。これにより、後輪は少し曲がってしまっている。上の写真は後輪で、下の写真はロボットである。 この写真からよく分かるように、本体が後輪の真上にある。 &ref(./IMG_2904.JPG,25%);&ref(./IMG_2869.JPG,12%); *アームについて [#af4b8b0b] 今回ボールをつかむ上で様々な機構のアームを考えた。そして結論として、クワガタの様に両側から囲むようなものになった。アームが閉じる機構は、前輪モーターの上にもう一つアームを閉じさせる為のモーターを設置する。そして、パーツをいくつか使用し、モーターの動きが前輪と同じ高さまで下げたアームに連動する様に調節した。 #ref(./IMG_2875.JPG,12%) *今回の課題に対する感想・反省点 [#za981e89] 正直なところ、ライントレースロボットの製作は書道ロボットよりも難しくはなかった。しかし、プログラムについては今回の方が遥かに難易度が高かった。論理式やカウンター、タイマーに関する習熟度が低かったため、思った通りの動きが出来なかったり、プログラムの不備が見抜けないために何時間もプログラムの転送に時間を費やしてしまった。次回からは、このような事が少なくなるように、よりプログラムを理解したいと思った。