[[2018b/Member]] 目次 #contents *課題2[#c1701348] 課題2のコース #ref(2018b-mission2.png) ↑ ミッション † 次のいずれかのコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。 (相棒と違うコースを選ぶこと) 第2コース † ロボットを正方形X内におき、Lをスタート Eを一時停止して直進 Iを一時停止して左折 Hを直進 Kを直進 Jを左折 Cを一時停止して右折 Eを一時停止して直進 Gを一時停止して直進 長方形X内に入って停止 (一時停止の指定がある場所は、1秒間停止すること) ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる *扱うロボットの説明 [#hbaee6f9] *プログラムの説明 [#wff539bb] void follow_line_migi(long t_min) [#t6f7cf30] { SetSensorLight(S1); long t_start=CurrentTick(); //初期値 long t0=CurrentTick(); //白or黒の時間 long t_max=150; //連続して黒の限界値 long t1=CurrentTick(); //経過時間 while(t1-t_start<t_min){ if(SENSOR_1>60){ if(t1-t0<t_max){ OnFwd(OUT_C,40);Off(OUT_A); }else{ OnFwd(OUT_C,30);OnRev(OUT_A,60); } }else if(SENSOR_1>50){ OnFwd(OUT_AC,30); t0=CurrentTick(); }else{ if(t1-t0<t_max){ OnFwd(OUT_A,40);Off(OUT_C); }else{ OnFwd(OUT_A,30);OnRev(OUT_C,60); } } t1=CurrentTick(); } Off(OUT_AC); } void follow_line_migikousa(long t_min) { SetSensorLight(S1); long t_start=CurrentTick(); //初期値 long t0=CurrentTick(); //白or黒の時間 long t_max=150; //連続して黒の限界値 long t_kosa=200; //交差点判断 long t1=CurrentTick(); //経過時間 while(t1-t_start<t_min){ if(SENSOR_1>60){ if(t1-t0<t_max){ OnFwd(OUT_C,40);Off(OUT_A); }else{ OnFwd(OUT_C,30);OnRev(OUT_A,60); } }else if(SENSOR_1>50){ OnFwd(OUT_AC,40); t0=CurrentTick(); }else{ if(t1-t0<t_max){ OnFwd(OUT_A,40);Off(OUT_C); }else if(t1-t0<t_kosa){ OnFwd(OUT_A,30);OnRev(OUT_C,60); }else{ Off(OUT_AC); } } t1=CurrentTick(); } Off(OUT_AC); } void follow_line_hidari(long t_min) { SetSensorLight(S1); long t_start=CurrentTick(); //初期値 long t0=CurrentTick(); //白or黒の時間 long t_max=150; //連続して黒の限界値 long t1=CurrentTick(); //経過時間 while(t1-t_start<t_min){ if(SENSOR_1>60){ if(t1-t0<t_max){ OnFwd(OUT_A,40);Off(OUT_C); }else{ OnFwd(OUT_A,30);OnRev(OUT_C,60); } }else if(SENSOR_1>50){ OnFwd(OUT_AC,40); t0=CurrentTick(); }else{ if(t1-t0<t_max){ OnFwd(OUT_C,40);Off(OUT_A); }else{ OnFwd(OUT_C,30);OnRev(OUT_A,60); } } t1=CurrentTick(); } Off(OUT_AC); } void follow_line_hidarikousa(long t_min) { SetSensorLight(S1); long t_start=CurrentTick(); //初期値 long t0=CurrentTick(); //白or黒の時間 long t_max=150; //連続して黒の限界値 long t_kosa=200; //交差点判断 long t1=CurrentTick(); //経過時間 while(t1-t_start<t_min){ if(SENSOR_1>60){ if(t1-t0<t_max){ OnFwd(OUT_A,40);Off(OUT_C); }else{ OnFwd(OUT_A,30);OnRev(OUT_C,60); } }else if(SENSOR_1>50){ OnFwd(OUT_AC,30); t0=CurrentTick(); }else{ if(t1-t0<t_max){ OnFwd(OUT_C,40);Off(OUT_A); }else if(t1-t0<t_kosa){ OnFwd(OUT_C,30);OnRev(OUT_A,60); }else{ Off(OUT_AC); } } t1=CurrentTick(); } Off(OUT_AC); } void follow_line_ensyu(long t_min) { SetSensorLight(S1); long t_start=CurrentTick(); //初期値 long t0=CurrentTick(); //白or黒の時間 long t_max=150; //連続して黒の限界値 long t_kousa=200; //交差点判断 long t1=CurrentTick(); //経過時間 while(t1-t_start<t_min){ if(SENSOR_1>60){ if(t1-t0<t_max){ OnFwd(OUT_A,40);Off(OUT_C); }else{ OnFwd(OUT_A,30);OnRev(OUT_C,60); } }else if(SENSOR_1>50){ OnFwd(OUT_AC,30); t0=CurrentTick(); }else{ if(t1-t0<t_max){ OnFwd(OUT_C,40);Off(OUT_A); }else if(t1-t0<t_kousa){ OnFwd(OUT_C,40);OnRev(OUT_A,60); }else{ OnFwd(OUT_AC,40);Wait(200); } } t1=CurrentTick(); } Off(OUT_AC); } void search_direction() { ResetTachoCount(OUT_ABC); OnFwd(OUT_A,50); OnRev(OUT_C,50); SetSensorLowspeed(S4); //端子4に超音波センサー int d1; d1=1000; long t0=CurrentTick(); long t1=CurrentTick(); long t2=CurrentTick(); while(t2-t0<=3570){ t2=CurrentTick(); if(SensorUS(S4)<d1){ d1=SensorUS(S4); PlaySound(SOUND_CLICK); t1=CurrentTick(); } t2=CurrentTick(); } t0=CurrentTick(); Off(OUT_AC); OnFwd(OUT_C,50); OnRev(OUT_A,50); Wait(t0-t1); } task main() { follow_line_migikousa(5000);//QからE OnFwd(OUT_AC,40); Wait(300); follow_line_migikousa(5000);//EからI OnFwd(OUT_C,40);OnRev(OUT_A,40); Wait(700); OnFwd(OUT_AC,40); Wait(300); follow_line_ensyu(14000);//IからJ付近 PlaySound(SOUND_CLICK); search_direction(); RotateMotorEx(OUT_AC,30,360,100,true,true); Wait(3000); RotateMotor(OUT_B, 40, 70); Wait(3000); Off(OUT_AC); Wait(300); RotateMotor(OUT_B, 40, -80); RotateMotorEx(OUT_AC,30,400,100,true,true); follow_line_hidari(6000); PlaySound(SOUND_CLICK); follow_line_hidarikousa(7000);//JからC RotateMotor(OUT_A, 40, 180); RotateMotor(OUT_C, 40, -180); OnFwd(OUT_AC,40); Wait(700); follow_line_migi(23000);//CからD PlaySound(SOUND_CLICK); follow_line_migikousa(10000);//DからE OnFwd(OUT_AC,40); Wait(300); follow_line_migi(26000);//EからFより向こう PlaySound(SOUND_CLICK); follow_line_migikousa(7000);//Gまで PlaySound(SOUND_CLICK); OnFwd(OUT_AC,40); Wait(300); follow_line_migikousa(10000); OnFwd(OUT_AC,40); Wait(300);//ゴール } *感想 [#meb118fb]