目次
詳しくはこちらを参照2019a/Mission2
下図のオレンジの線のような経路に沿って動くロボットを作成する。
詳細(Aから出発→Bを直進→Cを直進→Dを一時停止後、直進→Eを右折→Fを右折→Gを一時停止後、右折→Hを直進→Iを直進→Jを右折→Kを左折→Lで球をつかむ→Kを直進→Mで一時停止→シュート)
・コンパクトにするため、車部分はマニュアルに掲載されているものを採用した。それに光センサをなるべく地面に近くなるように取り付けた。
・アームは、ボールの上からかぶせてゴールまで引きずっていくような仕組みになっている。
・光の明るさを5段階に分け、それらに対応する動作を振り分ける。以下はそのプログラムである。
#define SPEED 25 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_fwd OnRL(SPEED, SPEED); //直進 #define turn_Lc OnRL(SPEED, -SPEED); //左旋回 #define turn_Lt OnRL(SPEED, 0); //左折 #define turn_Rc OnRL(0, SPEED); //右折 #define turn_Rt OnRL(-SPEED, SPEED); //右旋回
・明るさの判断の基準としては、「閾値より値がどれくらい離れているか」とし、閾値を定義した。
#define THRESHOLD 45
#define THRESHOLD 45
#define SPEED 25
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define go_fwd OnRL(SPEED, SPEED);
#define turn_Lc OnRL(SPEED, -SPEED);
#define turn_Lt OnRL(SPEED, 0);
#define turn_Rc OnRL(0, SPEED);
#define turn_Rt OnRL(-SPEED, SPEED);
#define short_break Off(OUT_BC);PlaySound(SOUND_CLICK);Wait(1000);
#define catch OnFwd(OUT_A,50);Wait(500);Off(OUT_A)
#define release OnRev(OUT_A,50);Wait(500);Off(OUT_A);
void followline_L(int d) {
long t0=CurrentTick(); while(CurrentTick()-t0<d){ if (SENSOR_1 < THRESHOLD -12) { turn_Lc; } else if (SENSOR_1 < THRESHOLD -7) { turn_Lt; } else if (SENSOR_1 < THRESHOLD +7) { go_fwd; t0=CurrentTick(); } else if (SENSOR_1 < THRESHOLD +12) { turn_Rc; t0=CurrentTick(); } else { turn_Rt; t0=CurrentTick(); } } short_break;
}
void followline_R(int k) {
long t0=CurrentTick(); while(CurrentTick()-t0<k){ if (SENSOR_1 < THRESHOLD -12) { turn_Rc; } else if (SENSOR_1 < THRESHOLD -7) { turn_Rt; } else if (SENSOR_1 < THRESHOLD +7) { go_fwd; t0=CurrentTick(); } else if (SENSOR_1 < THRESHOLD +12) { turn_Lc; t0=CurrentTick(); } else { turn_Lt; t0=CurrentTick(); } } short_break;
}
void followline_R2(int m) {
long t0=CurrentTick(); while(CurrentTick()-t0<m){ if (SENSOR_1 < THRESHOLD -12) { turn_Rc; t0=CurrentTick(); } else if (SENSOR_1 < THRESHOLD -7) { turn_Rt; t0=CurrentTick(); } else if (SENSOR_1 < THRESHOLD +7) { go_fwd; t0=CurrentTick(); } else if (SENSOR_1 < THRESHOLD +12) { turn_Lc; } else { turn_Lt; } } Off(OUT_BC); Wait(2000);
}
void stride() {
while(SENSOR_1 < THRESHOLD -7){ go_fwd; } Off(OUT_BC);
}
void stride_L() {
while(SENSOR_1 < THRESHOLD +7){ turn_Lc; } Off(OUT_BC);
}
void stride_R() {
while(SENSOR_1 < THRESHOLD +7){ turn_Rc; } Off(OUT_BC);
}
task main() {
SetSensorLight(S1); followline_L(100); stride(); followline_L(150); stride_R(); followline_R(100); stride_R(); followline_R(150); stride_R(); followline_R(150); stride_R(); followline_R(150); stride(); followline_R2(100); catch; turn_Lc; followline_R(150); stride(); followline_R(); stride_L(); followline_R(150); release;
}