- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*ルート [#se52666a]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2017b%2FMission2&src=2017b-mission2.png
1.Dをスタート
2.Cを直進
3.Bを左折
4.Pを左折(一時停止)
5.Qを直進
6.Rを左折
7.Fを左折
8.Sを直進(一時停止)
9.Y地点の紙コップを取得してコースに戻る
10.Sを直進(一時停止)
11.Qを左折(一時停止)
12.Rを直進
13.X地点に紙コップを置いてコースに戻る
14.Pを左折
15.B を左折(一時停止)
16.A地点へ(ゴール)
*反省点 [#a9dd9f14]
後の感想で言うが、止まってしまう現象である。
他にもある。s字カーブで何度も交差点判断してしまうことだ。
あとはコップをつかむことができるものの、所定の位置に持っていけないことだ。
この辺りはもっと考えてプログラムを作るべきだった。
*全体像 [#u4aba5f6]
はさみの部分は大きくし、体全体はごつくなった。はさみは両方動かずに片方だけ動かすようにした。
鋏に使ったギアは2枚。かみ合わせた。
トレース用のセンサーは先頭につけた。
&ref(2017b/Member/DAI/Mission2/hasa.jpg,25%);
*マクロ [#sffee7f4]
定義は次のようにしました。(t:秒数)
#define THRESHOLD 46
#define go_forward ; OnRev(OUT_AC);//直進
#define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define turn_right0 OnFwd(OUT_A);Off(OUT_A);//右回り
#define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A);//右旋回(秒数あり)
#define turn_left0 OnFwd(OUT_C);Off(OUT_C);//左回り
#define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_C);//左旋回(秒数あり)
#define go(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//直進(秒数あり)
#define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//後退(秒数あり)
#define cross_stop Off(OUT_AC);Wait(100);//交差点判断後停止
#define close SetPower(OUT_B,0);OnFwd(OUT_B);Wait(70);Off(OUT_B);//はさむ部分閉じ
#define open SetPower(OUT_B,0);OnRev(OUT_B);Wait(70);Off(OUT_B);//はさむ部分開け
#define STEP 1
*サブルーチン [#v402a498]
ライントレースするためのプログラムを作りました。
sub Line()
{
ClearTimer(0);
while(FastTimer(0)<20){
if(SENSOR_2>THRESHOLD +6) {
turn_right1;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD +3) {
turn_right0;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD ) {
go_forward;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD -4) {
turn_left0;
ClearTimer(0);
} else {
turn_left1;
}
Wait(STEP);
}
Off(OUT_AC);
}
またFSPQは交差点判断がうまくいかなかったのでLine()とは違うプログラムを作った。変更した点は、Timerを20から17に変えた。
sub LineFSPQ()
{
ClearTimer(0);
while(FastTimer(0)<17){
if(SENSOR_2>THRESHOLD +6) {
turn_right1;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD +3) {
turn_right0;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD ) {
go_forward;
ClearTimer(0);
} else if (SENSOR_2>THRESHOLD -4) {
turn_left0;
ClearTimer(0);
} else {
turn_left1;
}
Wait(STEP);
}
Off(OUT_AC);
}
*プログラム [#ef6181f2]
工夫した点はLine()が4つあるところで、一度止まってもトレースするようにした。
task main ()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
Line();
cross_stop;
go(20);
turn_right(20);
Line();
turn_left(25);//CB間
go(13);
Line();
cross_stop;
turn_left(25);
go(30);//BP間
LineFSPQ();
go(30);
turn_right(50);//PQ間
Line();
turn_left(10);//QR間
go(15);
Line();
cross_stop;
turn_left(10);//RE間
Line();
cross_stop;
turn_left(18);
go(8);
Line();
Line();
Line();
Line();
turn_left(20);//EF間
go(10);
LineFSPQ();
cross_stop;
go(30);
turn_right(60);//FS間
go(50);
close;
back(40);
turn_left(60);
Line();
cross_stop;
go(30);//S回る
turn_right(20);
LineFSPQ();
cross_stop;//QR間
turn_left(25);
go(20);
LineFSPQ();
cross_stop;//RP間
go(30);
turn_right(105);
go(23);
open;
back(25);
turn_left(90);
Line();
Line();
cross_stop;
turn_left(50);
go(10);
Line();
go(20);//ゴール
}
*感想 [#w94ff731]
今回の課題では本番失敗してしまった。つまずいたところは多々ある。
まず最初の交差点。ガガガという音を立て、その場で後退した。この現象は、プログラムのミスであるらしい。
2つ以上のプログラムが決行されていたらしい。いまだにどの点が悪かったのかわからない。ここは反省すべき点である。
次の課題ではもっとプログラミングをしっかりしたい。