- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/Member]]
*ライントレース (A→Bコース) [#q8098b7b]
**はじめに [#nb533e1c]
このページは2015年ロボティックス前期課題2のライントレースA→Bを説明するページである。
ライントレースとは黒く塗られた道をロボットの光センサーを利用して道なりに進ませるものである。
光センサーに閾値を設定してあげることによってロボットに黒か白か判断させることが可能となり、ライントレースが行える。
**ロボットの説明 [#z2cafbc6]
全体図
#ref(1437009372175.jpg,,30%)
先端部(上)
#ref(1437009370384.jpg,,30%)
全体図(下)
#ref(1437009368119.jpg,,30%)
裏側の青い部分が光センサーである。
中心より少しずらすことによって少しでも曲がれば光センサーの位置も真下から見るとずれるように設計されている。先端にアームをつけることで球を挟んで勝手に転がりださないようになっている。
**プログラミング [#y196f944]
#define THRESHOLD 40
#define HIPOWER 6
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnFwd(OUT_AC);
#define turn_left1 set_power_L;\
OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left0 set_power_L;\
OnFwd(OUT_C); Off(OUT_A);
#define turn_right0 set_power_L;\
OnFwd(OUT_A); Off(OUT_C);
#define turn_right1 set_power_L;\
OnFwd(OUT_A); OnRev(OUT_C);
#define STEP 1
#define MOVE_TIME 1750
#define MOVE_TIME2 2100
#define CLOSE OnFwd(OUT_1)
#define OPEN OnRev(OUT_1)
sub fetch()
{OPEN; Wait(900) CLOSE; Wait(1200) OPEN; }
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while(true){
while (FastTimer(0) <= MOVE_TIME) {
if (SENSOR_2 > THRESHOLD +4) {
turn_left1;
} else if (SENSOR_2 > THRESHOLD +3) {
turn_left0;
} else if (SENSOR_2 > THRESHOLD -3) {
go_forward;
} else if (SENSOR_2 > THRESHOLD -4) {
turn_right0;
} else {
turn_right1;
}
}
while (MOVE_TIME < MOVE_TIME2){
if (SENSOR_2 < THRESHOLD -4) {
turn_left1;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0;
} else if (SENSOR_2 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_2 < THRESHOLD +4) {
turn_right0;
} else {
turn_right1;
}
}
}
{while(MOVE_TIME2){
go_forward}
}
}
**プログラミングの説明 [#r281cbb1]
#define THRESHOLD 40
閾値の設定ここでは40にした。
#define HIPOWER 6
#define LOWPOWER 2
パワーの設定
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnFwd(OUT_AC);
#define turn_left1 set_power_L;\
OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left0 set_power_L;\
OnFwd(OUT_C); Off(OUT_A);
#define turn_right0 set_power_L;\
OnFwd(OUT_A); Off(OUT_C);
#define turn_right1 set_power_L;\
OnFwd(OUT_A); OnRev(OUT_C);
右や左と回るスピードの設定。
#define STEP 1
#define MOVE_TIME 1750
#define MOVE_TIME2 2100
それぞれの時間の設定
#define CLOSE OnFwd(OUT_1)
#define OPEN OnRev(OUT_1)
アームの開閉の設定
sub fetch()
{OPEN; Wait(900) CLOSE; Wait(1200) OPEN; }
9秒まで開き、その後12秒閉じて、開くプログラミング
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
光センサーの設定
ClearTimer(0);
タイマーの設定
while(true){
while (FastTimer(0) <= MOVE_TIME) {
if (SENSOR_2 > THRESHOLD +4) {
turn_left1;
} else if (SENSOR_2 > THRESHOLD +3) {
turn_left0;
} else if (SENSOR_2 > THRESHOLD -3) {
go_forward;
} else if (SENSOR_2 > THRESHOLD -4) {
turn_right0;
} else {
turn_right1;
}
}
黒線の左側に沿って動くプログラミング(17.5秒まで)
while (MOVE_TIME < MOVE_TIME2){
if (SENSOR_2 < THRESHOLD -4) {
turn_left1;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0;
} else if (SENSOR_2 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_2 < THRESHOLD +4) {
turn_right0;
} else {
turn_right1;
}
}
}
黒線の右側に沿って動くプログラミング(21秒まで)
{while(MOVE_TIME2){
go_forward}
}
}
まっすぐ行くプログラミング
最初のカーブは比較的緩やかなので、Q地点まで左側に沿って動かしてもたどり着くことができる。
交差点も急なため認識されず、スムーズに通過可能。
途中で球を回収するときは時間を測って確実にアームの中に収まっているときに閉じることで、カー
ブでも転がり落ちないようにしている。
Q地点から先は右側に沿って動くので、直角に曲がる部分も正面で白を認識した後で、右にターンするのでそのまま道なりに進める。
最後はまっすぐ進ませつつ、アームを開くことで、ゴールにロボットごと突っ込ませる。
**おわりに [#pbd9c5e7]
黒線の上では左車輪も右車輪もlowパワーだったので、交差点をらくらく通過できたのがよかった。
直角のところで左に曲がって戻ってしまうので苦戦したが、タイマーを使って途中で黒線の右に沿って動かすことで可能となった。
最後はシュートせず、アームを開いたまま突っ込ませることで、ゴールにいれた。