[[2016a/Member]] *目次 [#hf5c1d7d] #contents *今回の課題 [#j34a4692] 今回は光センサーを使ってライントレースを行う課題です。 今回のコースは下の図である。 コースの図 #ref(2016a-mission2.png) 私は A地点からB地点までを A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点 の順で進みます。 1つ目の交差点:直進 2つ目の交差点:直進 3つ目の交差点:直進 4つ目の交差点:左折 というように直進がほとんどであるが、左折が一箇所あるので、プログラムを簡略化するため、左側走行にしました。しかし、そのせいでQ地点付近の長くて急なカーブを内側走行をしなければいけなくなり、苦労しました。 *使用したロボット [#x04d3d0d] 写真2枚 #ref(IMG_0747.JPG) #ref(IMG_0748.JPG) カーブが多いため、横幅が狭い小回りの利いたロボットを製作しました。 �� 誤作動を防ぐため、センサーを中央に近い部分に取り付けました。これを変えたことによって、カーブで失敗しない確率が断然上がりました。 �� 小回りが利くようになるには、できるだけ車体を小さくし、タイヤの距離を狭くする必要が有ると思ったので、二つのモーターをくっつけ、最小限の横幅にしました。 �� タイヤも小さいタイヤ2つしか使っていないので、バランスを保つため、車体の前方に回転できる小さなプレートを取り付けました。 余分なものを取り除いた簡易な作りになってしまったため、カバンに入れるたびに壊れていました。 *プログラム [#reaeff61] 多くのやり方を試したのですが、やはりサブルーチンをメインに使用したやり方が一番簡単で、わかりやすかったです。 **Define [#n55d1d08] #define STARTIME 300//交差点を判断しない時間 #define JUDGETIME 25//交差点を判断する時間 /*トレースの動き*/ #define TLL rev(OUT_A);fwd(OUT_C)//左旋回 #define TL Off(OUT_A);fwd(OUT_C)//左折 #define TRR rev(OUT_C);fwd(OUT_A)//右旋回 #define TR Off(OUT_C);fwd(OUT_A)//右折 #define ST fwd(OUT_AC)//直進 #define CHECKCROSS FastTimer(0) <= JUDGETIME || FastTimer(1) <= STARTIME//交差点の判断 トレースに旋回と片方のタイヤを軸にして曲がる動きを両方プログラムに入れているが、完璧にカーブすることはやはり難しいです。 **サブルーチン [#i9d7982c] ***トレースを行うサブルーチン [#x034d0d3] sub trace() { ClearTimer(0);//タイマーをリセット while(CHECKCROSS){ if(FastTimer(1) < STARTIME){ ClearTimer(0); } if(54 <= SENSOR_2){ TRR; }else if(51 <= SENSOR_2){ TR; }else if(46 <= SENSOR_2){ ST; }else if(43 <= SENSOR_2){ TL; }else { TLL; } if(44 <= SENSOR_2) ClearTimer(0);//白を認識した場合、交差点判定用のタイマをリセットする } Off(OUT_AC); PlaySound(SOUND_CLICK);//ピッと鳴る Wait(100);//一秒間停止する ClearTimer(0); } スタート時の交差点や誤作動を防ぐため、初めのSTARTIMEの間は判定用のタイマをリセットし続けます。 トレース中に白を認識できればタイマをリセットし、白を認識できなれけば(左右黒しかない)タイマが+1となり、交差点と認識し、ピッと音を鳴らします。 ***交差点で直進するサブルーチン [#f70277a4] sub PQ_ST() { ST; Wait(30); } ***交差点で左折するサブルーチン [#s8da206d] sub PQ_TL() { ClearTimer(1); } 左側走行なのでクリアタイマ1で左折します。 **タスクメイン [#o6e38b66] task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(1); trace(); PQ_ST();//点Pで直進 trace(); PQ_ST();//点Qで直進 trace(); PQ_ST();//点Qで直進 trace(); PQ_TL();//点Rで左折 trace(); PlaySound(SOUND_UP); //ゴール時の音 } サブルーチンを多く使用しているため、簡単でわかりやすいタスクメインになりました。 *まとめ [#z59ce1da] **結論 [#x4fc387a] 前回の課題より難易度は高くなったが、満足のできる結果になりました。 光センサーを使った初めての授業の時は、ジグザグにしか進むことができませんでしたが、今は直線上ではほぼまっすぐに進むことができるようになったし、カーブでも無駄の少ない動きになってきたと思います。 **プログラムについて [#t6776234] 最初は先生が言っていたサブルーチンがあまり理解できなくて、自分なりのやり方を試行錯誤していましたが、どれもうまくいきませんでした。その後、友達のサブルーチンを使ったプログラムを参考し、自分のやり方を変更して、なんとか今のプログラムに至ることができました。 プログラムに対する理解が一層深まったと思います。 **ロボットについて [#jb15679e] 今回成功率が上がった一番の理由はロボットだと思います。 レポート締切の一週間前まで説明書通りのロボットを使用していて、毎回Q地点付近のカーブで回りきれず、カーブを交差点と認識していました。 どうしていいかわからず、プログラムを改良しなければならないと思っていました。STARTIMEを長くすることも考えていましたが、それでは自然なライントレースを行うことができません。そこでロボットを少し改良しました。滑らかな動きができるようになり、一回も成功していなかったプログラムが成功するようになりました。