*課題2(第2コース) [#n2ab6bc0] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 **ミッション [#j6a6c3cd] 次のいずれかのコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。 (相棒と違うコースを選ぶこと) http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018b%2FMember%2FJerry%2FMission2&src=%A5%B3%A1%BC%A5%B9.png +ロボットを正方形X内におき、Lをスタート +Eを一時停止して直進 +Iを一時停止して左折 +Hを直進 +Kを直進 +Jを左折 +Cを一時停止して右折 +Eを一時停止して直進 +Gを一時停止して直進 +長方形X内に入って停止 (一時停止の指定がある場所は、1秒間停止すること) ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる *ロボットの説明[#sd3ebdf4] **全体像 [#s5157bea] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=C28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2 [#d0f606ea] **各種センサーの位置 [#a9f92a47] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2 *プログラムについて [#t8183ddf] **基本動作に関する定義 [#gd0a5a5e] #define THRESHOLD 54 [#o897b273] #define SPEED 30 #define speed 20 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define LEFT OnRL(speed,-speed); #define left OnRL(speed,0); #define straight OnRL(SPEED,SPEED); #define right OnRL(0,speed); #define RIGHT OnRL(-speed,speed); #define STEP 1 #define nMAX 300 #define short_break Off(OUT_BC);Wait(1000); #define CROSS_TIME 700 #define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);short_break; #define turn_time 3000 #define turn_left LEFT;Wait(turn_time);short_break; #define turn_right RIGHT;Wait(turn_time);short_break; #define kaiten OnRL(SPEED,-SPEED); #define kaiten_time 5500 #define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A); **まとまった動作に関する定義 [#ja1f6d69] ***黒線の右側をトレースするプログラム [#mc631e28] sub line_trace_R() { while (true) { if(SENSOR_3<THRESHOLD-8){RIGHT;} else if(SENSOR_3<THRESHOLD-3){right;} else if(SENSOR_3<THRESHOLD+2){straight;} else if(SENSOR_3<THRESHOLD+6){left;} else{LEFT;} Wait(STEP); } ***黒線の左側をトレースするプログラム [#m060bc2b] sub line_trace_L() { while (true) { if(SENSOR_3<THRESHOLD-8){LEFT;} else if(SENSOR_3<THRESHOLD-3){left;} else if(SENSOR_3<THRESHOLD+2){straight;} else if(SENSOR_3<THRESHOLD+6){right;} else{RIGHT;} Wait(STEP); } ***黒線の右側トレース時に交差点で一時停止して横断するプログラム [#z725f4b9] sub kousaten_trace_R() { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-10) { RIGHT; nOnline++;} else { if (SENSOR_3 < THRESHOLD-3) {right;} else if (SENSOR_3 < THRESHOLD+2) {straight;} else if (SENSOR_3 < THRESHOLD+6) {left;} else {LEFT;} nOnline=0;} Wait(STEP); } short_break; LEFT; Wait(nMAX*STEP); cross_line; nOnline=0; } ***黒線の左側トレース時に交差点で一時停止して横断するプログラム [#j0b5a596] sub kousaten_trace_() { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-10) { LEFT; nOnline++;} else { if (SENSOR_3 < THRESHOLD-3) {left;} else if (SENSOR_3 < THRESHOLD+2) {straight;} else if (SENSOR_3 < THRESHOLD+6) {right;} else {RIGHT;} nOnline=0;} Wait(STEP); } short_break; RIGHT; Wait(nMAX*STEP); cross_line; nOnline=0; } ***黒線の右側トレース時に一時停止して左折するプログラム [#t6696adb] sub kousaten_sasetsu_R() { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-8) { RIGHT; nOnline++;} else { if (SENSOR_3 < THRESHOLD-3) {right;} else if (SENSOR_3 < THRESHOLD+2) {straight;} else if (SENSOR_3 < THRESHOLD+6) {left;} else {LEFT;} nOnline=0;} Wait(STEP); } short_break; LEFT; Wait(nMAX*STEP); turn_left; nOnline=0; } ***黒線の左側トレース時に一時停止して右折するプログラム [#o0dd26fa] sub kousaten_usetsu_L() { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-8) { LEFT; nOnline++;} else { if (SENSOR_3 < THRESHOLD-3) {left;} else if (SENSOR_3 < THRESHOLD+2) {straight;} else if (SENSOR_3 < THRESHOLD+6) {right;} else {RIGHT;} nOnline=0;} Wait(STEP); } short_break; RIGHT; Wait(nMAX*STEP); turn_right; nOnline=0; } ***缶の位置を探すプログラム [#z382c818] sub serch_kan() { SetSensorLowspeed(S4); long t10,t11; int L=10000; while(CurrentTick()-t10<=kaiten_time){ OnRL(speed,-speed); if(SensorUS(S4)<L) { L=SensorUS(S4); t11=CurrentTick()-t10; } } OnRL(-speed,speed); Wait(kaiten_time-t11); Off(OUT_BC); } ***ボールをシュートするプログラム [#ge658b27] sub shoot() { arm_up; OnFwd(OUT_BC,100); Wait(200); Off(OUT_BC); }