- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
#contents
*&size(45){ロボティクス入門ゼミ 課題2}; [#n4a4ddb7]
*課題の説明 [#e4766088]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMission2&openfile=2016a-mission2.png)
~幅2cmの黒い線をなぞります。今回はB地点からC地点までのコースに挑戦しました。
*考え方 [#i0e2b99f]
*概要 [#i0e2b99f]
黒の線をライントレースします。光センサーを使って白と黒を認識させ、プログラム通りに動かします。~
主にこのプログラムは交差点を認識させるのがミソになっていると思います。~
やり方は大きく2つあり、時間を測ってやるやり方と、回数を測ってやるやり方です。~
#ref(ro1.jpg)
逆さになってしまいましたが、、、、
#ref(ro2.jpg)
*プログラム [#p16c59f2]
-定義
#define THRESHOLD 45
#define go_forward OnFwd(OUT_AC);
#define turn_left1 OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left0 OnFwd(OUT_C); Off(OUT_A);
#define turn_right0 OnFwd(OUT_A); Off(OUT_C);
#define turn_right1 OnFwd(OUT_A); OnRev(OUT_C);
#define STEP1
-交差点で前進するサブルーチン
sub cross_fwd()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int n=0;
while (n<10) {
if (SENSOR_2 < THRESHOLD -8) {
turn_left1; n++;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0; n++;
} else if (SENSOR_2 < THRESHOLD +3) {
turn_right1; n=0;
} else if (SENSOR_2 < THRESHOLD +8) {
turn_right0; n=0;
}
}
Off(OUT_AC); Wait(100); go_forward;
}
-交差点で右折するサブルーチン
sub cross_right()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int n=0;
while (n<10) {
if (SENSOR_2 < THRESHOLD -8) {
turn_left1; n++;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0; n++;
} else if (SENSOR_2 < THRESHOLD +3) {
turn_right1; n=0;
} else if (SENSOR_2 < THRESHOLD +8) {
turn_right0; n=0;
}
}
Off(OUT_AC); Wait(100); turn_right1;
}
-交差点で左折するサブルーチン
sub cross_left()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int n=0;
while (n<10) {
if (SENSOR_2 < THRESHOLD -8) {
turn_left1; n++;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0; n++;
} else if (SENSOR_2 < THRESHOLD +3) {
turn_right1; n=0;
} else if (SENSOR_2 < THRESHOLD +8) {
turn_right0; n=0;
}
}
Off(OUT_AC); Wait(100); turn_left1;
}
-最終的に止まるサブルーチン
sub cross_stop()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int n=0;
while (n<10) {
if (SENSOR_2 < THRESHOLD -8) {
turn_left1; n++;
} else if (SENSOR_2 < THRESHOLD -3) {
turn_left0; n++;
} else if (SENSOR_2 < THRESHOLD +3) {
turn_right1; n=0;
} else if (SENSOR_2 < THRESHOLD +8) {
turn_right0; n=0;
}
}
Off(OUT_AC);
}
-時間を決めてライントレースするインライン関数
void line_follow(int t)
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while (Timer(0)<t) {
if (SENSOR_2<THRESHOLD -8){turn_left1;}
else if (SENSOR_2<THRESHOLD -3){turn_left0;}
else if (SENSOR_2<THRESHOLD +3){turn_right1;}
else if (SENSOR_2<THRESHOLD +8){turn_right0;}
Wait(100);
}
Off(OUT_AC);
}
-本文
task main()
{
line_follow(30); //BからRまで
cross_right(); //R
line_follow(800); //RからQ
cross_fwd(); //Q
line_follow(150); //QからQ
cross_fwd(); //Q
line_follow(800); //QからP
cross_right(); //P
line_follow(800); //PからSまで
cross_right(); //S
line_follow(400); //SからCまで
cross_stop(); //停止
}
*感想 [#zbd84d32]
交差点を認識させるのが難しく、思ったとおりに動いてくれないのが残念でした。
交差点を認識させるのが難しく、思ったとおりに動いてくれないのが残念でした。~
時間をかけて作ったつもりですが、毎回やるたびに違うタイミングでコースを走るので、~
時間を指定したりする時、とても苦労しました。~
最終的にちゃんと動いてくれなかったのですが、友達に教えてもらったりして、~
ある程度の形ではプログラムを作ることが出来ました。~
小さい頃遊んだ自分にとって親しみ深いレゴにこんなに苦戦するとは思っても見ませんでした。~
いろいろ失敗して、原因も自分でわかったものもありますが、ほとんど周りの人に教えて~
もらって作りました。チームの友達や周りで助けてくれた人にはとても感謝しています。~