[[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] #ref(image1 (2).jpeg) #ref(image2 (2).jpeg) #ref(image3.jpeg) #ref(image4.jpeg) *プログラムの説明 [#wff539bb] 今回の課題ではライントレースによりロボットを移動させる.故にラインの右側を通る場合と左側を通る場合の二通りのプログラムを必要とする.また急カーブや直角カーブで交差点判断をしないようなプログラムも必要とする.更に今回はコースの特性上,弧IHKJをうまく一周するプログラムも作成した. **ラインの右側を通るプログラム [#cb3f74d9] 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); } **ラインの右側を通過し,交差点し差し掛かったら停止するプログラム [#i26b0f46] 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); } **ラインの左側を通るプログラム [#a66021c0] 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); } **ラインの左側を通過し,交差点し差し掛かったら停止するプログラム [#sc381860] 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); } **コースの弧上を交差点判断せずにスムーズに通過するプログラム [#u08e558c] 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); } **缶の方向を調べるプログラム [#sf349a41] また缶に向けて正確にボールをシュートするために正確に超音波センサを用いて缶の方向を向くプログラムを要する.以下のプログラムがそれである. 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); } **実際のプログラム [#pc19d427] 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]