- 追加された行はこの色です。
- 削除された行はこの色です。
課題2(ライントレース)目次
#contents
*課題の内容 [#v63e5afb]
決められた線の上をボールを動かしながら進み、ゴールにボールを入れられれば成功
*コース [#ja09a975]
#ref(./unnamed3.jpg)
*ロボットの説明 [#e0a3bc5a]
**ロボットの概形 [#w386836b]
#ref(./unnamed.jpg)
#ref(./unnamed2.jpg)
**動きの説明 [#jf3f0b7f]
コースを辿る際不安定な動きをしながら走る。ただ、しっかりと線の上を走るためゴールにボールを入れることができる。また、線路変更する際には最小限の動きだけで線路変更できるため最小限の速さでゴールまでたどり着けることができる。また、カーブをしっかりと線の上を走る。
*プログラミング [#f043bd88]
#define THRESHOLD 43
#define HIPOWER 5
#define LOWPOWER 3
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go set_power_H; OnFwd(OUT_AC); Wait(5); Off(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_right0 set_power_L; Off(OUT_C); OnFwd(OUT_A); // 右折
#define turn_right1 set_power_L; OnRev(OUT_C); OnFwd(OUT_A); // 右旋回
#define STEP 5 // 1回の判断で動作させる時間
#define nMAX 4 // 通常のカーブとして許容できる繰り返しの最大値 (調整する)
#define short_break Off(OUT_AC); Wait(200); // 小休止
#define CROSS_TIME 15 // 交差点通過にかかる時間 //40
/* 交差点を渡る */
#define cross_line OnFwd(OUT_AC);Wait(CROSS_TIME);short_break;
task line_trace ()
{
int nOnline=0; // 続けて黒になった回数 (カウンタ)
while (true) {
/* 黒を続けてnMAX回繰り返さない間、通常のライントレースをする */
while (nOnline < nMAX) {
if ( SENSOR_1 <= THRESHOLD-4) { //39 makkuro
turn_left1;
nOnline++; // カウンタを増やす
} else {
if ( SENSOR_1 < THRESHOLD) { //
turn_left0;
nOnline++; // カウンタを増やす kaihen
} else if ( SENSOR_1 <= THRESHOLD+2) {
go;
} else if ( SENSOR_1 < THRESHOLD+4) {
turn_right0; // karukumagaru
} else {
turn_right1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP); // nagarenoato matu
} //while nmax kakko
short_break; // 小休憩 nmax 4ijo
PlayTone(488,15); Wait(20);
turn_right1; Wait(nMAX*STEP*3/2); // 進行方向修正
cross_line; // 交差点を渡る
nOnline=0; //カウンタをリセット
} //while true
} //taskmain
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_TOUCH);
ClearTimer(0);
while( true ) {
start line_trace; // ライントレースを開始
until (SENSOR_3 == 1); //
stop line_trace; // 一旦 line_trace_line のタスクを停止
Off(OUT_A+OUT_C); Wait(50); // 2秒間停止 (この時、main のタスクのみがモータを 制 御)
OnFwd(OUT_B);Wait(10); OnRev(OUT_B);Wait(10);Off(OUT_B); //catch
}
}
*反省 [#uc8bea38]
動きが遅く線の上での安定さに欠けていた。また、同じところで止まることが多々あり少し残念だった。また書道ロボットと違い、光センサーを使ったり、ロボットだけではなくボールも動かしたりする動作にとても戸惑った。しかし、チームのみんなと協力することでロボットとプログラミングが完成したので良かった。今回はボールを動かすということもありロボット作りに専念した。