- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題 [#g2ac3d5d]
#ref(./2015a-mission21.png,70%)
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
•A地点からB地点へ (P三叉路およびQ交差点はともに直進)
•B地点からA地点へ (Q交差点では直進、P三叉路では直進)
•C地点からA地点へ (Q交差点では直進、P三叉路では右折)
そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする
可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。
自分はC地点からA地点へ行く経路を選んだ。
*ロボットの説明 [#sb5ebfdd]
#ref(./DSC_00071.jpg,70%)
#ref(./DSC_00051.jpg,90%)
このようにアームを上下に動かし、光センサと横につけたブロックの間にボールを入れ上からアームをかぶせるようにしてボールをキャッチする。
*プログラムの説明 [#if20647d]
**内容 [#p0d010d7]
#define BLACK 40 // これ以下は黒
#define WHITE 50 // これ以上は白
#define SPEED 35
#define speed 25
#define go_forward OnFwd(OUT_BC,SPEED); // 直進
#define turn_left OnFwd(OUT_B,speed);Off(OUT_C); // 左折
#define turn_right Off(OUT_B);OnFwd(OUT_C,speed); // 右折
#define STEP 1 // 一回の判断で動作させる時間
#define nMAX 200
#define short_break Off(OUT_BC);Wait(2000); // 小休止
#define arm_down OnFwd(OUT_A,SPEED);Wait(500);Off(OUT_A); // アームを下げる
#define CROSS_TIME 500 // 交差点を通過する時間
#define cross_line OnFwd(OUT_BC,SPEED);Wait(CROSS_TIME);short_break; // 交差点の通過
#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A); // アームを上げる
task main()
{
SetSensorLight(S3);
int nOnline=0; // 続けて黒になった回数(カウンタ)
if (true) {
while (nOnline < nMAX) {
if (SENSOR_3 < BLACK) {
turn_left; // 黒の時は左に曲がる
nOnline++; // カウンタを増やす
} else if (SENSOR_3 < WHITE) {
go_forward; // 黒と白の間の時は直進する
} else {
turn_right; // 白の時は右に曲がる
nOnline=0; // カウンタリセット
}
Wait(STEP);
}
short_break; // 小休止
turn_right; Wait(nMAX*STEP);
cross_line; // 交差点を渡る
arm_down; // アームを下す
nOnline=0; // カウンタをリセットする
} ///////////////////////////////////////////〜 一つ目の交差点、ボールのキャッチ
if (true) { // 再びライントレースに戻る
while (nOnline < nMAX) {
if (SENSOR_3 < BLACK) {
turn_left; // 黒の時は左に曲がる
nOnline++; // カウンタを増やす
} else if (SENSOR_3 < WHITE) {
go_forward; // 黒と白の間の時は直進する
} else {
turn_right; // 白の時は右に曲がる
nOnline=0; // カウンタをリセットする
}
Wait(STEP);
}
short_break; // 小休止
turn_right; Wait(nMAX*STEP);
cross_line; // 交差点を渡る
nOnline=0; // カウンタをリセットする
} /////////////////////////////////////////一つ目の交差点、ボールのキャッチ〜二つ目の交差点
if (true) { // 再びライントレースに戻る
while (nOnline < nMAX) {
if (SENSOR_3 < BLACK) {
turn_left; // 黒の時は左に曲がる
nOnline++; // カウンタを増やす
} else if (SENSOR_3 < WHITE) {
go_forward; // 黒と白の間の時は直進する
} else {
turn_right; // 白の時は右に曲がる
nOnline=0; // カウンタをリセットする
}
Wait(STEP);
}
short_break; // 小休止 ///////////////////////////
turn_left; Wait(nMAX*STEP);
arm_up; // アームを上げる
OnRev(OUT_BC,SPEED);Wait(600); // 後退する シュートを
Off(OUT_BC);
arm_down; // アームを下げる する
OnFwd(OUT_BC,SPEED);Wait(600); // 前進する
Off(OUT_BC);
nOnline=0; // カウンタをリセットする ////////////////////////////
}
}