*メンバー [#u9cfc206] -鈴木 健太…何も出来ない。 -金野 泰之…プログラミングがすごい。 *ロボットの紹介 [#y42b02fc] #ref(IMG_1004_e.JPG) -出来る限り横に広くならないようにパーツを積み上げていき作りました。 -アームは4つつけ缶がぐらつかないようにつかめる形にしました。 -重心がぶれすぎないように出来るだけ左右対称にしました。 *コースの攻略 [#i63cab57] #ref(IMG_1001_e.JPG) -曲がりきれないカーブの時は時間を計ってカーブの少し前でライントレースを切り替えて曲がれるようにしました。 -最後の缶をおくところでは、時間を計り最後のゴールの交差点をカウントしたら180度周り缶を置きまた戻るプログラムで問題を解決しました。 *プログラムの説明 [#vbe8852c] #define zone1 37 #define zone2 45 #define zone3 60 #define zone4 65 #define zensin OnFwd(OUT_BC,40); #define sasetu OnFwd(OUT_B,40);Off(OUT_C); #define kyuusasetu OnFwd(OUT_B,40);OnRev(OUT_C,35); #define usetu OnFwd(OUT_C,40);Off(OUT_B); #define kyuuusetu OnFwd(OUT_C,40);OnRev(OUT_B,35); #define STEP 1 #define nMAX 220 #define short_break Off(OUT_BC);Wait(1000); task main () { SetSensorLight(S3); int nOnline=0; long t0 = CurrentTick(); int n=0; while (CurrentTick()-t0 <= 7000) { //7秒後缶をつかむ if (SENSOR_3 < zone1) { kyuusasetu; } else if (SENSOR_3 < zone2) { sasetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { usetu; } else { kyuuusetu; } Wait(STEP); } OnRev(OUT_A,50);Wait(500);Off(OUT_A); while (CurrentTick()-t0 <=14000) { //14秒後にライントレースの変更 while(nOnline < nMAX && CurrentTick()-t0 <= 14000) { if (SENSOR_3 < zone1) { kyuusasetu; nOnline++; } else { if (SENSOR_3 < zone2) { sasetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { usetu; } else { kyuuusetu; } nOnline=0; } Wait(STEP); } kyuuusetu;Wait(nMAX*STEP); OnFwd(OUT_BC,30);Wait(200); nOnline=0; }usetu;Wait(100); while (CurrentTick()-t0 <= 28000) { //28秒後にもう一度ライントレースの変更 while(nOnline < nMAX && CurrentTick()-t0 <= 28000) { if (SENSOR_3 < zone1) { kyuuusetu; nOnline++; } else { if (SENSOR_3 < zone2) { usetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { sasetu; } else { kyuusasetu; } nOnline=0; } Wait(STEP); } kyuusasetu;Wait(nMAX*STEP); OnFwd(OUT_BC,30);Wait(200); nOnline=0; }sasetu;Wait(200); while (CurrentTick()-t0 <= 54000) { //54秒後以降に1度でも交差点があれば缶を置く while(nOnline < nMAX && CurrentTick()-t0 <= 54000) { if (SENSOR_3 < zone1) { kyuusasetu; nOnline++; } else { if (SENSOR_3 < zone2) { sasetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { usetu; } else { kyuuusetu; } nOnline=0; } Wait(STEP); } kyuuusetu;Wait(nMAX*STEP); OnFwd(OUT_BC,30);Wait(200); nOnline=0; } while (n<2) { while(nOnline < nMAX && n<2) { if (SENSOR_3 < zone1) { kyuusasetu; nOnline++; } else { if (SENSOR_3 < zone2) { sasetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { usetu; } else { kyuuusetu; } nOnline=0; } Wait(STEP); } kyuuusetu;Wait(nMAX*STEP); OnFwd(OUT_BC,30);Wait(200); nOnline=0;n++; } OnRev(OUT_BC,50);Wait(500);OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(300); OnFwd(OUT_B,50);OnRev(OUT_C,50);until(SENSOR_3 < 50); long t1 = CurrentTick(); while (CurrentTick()-t1 <= 1600) { if (SENSOR_3 < zone1) { kyuuusetu; } else if (SENSOR_3 < zone2) { usetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { sasetu; } else { kyuusasetu; } Wait(STEP); } sasetu;Wait(270);Off(OUT_BC);OnFwd(OUT_A,50);Wait(300);Off(OUT_A); OnRev(OUT_BC,50);Wait(600);OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(300); OnFwd(OUT_C,50);OnRev(OUT_B,50);until(SENSOR_3 < 50); long t2 = CurrentTick(); while (CurrentTick()-t2 <= 3900) { if (SENSOR_3 < zone1) { kyuusasetu; } else if (SENSOR_3 < zone2) { sasetu; } else if (SENSOR_3 < zone3) { zensin; } else if (SENSOR_3 < zone4) { usetu; } else { kyuuusetu; } Wait(STEP); } Off(OUT_BC); } *まとめ [#nffffdcf] 毎回の時間の誤差の解決が大変でした。 特にある程度アバウトですがある程度どんなときでもクリアできる時間を探し出すのは苦労しました。 また電池の残量により速度が変わり1度プログラムの数値を見直したりしたのは大変だったのでこれからは電池の残量にもしっかりと気配りしたいと思います。 *反省点 [#af610537] プログラミングの力をもっとつけなければいけないと思いました。 また100%成功するわけではないのでロボを改良したり何かほかの方法を見つけ出せるようになりたいと思います。 電池の残量もよく確認していきたいです。