目次
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地点へ(ゴール)
後の感想で言うが、止まってしまう現象である。
他にもある。s字カーブで何度も交差点判断してしまうことだ。
あとはコップをつかむことができるものの、所定の位置に持っていけないことだ。
この辺りはもっと考えてプログラムを作るべきだった。
はさみの部分は大きくし、体全体はごつくなった。はさみは両方動かずに片方だけ動かすようにした。
片方のはさみをでかくし、そこをコップに引っ掛けて取るという予定にした。先を曲げてる方にして、コップが掴みやすいようにした。
はさみに使ったギアは2枚。かみ合わせた。
トレース用のセンサーは先頭につけた。なるべく下につけることで値を安定させた。
定義は次のようにしました。(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
ライントレースするためのプログラムを作りました。
交差点判断は連続して黒を感知することで行う。黒の平均的な値のマクロを作り、それに+、−で値を変えている。
sub Line() { ClearTimer(0); while(FastTimer(0)<20){//0.2秒以内黒の線を連続して感知した場合ループ、以上は次の動作へ if(SENSOR_2>THRESHOLD +6) { turn_right1; ClearTimer(0);//値52より大きい時右旋回 (真っ白の時) } else if (SENSOR_2>THRESHOLD +3) { turn_right0; ClearTimer(0);//値49より大きい時右回り (線付近の白の時) } else if (SENSOR_2>THRESHOLD ) { go_forward; ClearTimer(0);//値46より大きい時前進 (黒の線と白の境目付近) } else if (SENSOR_2>THRESHOLD -4) { turn_left0; ClearTimer(0); //値42より大きい時左回り (線付近の黒の時) } else { turn_left1;//左旋回 (真っ黒の時) } Wait(STEP); } Off(OUT_AC); }
またFSPQは交差点判断の秒数がうまくかみあわなかったのでLine()とは違うプログラムを作った。変更した点は、Timerを20から17に変えた。
sub LineFSPQ() { ClearTimer(0); while(FastTimer(0)<17){//0.17秒以内黒の線を連続して感知した場合ループ、以上は次の動作へ if(SENSOR_2>THRESHOLD +6) { turn_right1; ClearTimer(0);//値52より大きい時右旋回 } else if (SENSOR_2>THRESHOLD +3) { turn_right0; ClearTimer(0);//値49より大きい時右回り } else if (SENSOR_2>THRESHOLD ) { go_forward; ClearTimer(0);//値46より大きい時前進 } else if (SENSOR_2>THRESHOLD -4) { turn_left0; ClearTimer(0); //値42より大きい時左回り } else { turn_left1;//左旋回 } Wait(STEP); } Off(OUT_AC); }
工夫した点は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);//ゴール }
今回の課題では本番失敗してしまった。つまずいたところは多々ある。
まず最初の交差点。ガガガという音を立て、その場で後退した。この現象は、プログラムのミスであるらしい。
2つ以上のプログラムが決行されていたらしい。いまだにどの点が悪かったのかわからない。ここは反省すべき点である。
次の課題ではもっとプログラミングをしっかりしたい。