[[2018a/Member]] #contents * 課題[#w3f30b24] **ライントレースロボットの製作 [#v30a912c] 幅2ミリの黒線をトレースするロボットを作る **以下のコースを進み,課題を達成させる [#u99b98ee] #ref(./コース.png,70%,コース) 1. Aをスタート 2. Bを直進 3. Cで一時停止の後、直進 4. Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る 5. DからEに向かい、Eを直進 6. Fを左折 7. Gで一時停止の後、左折 8. Hで一時停止の後、右折 9. Iで一時停止の後、右折 10. Lを直進 11. Kを直進 12. Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう 13. Bで一時停止の後、左折 14. Aで停止 (一時停止の指定がある場所は、1秒間停止すること) * 製作したロボット[#wbc0bea6] 小回りを利かせるために2輪ローバーにした.また,そのためのバランサーの先に光センサーを取り付けた.缶をつかむ機構はクワガタのような型にした.開閉にはラックを前後させ,2本の角に支点を設けることで動かす機構を採用した. #ref(./) * 製作したプログラム[#i91f01f2] #define x 45 //閾値の設定 #define r 65 //90度の旋回時間(roll time) #define g 35 //缶をつかみに・離しに行くまでの時間(go time) **サブルーチン・右側トレース [#qb0298bf] sub line2() { ClearTimer(0); while(FastTimer(0)<=55/2){ //交差点を判断する値 if(SENSOR_2>x+7){ //光センサーの値が閾値+7以上だったら左に急旋回 OnRev(OUT_A); OnFwd(OUT_C); ClearTimer(0); }else if(SENSOR_2>=x+5){ //光センサーの値が閾値+5以上だったら左に曲がる Off(OUT_A); OnFwd(OUT_C); ClearTimer(0); }else if(SENSOR_2>x){ //光センサーの値が閾値より大きかったら直進 OnFwd(OUT_AC); ClearTimer(0); }else if(SENSOR_2>=x-5){ //光センサーの値が閾値-5以上だったら右に曲がる Off(OUT_C); OnFwd(OUT_A); ClearTimer(0); }else{ //それ以外だったら右に急旋回 OnRev(OUT_C); OnFwd(OUT_A); } } Off(OUT_AC); //交差点が来たらとまれ PlaySound(SOUND_DOUBLE_BEEP); //停止と同時に音を出せ } **サブルーチン・左側トレース(基本) [#eb284728] sub line() { ClearTimer(0); while(FastTimer(0)<=55/2){ //交差点を判断する値 if(SENSOR_2>x+7){ //光センサーの値が閾値+7以上だったら右に急旋回 OnRev(OUT_C); OnFwd(OUT_A); ClearTimer(0); }else if(SENSOR_2>=x+5){ //光センサーの値が閾値+5以上だったら右に曲がる Off(OUT_C); OnFwd(OUT_A); ClearTimer(0); }else if(SENSOR_2>x){ //光センサーの値が閾値より大きかったら直進 OnFwd(OUT_AC); ClearTimer(0); }else if(SENSOR_2>=x-5){ //光センサーの値が閾値-5以上だったら左に曲がる Off(OUT_A); OnFwd(OUT_C); ClearTimer(0); }else{ //それ以外だったら右に急旋回 OnRev(OUT_A); OnFwd(OUT_C); } } Off(OUT_AC); //交差点が来たらとまれ PlaySound(SOUND_DOUBLE_BEEP); //停止と同時に音を出せ } **サブルーチン・離すプログラム [#of5668e3] sub release() { OnFwd(OUT_C); //左に曲がる OnRev(OUT_A); Wait(r); Off(OUT_AC); OnFwd(OUT_AC); //前進 Wait(g); Off(OUT_AC); OnRev(OUT_B); //腕を開く Wait(10); Off(OUT_B); OnRev(OUT_AC); //後退 Wait(g); Off(OUT_AC); OnRev(OUT_C);180度旋回 OnFwd(OUT_A); Wait(r*2);` Off(OUT_AC); } **サブルーチン・掴むプログラム [#ab92bbb8] sub cat() { OnFwd(OUT_AC); //前進 Wait(g); Off(OUT_AC); OnFwd(OUT_B); //腕を閉じる Wait(10); Off(OUT_B); OnRev(OUT_AC); //後退 Wait(g); Off(OUT_AC); } **メインプログラム [#fcaf5452] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサーを定義 OnFwd(OUT_AC); Wait(30); Off(OUT_AC); line(); line(); Wait(100); //until C OnFwd(OUT_AC); Wait(70); Off(OUT_AC); line(); Wait(100); //until D cat(); Wait(100); //Dで停止 OnFwd(OUT_C); //D turn OnRev(OUT_A); Wait(r); Off(OUT_AC); Wait(100); line(); //until E line(); //until G OnFwd(OUT_C); //Gで曲がる OnRev(OUT_A); Wait(r); Off(OUT_AC); Wait(100); line(); line(); Wait(100); //until H OnFwd(OUT_C); //Hで曲がる Off(OUT_C); Wait(r); Off(OUT_AC); line(); Wait(100); //until I OnFwd(OUT_A); //Iで曲がる Off(OUT_C); Wait(r/2); Off(OUT_AC); line2(); Wait(100); //until J release(); line(); Wait(100); //until B OnFwd(OUT_C); OnRev(OUT_A); Wait(r); Off(OUT_AC); //Bで曲がる line(); //until A OnFwd(OUT_AC); /枠内へ Wait(300); Off(OUT_AC); //停止 } * まとめ[#wf4cffdf]