*ロボットの紹介 [#g50440f6] まず、カーブをスムーズに回れるように、ロボットの幅をできるだけ狭くした。その時に特に注意した点は、左右の車輪をうまく固定できるようにしたことである。そして、今回は、缶を運ぶという動作をしなければならなかったので、缶をはさむための部品とモーターが必要であった。そのため、車体の前方にその2つと、光センサー、タッチセンサーを共に取り付けたので、前方が重くなってしまい、車体が前に倒れこむ形になってしまった。それを防ぐために、うまくバランスが取れるよう、後ろに大きな車輪を取り付け、おもり代わりにした。結果、走行の際に、車体が揺れながら走る形になったが、前や後ろなどに車体が倒れることはなくなった。 缶をはさむ、鋏の部分について、左右一本ずつでは安定しないので、二本ずつに増やした。また、缶が滑り落ちるのを防ぐため、鋏の先端に小さな車輪を取り付け、滑り止めの代わりとした。これで、缶が滑り落ちることはなくなった。 *コース攻略法 [#ab414ee5] **反時計回り [#mec4877d] -プログラムの切り替えは、時間の経過で行う。 -まず、最初の交差点をすぎる前までは、交差点なしのライントレースを行う。 -そこから、交差点ありのライントレースに切り替える。 -カーブのところは、交差点無しで回る。 -2つの交差点を交差点ありのプログラムで越える。 -先ほどとは逆方向のカーブができるプログラムで、カーブを抜ける。 -交差点を、交差点ありのもので抜ける。 -そのまま進んでいき、直角をお曲がる。 -直角を曲がったあと、Uターンして、缶を置く動作を行う。 -Uターンで戻って、ライントレースして、ゴールまで行く。 *プログラムの説明 [#z34e2a68] 以下のプログラムは、動作確認はしたものの、少々不安な点が残るようなものである。 #define THRESHOLD 42 #define HIPOWER 5 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); #define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C); #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); #define STEP 1 #define nMAX 3 #define short_break Off(OUT_AC); Wait(10); #define cross_time 20 #define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(cross_time); short_break; #define time1 800 #define time2 3400 #define time3 900 #define time4 800 #define time5 1400 #define time6 4200 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_1, SENSOR_TOUCH); ClearTimer(0); int counter=0; int nOnline=0; if (SENSOR_1 == 0){ OnFwd(OUT_B); } while(FastTimer(0) <= time1){ if (SENSOR_1 == 1){ OnRev(OUT_B); } if (SENSOR_2 < THRESHOLD -4){ turn_right1; } else if (SENSOR_2 < THRESHOLD -3){ turn_right0; } else if (SENSOR_2 < THRESHOLD +0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_left0; } else { turn_left1; } Wait(STEP); } PlaySound(SOUND_CLICK); while(counter < 1){ while(nOnline < nMAX){ if (SENSOR_2 < THRESHOLD -4){ turn_right1; nOnline++; } else { if (SENSOR_2 < THRESHOLD -3){ turn_right0; } else if (SENSOR_2 <THRESHOLD -0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } short_break; turn_right1; Wait(nMAX*STEP); cross_line; PlaySound(SOUND_UP); nOnline=0; counter++; } PlaySound(SOUND_CLICK); ClearTimer(0); while(FastTimer(0) < time3){ if (SENSOR_2 < THRESHOLD -4){ turn_right1; } else if (SENSOR_2 < THRESHOLD -3){ turn_right0; } else if (SENSOR_2 < THRESHOLD +0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_left0; } else { turn_right1; } Wait(STEP); } couter=0; while(counter < 3){ while(nOnline < nMAX){ if (SENSOR_2 < THRESHOLD -4){ turn_right1; nOnline++; } else { if (SENSOR_2 < THRESHOLD -3){ turn_right0; } else if (SENSOR_2 < THRESHOLD -0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } short_break; turn_right; Wait(nMAX*STEP); cross_line; PlaySound(SOUND_UP); nOnline=0; counter++; } PlaySound(SOUND_CLICK); ClearTimer(0); while(FastTimer(0) <= time5){ if (SENSOR_1 == 1){ OnRev(OUT_B); } if (SENSOR_2 < THRESHOLD -4){ turn_right1; } else if (SENSOR_2 < THRESHOLD -3){ turn_right0; } else if (SENSOR_2 < THRESHOLD +0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_left0; } else { turn_left1; } Wait(STEP); } PlaySound(SOUND_CLICK); counter=0; while(counter < 1){ while(nOnline < nMAX){ if (SENSOR_2 < THRESHOLD -4){ turn_left1; nOnline++; } else { if (SENSOR_2 < THRESHOLD -3){ turn_left0; } else if (SENSOR_2 < THRESHOLD -0){ go_forwrd; } else if (SENSOR_2 < THRESHOLD +2){ turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } OnRev(OUT_B); OnRev(OUT_A); OnFwd(OUT_C); Wait(400); Off(OUT_AC); OnFwd(OUT_AC); Wait(200); OnFwd(OUT_B); Off(OUT_AC); Wait(100); OnRev(OUT_C); OnFwd(OUT_A); Wait(400); while(true){ if (SENSOR_2 < THRESHOLD -4){ turn_left1; } else if (SENSOR_2 < THRESHOLD -3){ turn_left0; } else if (SENSOR_2 < THRESHOLD +0){ go_forward; } else if (SENSOR_2 < THRESHOLD +2){ turn_right0; } else { turn_right1; } Wait(STEP); counter++; } PlaySound(SOUND_CLICK); } } *まとめ [#ufeba444] 最初思っていた以上に、プログラムを作ることが難しかった。せっかく作ってもロボットが思っていたような動きをしてくれなかったりして、うまくは行かなかった。ロボットが正常に動くように組み立てる面では、なかなかうまくまとめられたと思う。とりあえず、苦労した点は、場所によって、明るさや、スピードが変わってきてしまう点だと思った。そのたびに値を調整しなければならなかったので、苦労したと思う。プログラムの上手な作り方がなかなか分からず、パートナーに教わってばかりだった。次に行うときは、しっかりと理解しつつ取り組みたいと思った。完全に今回の課題をクリアできなかったので、残念だと思った。