[[2013b/Member]] *交差点、直角を含むライントレース [#ga1931f3] #contents **ロボットの作成 [#td990e64] &ref(2013b/Member/chikuwa/Mission1/20131122_175237.jpg,50%,使用ロボット); 普通にマインドストームの説明書通りに組み立てた。 このロボットをそのまま使用してもバランスや走行の仕方などに これといった不自由は感じられなかったのでそのまま使用した。 **ソースコード [#xf1bcebe] #define THRESHOLD 60 //しきい値は60に設定 #define SPEED_A 10 #define SPEED_B 20 #define SPEED_C 30 #define SPEED_D 40 #define SPEED_E 50 #define SPEED_F 60 #define SPEED_G 70 #define SPEED_H 80 #define SPEED_I 90 #define SPEED_J 100 #define STEP 1 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_D,SPEED_D); #define turn_first_curve OnRL(SPEED_H,-SPEED_H); #define turn_left0 OnRL(SPEED_C,0); #define turn_left0_2 OnRL(SPEED_B,0); #define turn_left1 OnRL(SPEED_B,-SPEED_B); #define turn_left2 OnRL(SPEED_H,-SPEED_H); #define turn_right0 OnRL(0,SPEED_B); #define turn_right00 OnRL(0,SPEED_F); #define turn_right000 OnRL(0,SPEED_H); #define turn_right1 OnRL(-SPEED_B,SPEED_B); #define turn_right2 OnRL(-SPEED_D,SPEED_D); #define nMAX_A 150 #define nMAX_B 200 #define nMAX_C 250 #define nMAX_D 300 #define short_break Off(OUT_BC);Wait(1000); #define CROSS_TIME 400 #define cross_line OnRL(SPEED_C,SPEED_C);Wait(CROSS_TIME);short_break; //ラインを渡るためのプログラム // task main() { SetSensorLight(S1); long t0=CurrentTick(); int nOnline=0; while(CurrentTick()-t0<7000){ //第一セクション(開始から7秒は次の通り動く) if(SENSOR_1<THRESHOLD-15){ turn_right000; }else{ if(SENSOR_1<THRESHOLD-8){ turn_right00; }else if(SENSOR_1<THRESHOLD+5){ go_forward; }else if(SENSOR_1<THRESHOLD+10){ turn_left1; }else{ turn_left1; } nOnline=0; } Wait(STEP); } while(CurrentTick()-t0<10000){ //第二セクション(開始から7〜10秒は次の通り動く) PlaySound(SOUND_UP); while(nOnline<140){ if(SENSOR_1<THRESHOLD-15){ turn_right2; nOnline++; }else{ if(SENSOR_1<THRESHOLD-8){ turn_right2; }else if (SENSOR_1<THRESHOLD){ go_forward; }else if(SENSOR_1<THRESHOLD+10){ turn_left0_2; }else{ turn_left0; } nOnline=0; } Wait(STEP); } short_break; turn_right1; Wait(100); cross_line; long t1=CurrentTick(); //ここから最初の円用のプログラム while(CurrentTick()-t1<7800){ if(SENSOR_1<THRESHOLD-15){ turn_right1; }else{ if(SENSOR_1<THRESHOLD-8){ turn_right0; }else if (SENSOR_1<THRESHOLD+5){ go_forward; }else if(SENSOR_1<THRESHOLD+10){ turn_left0; }else{ turn_left1; } nOnline=0; } Wait(STEP); } PlaySound(SOUND_DOWN); nOnline=0; } while(CurrentTick()-t0<39000){ //第三セクション(開始から10〜39秒は次の通り動く) PlaySound(SOUND_UP); while(nOnline<160){ if(SENSOR_1<THRESHOLD-15){ turn_right1; nOnline++; }else{ if(SENSOR_1<THRESHOLD-8){ turn_right0; }else if (SENSOR_1<THRESHOLD+5){ go_forward; }else if(SENSOR_1<THRESHOLD+10){ turn_left0; }else{ turn_left1; } nOnline=0; } Wait(STEP); } short_break; turn_left1; Wait(100); cross_line; PlaySound(SOUND_DOWN); nOnline=0; } } **ライントレースの方法 [#u332e545] &ref(2013b/Member/chikuwa/Mission1/進み方.PNG,80%,フローチャート); 基本的にはセンサが ”白を感知したら右へ” ”黒を感知したら左へ” 曲がるようにプログラムされている。 **基本的な流れ [#yd3ad064] &ref(2013b/Member/chikuwa/Mission1/キャプチャ.PNG,100%,フローチャート); **工夫した点 [#j6acd557] 1.与えられたコースを第一〜第三セクションに区切り、直角と交差点の判断を混乱させないようにした。 2.下図の赤色で示した部分をぐるぐると回る際に黒色を数えすぎて交差点と勘違いするのでプログラムを修正し、交差点を渡ったあとは(約8秒間)普通のライントレースをするようにした。(ソースコードの”最初の円用のプログラム”) &ref(2013b/Member/chikuwa/Mission1/20131206_165431(赤線アリ).jpg,40%,コース(赤)); **問題点 [#g0058dd4] プログラムが長すぎるので、今後書き換えるときにミスが生じやすい。もっとたくさん関数を利用してプログラムを簡素にしたい。 またタイマーに頼りきっているので、このコース以外では走ることができないので、どんなコースにも対応できるようにプログラムを改良したい。