- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/Member]]
目次(ライントレースロボ)
#contents
* 課題 [#bcd2fde6]
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
-A地点からB地点へ (P三叉路およびQ交差点はともに直進)
-B地点からA地点へ (Q交差点では直進、P三叉路では直進)
-C地点からA地点へ (Q交差点では直進、P三叉路では右折)
そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。私はC地点からの経路を選んだ。
私はC地点からの経路を選んだ。
そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
* ロボット本体の説明 [#a6947f86]
** 3つのモーターの用途 [#y196ef65]
-車体の前後方向移動 (モータA,C)
-車体の旋回 (モータA,C)
-車体の右左折 (モータA,C)
-アームの上下 (モータB)
上部のアームでキャッチする。上部のアームとボール、ボールとマップとの摩擦は小さいのでロボットの動きに影響はほとんどない。
** センサーの用途 [#ocfd73aa]
-光センサー (センサー1)
ロボットの右側に光センサーをつけたので、ロボットの中心は黒線からの距離が4cmほどのところを通るようになった。
* プログラムの説明 [#icf16dd0]
** ライントレースとシュートのプログラム [#d94cbc8f]
#define THRESHOLD 43 /光センサーの値の基準
#define HIPOWER 9
#define LOWPOWER 6
#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 3 // 1回の判断で動作させる時間
#define nMAX 4 // 通常のカーブとして許容できる繰り返しの最大値
#define short_break Off(OUT_AC); Wait(200); // 小休止
#define CROSS_TIME 15 // 交差点通過にかける時間 //
#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-5) {
turn_left1;
nOnline++; // カウンタを増やす
} else {
if ( SENSOR_1 < THRESHOLD-2) { //42
turn_left0;
nOnline++; // カウンタを増やす kaihen
} else if ( SENSOR_1 <= THRESHOLD+7) { //46
go;
} else if ( SENSOR_1 < THRESHOLD+10) { //47
turn_right0; // karukumagaru
} else {
turn_right1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
}
short_break; // 小休憩
PlayTone(488,15); Wait(20);
turn_right1; Wait(nMAX*STEP*3/2); // 進行方向修正
cross_line; // 交差点を渡る
nOnline=0; //カウンタをリセット
}
}
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); //ボールをキャッチ
}
}
* 改善した点 [#sa2ab6c6]
-タッチセンサーを使用し、入力があればボールをキャッチするプログラムを作ったが、ボールが軽すぎたためか、入力が一切なく、課題を達成することはできなかった。そのためタイマーでアームを制御することにした。
-初期は、左旋回、右旋回、直進の三段階の動きしかせず、その動きはぎこちないものになった。そこで、左折・右折の二段階を加え、滑らかに動くようにした