目次 #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){//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); } *プログラム [#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つ以上のプログラムが決行されていたらしい。いまだにどの点が悪かったのかわからない。ここは反省すべき点である。 次の課題ではもっとプログラミングをしっかりしたい。