[[2019a/Member]] 目次 #contents *課題2について [#u74e2052] *ロボットについて [#m5de3aaa] **タイヤ [#xf6b7f3f] **アーム [#x5e87750] *プログラムについて [#id4fac50] **ライントレースの仕組み [#ld4d1ed2] **交差点認識の方法 [#p8c71d7c] ***直角交差点 [#zcb84290] ***円形交差点 [#f1b8055c] **使用したサブルーチン [#pfa6529b] ***定義・マクロ [#c109df9b] まずグローバル変数のtを定義します. int t; 次に交差点を認識するための時間を2種類定義します. #define KOUSATEN 20 //直角交差点用 #define ENKEIKOUSATEN 13 //円形交差点用 ライントレースに使用する光センサーの値を定義します. #define kuro 41 #define kurohai 43 #define hai 45 #define shirohai 47 ライントレースの動作のマクロです. #define go_ahead OnFwd(OUT_AC); //直進 #define turn_left SetPower(OUT_AC,3);Off(OUT_A);OnFwd(OUT_C); //左回転 #define turn_right SetPower(OUT_AC,3);OnFwd(OUT_A);Off(OUT_C); //右回転 #define Uturn_left SetPower(OUT_AC,3);OnRev(OUT_A);OnFwd(OUT_C); //左旋回 #define Uturn_right SetPower(OUT_AC,3);OnFwd(OUT_A);OnRev(OUT_C); //右旋回 一時停止のマクロです.交差点では,1秒間停止しなければならないので,時間は1秒です. #define kyukei Wait(100); ライントレースの1つの動作の継続時間を定義します. #define STEP 1 ***follow_line1 [#seefd551] follow_line1はライントレースをして直角の交差点で止まるサブルーチンです.光センサーの値がkuroの状態が一定時間(KOUSATEN)の間続くと止まります.そのために,kuroの動作ではタイマーをリセットせず時間を計り続けます.それ以外の動作の時は1回ずつタイマーをリセットしています. sub follow_line1() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //まずタイマー0をリセット while(FastTimer(0)<KOUSATEN) //タイマー0の値がKOUSATEN(20)未満のとき繰り返す { if(SENSOR_2<kuro) //光センサーの値がkuro(41)未満なら { Uturn_left; //左旋回 } else if(SENSOR_2<kurohai) //光センサーの値がkurohai(43)未満なら { turn_left;ClearTimer(0); //左回転,そしてタイマー0をリセット } else if(SENSOR_2<hai) //光センサーの値がhai(45)未満なら { go_ahead;ClearTimer(0); //直進,そしてタイマー0をリセット } else if(SENSOR_2<shirohai) //光センサーの値がshirohai(49)未満なら { turn_right;ClearTimer(0);//右回転,そしてタイマー0をリセット } else //それ以外(光センサーの値が49以上)なら { Uturn_right;ClearTimer(0);//右旋回,そしてタイマー0をリセット } Wait(STEP); //いずれかの動作をSTEP(1)だけ実行 } Off(OUT_AC); kyukei; //1秒間停止 } ***follow_line2 [#a8201e5e] follow_line2は,tの間だけライントレースをして止まるサブルーチンです.基本的な仕組みはfollow_line1と同じです.follow_line1との違いは,KOUSATENの代わりにグローバル変数tを用いることで任意の時間tの間は止まることなく進むことができます.そのために,それぞれの動作でタイマーをリセットすることはなく,このサブルーチンが始まってからの時間を計り続けます. sub follow_line2() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //まずタイマー0をリセット while(FastTimer(0)<t) { if(SENSOR_2<kuro) { Uturn_left; } else if(SENSOR_2<kurohai) { turn_left; } else if(SENSOR_2<hai) { go_ahead; } else if(SENSOR_2<shirohai) { turn_right; } else { Uturn_right; } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_CLICK); } **実際の経路に沿ったプログラム [#ge3070f3] *感想・反省点 [#c3f3176f]