*課題 [#b7a8adc9] [[mission2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]参照。1人目の課題をやった。 *ロボット組み立て [#mfcf9c67] ロボットはnxt組み立て解説書に掲載されているモデルを真似して全く同じものを作った。課題を行う上で、特にロボット自体による問題はで気になる点もなかったので、このロボットで課題を進めた。ロボット前方下部分に光センサーが地面ぎりぎりの位置にくるように取り付けてある。 **全体 [#tea90503] #ref(all.jpg) **真横 [#ocf89543] #ref(yoko.jpg) *課題攻略に向けて [#f1f4a875] **交差点直進 [#c5e48063] #ref(1.jpg) **交差点左折→交差点直進 [#v194c7de] #ref(2.jpg) **交差点右折→交差点右折 [#u4c9c06b] #ref(3.jpg) *プログラム [#v575e7e7] **定義 [#e1cfad46] #define THRESHOLD 45 #define SPEED_H 35 #define SPEED_L 25 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); #define turn_left1 OnRL(SPEED_L,-SPEED_L);//左旋回 #define turn_left0 OnRL(SPEED_L,0);//左折 #define turn_right0 OnRL(0,SPEED_L);//右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L);//右旋回 #define STEP 1//1回の動作で判断させる時間 #define nMAX 300//コース1,コース3のカーブとして許容できる繰り返しの最大値 #define nMAX2 450//コース2のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC);Wait(1000);//小休止 #define CROSS_TIME 250//交差点通過にかかる時間 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; **カウンタと光センサの設定 [#qaf75295] task main() { SetSensorLight(S3); int nOnline=0;//黒になった回数 int cross_number=0;//交差点に差し掛かった回数 **コース1 [#rd9a766e] while(cross_number<1||2<=cross_number<3){//交差点でまっすぐ進むライントレース while(nOnline<nMAX) { if(SENSOR_3<THRESHOLD-15) { turn_left1; nOnline++; }else{ if(SENSOR_3<THRESHOLD-7) { turn_left0; } else if(SENSOR_3<THRESHOLD+7) { go_forward; }else if(SENSOR_3<THRESHOLD+15) { turn_right0; }else{ turn_right1; } nOnline=0;//カウンタをリセット } Wait(STEP); } PlaySound(SOUND_CLICK);Wait(1000);//交差点のたびに鳴らす short_break; turn_right1;Wait(nMAX*STEP);//進行方向修正 cross_line; nOnline=0; cross_number++;//交差点の判断をする毎にカウンタを増やす。 } **コース2 [#tb0865e2] while(1<=cross_number<2){//交差点で左折するライントレース while(nOnline<nMAX2) { if(SENSOR_3<THRESHOLD-15) { turn_left1; nOnline++; }else{ if(SENSOR_3<THRESHOLD-7) { turn_left0; } else if(SENSOR_3<THRESHOLD+7) { go_forward; }else if(SENSOR_3<THRESHOLD+15) { turn_right0; }else{ turn_right1; } nOnline=0;//カウンタをリセット } Wait(STEP); } PlaySound(SOUND_CLICK);Wait(1000);//交差点のたびに鳴らす short_break; turn_right1;Wait(nMAX*STEP);//進行方向修正 cross_line; nOnline=0; cross_number++; } **コース3 [#rea7e84f] while(cross_number>=3){//交差点で右折するライントレース while(nOnline<nMAX) { if(SENSOR_3<THRESHOLD-15) { turn_left1; nOnline++; }else{ if(SENSOR_3<THRESHOLD-7) { turn_left0; } else if(SENSOR_3<THRESHOLD+7) { go_forward; }else if(SENSOR_3<THRESHOLD+15) { turn_right0; }else{ turn_right1; } nOnline=0;//カウンタをリセット } Wait(STEP); } PlaySound(SOUND_CLICK);Wait(1000);//交差点のたびに鳴らす short_break; turn_right1;Wait(nMAX*STEP);//進行方向修正 cross_line; Wait(1000); turn_right1;Wait(600);//進行方向を右に修正 nOnline=0; cross_number++; } } *感想・反省 [#m850e904]