#author("2020-01-10T16:27:39+09:00","udon","udon") [[2019b/Member]] *目次 [#ac4c4c45] #contents *課題2:ライントレースして、ボールを取り、元の位置に戻る [#s14c0288] **コース [#k5e444b6] #ref(2019b-mission2.png) 私は二人目だったので、コースは -1 A地点から出発 -2 J -3 H (直進) -4 I (ボール or キューボイドをつかんでUターン) -5 H (右折) -6 G (一時停止の後、直進) -7 D (右折) -8 E, F 通過 -9 G (一時停止の後、直進) -10 C (一時停止の後、左折) -11 B (一時停止) -12 A地点に入る(ゴール) のルートをたどる。 *ロボットの説明 [#mf0767a0] 今回の課題では下の写真のロボットを使用した。 #ref(IMG_1407.jpeg) このロボットは3つ目のモーターを利用してアームを動かし、上からアームを下ろしてボールを取ることができるようにした。 #ref(IMG_1420.jpeg) また、光センサーの反応がロボットの動きによって誤作動を起こさないように、光センサーを紙面と垂直になるように設置し、できるだけ固定した。 #ref(IMG_1410.jpeg) *プログラミングの説明 [#cb858ddd] **ロボットの動作 [#hdc9d9d0] #define SPEED_X 40 #define SPEED_L 30 #define turn_right1 OnRL(-SPEED_L,SPEED_L); #define turn_left1 OnRL(SPEED_L,-SPEED_L); #define turn_right2 OnRL(-SPEED_L,SPEED_L); #define turn_left2 OnRL(SPEED_L,-SPEED_L); #define go_forward OnFwd(OUT_BC,30); #define go OnFwd(OUT_BC,30);Wait(800); #define right Off(OUT_B);OnFwd(OUT_C,40);Wait(300); #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); float GetAngle(float d) { const float diameter=5.45; const float pi=3.1415; const float distance=12.5; float ang=(distance*d)/diameter; return ang; } void u_turn() { int angle=GetAngle(160); RotateMotorEx(OUT_BC,SPEED_L,angle,100,true,true); } void turn1() { int angle=GetAngle(90); RotateMotorEx(OUT_BC,SPEED_L,angle,-100,true,true); } このようにしてロボットの前進や旋回、そして回転を定義した。 **ライントレース(左)[#v3a80993] void follow_lineleft() { long to; SetSensorLight(S3); to=CurrentTick(); while(CurrentTick()-to <100){ if(SENSOR_3<36){ turn_left1 }else{ if(SENSOR_3>59){ turn_right1 to=CurrentTick(); }else if((51<=SENSOR_3)&&(SENSOR_3<=59)){ turn_right2 to=CurrentTick(); }else if((42<SENSOR_3)&&(SENSOR_3<51)){ go_forward to=CurrentTick(); turn_left2 to=CurrentTick(); }}} Off(OUT_BC); } このプログラミングで黒線の左側をライントレースできるようにした。さらに交差点で止まるため、光センサーの数値が36を下回る時間が、0.1秒より長くなると止まるように値を定めた。 **ライントレース(右) [#rded0106] void follow_lineright1(long tmin=2000, long tmax=10000) {   long to; SetSensorLight(S3); to=CurrentTick(); while(CurrentTick()-to<80){ if(SENSOR_3<36){ turn_right1 }else{ if(SENSOR_3>59){ turn_left1 to=CurrentTick(); }else if((51<=SENSOR_3)&&(SENSOR_3<=59)){ turn_left2 to=CurrentTick(); }else if((42<SENSOR_3)&&(SENSOR_3<51)){ go_forward to=CurrentTick(); }else{ turn_right2 to=CurrentTick(); }}} Off(OUT_BC); } void follow_lineright2(long t) {   long to; SetSensorLight(S3); to=CurrentTick(); while(CurrentTick()-to<t){ if(SENSOR_3<36){ turn_right1 }else{ if(SENSOR_3>59){ turn_left1; }else if((51<=SENSOR_3)&&(SENSOR_3<=59)){ turn_left2; }else if((42<SENSOR_3)&&(SENSOR_3<51)){ go_forward; }else{ turn_right2; }}} Off(OUT_BC); } *今回の課題の反省点や感じたこと [#w1704261] 今回の課題では、