目次 #contents *課題 [#hbb493e2] 今回の課題はライントレースをするロボットを作ることである。~ ロボットがトレースするコースはA地点→P直進→Q直進→Q直進→R左折→B地点のコースである。~ &ref(2016a/Member/michiya/Mission2/2016a-mission2.png,100%,2016a-mission2); 詳しくは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2]] *ロボット本体の説明 [#uba70732] 2つのモーター(A,C)を用いて本体の前後、旋回、回転の動作を行っている。~ また、本体の真下に付いている光センサー(2)でライントレースの操作を行っている。~ &ref(2016a/Member/michiya/Mission2/image1.JPG,100%,sensa); &ref(2016a/Member/michiya/Mission2/image2.JPG,100%,zentaizou); *プログラムの説明 [#f225120f] **サブルーチンの説明[#ge99abb1] 基本的にライントレースするサブルーチン。~ 黒にいる時間が0.5秒を超えるまで(交差点まで)whileの中のプログラムを繰り返す。~ 黒にいるときは右に旋回、回転する。 白にいるときは左に旋回、回転する。 それ以外のときは直進する。~ 交差点で止まったときに音がなる。 sub line_trace() { ClearTimer(0); while(FastTimer(0) <50){ if (SENSOR_2 <= BLACK) { //黒 RIGHT_H; } else if (SENSOR_2 < BLACK ) { //黒よりのグレー RIGHT_L; } else if (SENSOR_2 > WHITE ) { //白よりのグレー LEFT_L; ClearTimer(0); } else if (SENSOR_2 >= WHITE) { //白 LEFT_H ; ClearTimer(0); } else { //それ以外 OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); } 左に1.4秒間曲がるサブルーチン sub line_left() { while (FastTimer(0) < 140 ) { LEFT_L; } ClearTimer(0); } 左に2.5秒間旋回するサブルーチン sub line_left_H() { while (FastTimer(0) < 250) { LEFT_H; } ClearTimer(0); } **実際に使ったプログラム [#odd73086] #define BLACK 41 //これより小さかったら黒 #define WHITE 50 //これより大きかったら白 #define RIGHT_H OnFwd(OUT_A); OnRev(OUT_C);//右旋回 #define RIGHT_L OnFwd(OUT_A); Off(OUT_C);//右回転 #define LEFT_H OnFwd(OUT_C); OnRev(OUT_A);//左旋回 #define LEFT_L OnFwd(OUT_C); Off(OUT_A);//左回転 #define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//まっすぐ #define STEP 1 sub line_trace() { ClearTimer(0); while(FastTimer(0) <=50){ if (SENSOR_2 < BLACK) { //黒 RIGHT_H; } else if (SENSOR_2 < BLACK ) { //黒よりのグレー RIGHT_L; } else if (SENSOR_2 > WHITE ) { //白よりのグレー LEFT_L; ClearTimer(0); } else if (SENSOR_2 >= WHITE) { //白 LEFT_H ; ClearTimer(0); } else { //それ以外 OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); } sub line_left() { while (FastTimer(0) < 140 ) { LEFT_L; } ClearTimer(0); } sub line_left_H() { while (FastTimer(0) < 250) { LEFT_H; } ClearTimer(0); } task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); go_forward(120); line_trace(); line_left(); line_trace(); line_left(); line_trace(); line_left(); line_trace(); line_left_H(); go_forward(120); line_trace(); } *感想・反省点 [#mf2221bc] 交差点を認識させるのが難しかった。~ 交差点を認識させた後は行かせたい方向を考えて秒数や左右を考えなくてはいけなかったので大変だった。~ なんとかA地点からB地点までライントレースさせることはできたが、大分友達に助けてもらったのでもっと自分で調べたりする必要があると感じた。 なんとかA地点からB地点までライントレースさせることはできてよかった。