#author("2020-02-15T20:39:19+09:00","shin","shin") #author("2020-02-15T20:42:23+09:00","shin","shin") 目次 #contents *課題2 [#xecac370] #ref(2019b/Member/shin/Mission2/2019b-mission2.jpeg,100%) A地点を出発し、次のような経路を黒い線に沿って動くロボットを作成する。 **経路 [#qa12098a] +A地点から出発 +J +H(直進) +I(ボールを掴んでUターン) +H(右折) +G(一時停止の後、直進) +D(右折) +E、F通過 +G(一時停止の後、直進) +C(一時停止の後、左折) +B(一時停止) +A地点に入る(ゴール) *ロボットの説明 [#qf9dba20] 超音波センサでボールを認識し、アームを下げ、ボールを囲ってそのまま運ぶようにした。#ref(2019b/Member/shin/Mission2/Robo.jpeg,50%) 超音波センサでボールを認識し、モーターにつけられたボール囲うための枠を下げ、ボールを囲ってそのままボールを転がして運ぶようにした。 ボールに反応しやすいように超音波センサはななめにとりつけた。 #ref(2019b/Member/shin/Mission2/Robo.jpeg,50%) ボールに反応しやすいように超音波センサはななめにとりつけた。水平や垂直だとうまくボールを認識してくれなかった。 #ref(2019b/Member/shin/Mission2/Robo2.jpeg,50%) *プログラムの説明 [#pca1dfdd] 必要な数値や基本的な動きの定義。 #define BLACK 37 #define GRAY_BLACK 50 #define GRAY_WHITE 60 #define WHITE 66 #define left1 OnFwd(OUT_B,30);OnRev(OUT_C,30); #define left0 OnFwd(OUT_B,30);Off(OUT_C); #define go OnFwd(OUT_BC,30); #define right0 OnFwd(OUT_C,30);Off(OUT_B); #define right1 OnFwd(OUT_C,30);OnRev(OUT_B,30); #define pause Wait(1000); #define u_turn OnFwd(OUT_B,50);OnRev(OUT_C,70);Wait(1000);Float(OUT_C) ラインの右側をトレースする。 void follow_line_r() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<120){ if(SENSOR_3<BLACK){ right1; }else if(SENSOR_3<GRAY_BLACK){ right0; t0=CurrentTick(); }else if(SENSOR_3<GRAY_WHITE){ go; t0=CurrentTick(); }else if(SENSOR_3<WHITE){ left0; t0=CurrentTick(); }else{ left1;t0=CurrentTick(); } } Off(OUT_BC); } ラインの左側をトレースする。 void follow_line_l() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<80){ if(SENSOR_3<BLACK){ left1; }else if(SENSOR_3<GRAY_BLACK){ left0; t0=CurrentTick(); }else if(SENSOR_3<GRAY_WHITE){ go; t0=CurrentTick(); }else if(SENSOR_3<WHITE){ right0; t0=CurrentTick(); }else{ right1;t0=CurrentTick(); } } Off(OUT_BC); } JからHまでの曲線のトレース。曲線と交差点の区別がうまくいかなかったので、JからHまでの曲線のトレースは別の関数にした。 void follow_line_curve() { SetSensorLight(S3); long t1; t1=CurrentTick(); while(CurrentTick()-t1<15000){ if(SENSOR_3<BLACK){ left1; }else if(SENSOR_3<GRAY_BLACK){ left0; }else if(SENSOR_3<GRAY_WHITE){ go; }else if(SENSOR_3<WHITE){ right0; }else{ right1; } } Off(OUT_BC); } } 交差点を渡る。左トレースと右トレースでそれぞれ関数を作った。 void cross_line_l() { right0; Wait(700); go; Wait(500); Off(OUT_BC); } void cross_line_r() { go; Wait(400); Off(OUT_BC); } 左折 void turn_left() { left0; Wait(700); left1; Wait(1200); Off(OUT_BC); } 右折 void turn_right() { right0; Wait(500); right1; Wait(900); Off(OUT_BC); } ボールを掴みUターンする。 void fetch_ball() { SetSensorLowspeed(S2); while(SensorUS(S2)>=10){ go; } Off(OUT_BC); Wait(1000); RotateMotor(OUT_A,30,-60); u_turn; go; Wait(1000); } メインのプログラム task main() { go; Wait(500); //A地点を出発 follow_line_curve(); follow_line_l(); //J→H cross_line_l(); //H→I fetch_ball(); //ボールをつかんでUターン follow_line_r(); //I→H turn_right(); //Hを右折 follow_line_r(); //H→G pause; //Gで一時停止 cross_line_r(); follow_line_r(); //G→D turn_right(); follow_line_r(); //D→E turn_right(); follow_line_r(); //E→F turn_right(); follow_line_r(); //F→G pause; //Gで一時停止 cross_line_r(); follow_line_r(); //G→C pause; //Cで一時停止 turn_left(); follow_line_l(); //C→B pause; //Bで一時停止 cross_line_l(); go; Wait(500); //A地点に入る } *まとめ [#bae43c62] 曲線と交差点の区別がなかなかうまくいかなかった。3回に1回は思うようには動いてくれなかった。センサの位置などを工夫する事で、プログラミングは少しは楽になったとは思う。前回の課題が上手くいかなかったので今回はなんとか上手くいってよかった。だんだんとプログラミングが楽しくなってきた。次の課題も頑張りたい。