- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
目次
*はじめに [#p359eff2]
今回の課題は、ロボットに光センサーを取り付け、紙に書いた線のうちの決められたコースをロボットが走れるようにする、というものだった。
ただライントレースをさせるだけでなく、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止することが課題となってくる。
僕はBコースを担当した。
*ロボット本体の説明 [#g5c2c820]
*プログラムの説明 [#r352a901]
定義
#define THRESHOLD 53
#define SPEED_H 40 // 直線用のスピード
#define SPEED_L 20 // カーブのスピード
#define OnRL(speedR,speedL) \
OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED_H,SPEED_H); // 直進
#define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回
#define turn_left0 OnRL(SPEED_L,0); // 左折
#define turn_right0 OnRL(0,SPEED_L); // 右折
#define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回
#define STEP 1 // 1回の判断で動く時間
#define nMAX 260 // 通常のカーブとして許容できる繰り返しの最大値 (調整する)
#define short_break Off(OUT_BC); Wait(1000); // 小休止
#define CROSS_TIME 400 // 交差点通過にかかる時間
/* 交差点を渡る */
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
メイン
task main()
{
SetSensorLight(S1);
Long t0 = CurrentTick();
int nOnline=0; // 続けて黒になった回数 (カウンタ)
while (CurrentTick()-t0 <= 1000) {
while (nOnline < nMAX) {
if (SENSOR_1 < THRESHOLD-15) {
turn_right1;
nOnline++; // カウンタを増やす
} else {
if (SENSOR_1 < THRESHOLD-10) {
turn_right0;
} else if (SENSOR_1 < THRESHOLD) {
go_forward;
} else if (SENSOR_1 < THRESHOLD+6) {
turn_left0;
} else {
turn_left1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
}
short_break; // 小休憩
PlaySound(SOUND_UP);
turn_right1;
nOnline=0; //カウンタをリセット
}
while (CurrentTick()-t0 <= 20000) {
while (nOnline < nMAX) {
if (SENSOR_1 < THRESHOLD-15) {
turn_right1;
nOnline++; // カウンタを増やす
} else {
if (SENSOR_1 < THRESHOLD-10) {
turn_right0;
} else if (SENSOR_1 < THRESHOLD) {
go_forward;
} else if (SENSOR_1 < THRESHOLD+6) {
turn_left0;
} else {
turn_left1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
}
short_break; // 小休憩
PlaySound(SOUND_UP);
turn_left1; Wait(nMAX*STEP); // 進行方向修正
cross_line; // 交差点を渡る
nOnline=0; //カウンタをリセット
while (CurrentTick()-t0 <= 55000) {
while (nOnline < nMAX) {
if (SENSOR_1 < THRESHOLD-15) {
turn_right1;
nOnline++; // カウンタを増やす
} else {
if (SENSOR_1 < THRESHOLD-10) {
turn_right0;
} else if (SENSOR_1 < THRESHOLD) {
go_forward;
} else if (SENSOR_1 < THRESHOLD+6) {
turn_left0;
} else {
turn_left1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
}
short_break; // 小休憩
PlaySound(SOUND_UP);
turn_right1;
nOnline=0; //カウンタをリセット
}
turn_left1;
Wait(500);
go_foward;
Wait(1400)
Off(OUT_BC);
}
*苦労した点 [#j0325639]
*感想 [#x58ca83b]