[[2016a/Member]] 目次 #contents *ロボット本体 [#j1083688] #ref(2016a/Member/ko/Mission3/3D.jpg,30%,robo2) 上の写真のように、コップを持ち上げて運べるように、前にはさみを取り付けた。 #ref(2016a/Member/ko/Mission3/image2 (2).JPG,30%,robo2) コップを挟みそれ以上はさめなくなると。ギアがかみ合いコップが上がる仕組みである。 #ref(2016a/Member/ko/Mission3/image3 (2).JPG,30%,robo3) #ref(2016a/Member/ko/Mission3/•image4 (1).JPG,30%,robo4) #ref(2016a/Member/ko/Mission3/image4 (1).JPG,30%,robo4) ゴムをつけてギアのかみ合わせをよくしたり、ストッパーをつけて紙コップを落とさないようにするなど工夫をした。 *運び方 [#j8043570] コップを積み上げることも考えたが時間が足りなかったのでとりあえず一つを円に運ぶことにした。 *プログラム [#b45f50ff] **定義 [#e317d8cb] #define BLACK 44 //これ以下は黒 # define WHITE 50 //これ以上は白 #define RIGHT_S OnFwd(OUT_A);OnRev(OUT_C); //右旋回 #define RIGHT_K OnFwd(OUT_A);Off(OUT_C); //右回転 #define LEFT_S OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define LEFT_K OnFwd(OUT_C);Off(OUT_A); //左回転 #define go_fwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒間前進 #define go_back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //t秒間後退 #define STEP 1 #define arm_up(t) OnFwd(OUT_B);Wait(t);Off(OUT_B); //t秒間腕上げ #define arm_down(t) OnRev(OUT_B);Wait(t);Off(OUT_B); //t秒間腕下げ #define RIGHT_i(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC); //t秒間右回転 #define LEFT_i(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);OFF(OUT_AC); //t秒間左回転 **サブルーチン [#nbf9c643] 黒い線の右側をたどっていくプログラム。交差点で一時停止するようになっている。 判定方法は、タイマーを使い、0.45秒以上黒が続いた時、交差点として判定する。 黒では右に、白では左に回転、旋回するようになっている。その他では直進する。 こちらは腕が上がっている時に使用した。 sub line_trace_i() { ClearTimer(0); while(FastTimer(0) < 45) { if (SENSOR_2 < BLACK) { RIGHT_S; } else if (SENSOR_2 < BLACK +2 ) { RIGHT_K; } else if (SENSOR_2 > WHITE ) { LEFT_S; ClearTimer(0); } else if (SENSOR_2 >= WHITE -2 ) { LEFT_K; ClearTimer(0); } else { OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); }~ 先ほどのプログラムとほぼ同じだが、こちらは腕を下げた状態の時使用した。 腕が下がっている時、動きが鈍くなるため、交差点の判定時間を延ばして対処している。 sub line_trace_ii() { ClearTimer(0); while(FastTimer(0) < 55) { if (SENSOR_2 < BLACK) { RIGHT_S; } else if (SENSOR_2 < BLACK +2 ) { RIGHT_K; } else if (SENSOR_2 > WHITE ) { LEFT_S; ClearTimer(0); } else if (SENSOR_2 >= WHITE -2 ) { LEFT_K; ClearTimer(0); } else { OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_UP); Wait(100); }~ 交差点で左折するためのプログラム。 sub turn_left() { ClearTimer(0); while (FastTimer(0) < 290) { LEFT_K; } }~ 交差点で右折するためのプログラム。 sub turn_right() { ClearTimer(0); while (FastTimer(0) < 90) { RIGHT_K; } }~ 交差点で直進するためのプログラム。 sub cross_fwd() { ClearTimer(0); while (FastTimer(0) < 60) { LEFT_K; } } ↑ **メインプログラム [#n21a8cb8] task main() { go_fwd(100); line_trace_i(); cross_fwd(); line_trace_i(); cross_fwd(); line_trace_i(); turn_right(); Off(OUT_AC); arm_down(70); go_fwd(200); arm_up(90); RIGHT_i(120); arm_down(20); Wait(50); arm_down(70); go_back(100); arm_up(120); RIGHT_i(50); line_trace_ii(); arm_down(100); go_fwd(200); arm_up(80); LEFT_i(130); go_fwd(50); arm_down(80); } *まとめ [#x9e58e5b] 結果は惜しくも円の中に入らなかった。しかし、技術点は思っていたより高く全体では上の方でよかった。結構時間はかけたが、ロボットが思ったような動きをしてくれなかった。3つの課題を通してプログラミングについて少しは分かったと思う。