[[2016a/Member]]
#contents
*課題内容 [#za43c0bb]
黒線をトレースし定められたルートを通り、所定のゴールまでロボットを到着させることができるプログラミングを作成することが今回の課題である。
#ref(2016a-mission2.png)
**課されたルート [#y68ea0b0]
•B地点からC地点へ (二人目) ◦B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点

*ロボットの説明 [#p0daa1f0]
**全体像 [#r99fbad2]
#ref(2016a/Member/ayemos/Mission2/無題.pngasfasdfasdfadfasdfsdfa.png,50%,)
**ロボットの作成において工夫した点 [#pbd77cbd]
&ref(2016a/Member/ayemos/Mission2/無題.pngsdf.png,40%,);&ref(2016a/Member/ayemos/Mission2/無題.png,50%,);

後輪を一つにすることでカーブをする際の角度変更をスムーズにしました。

*プログラムの説明 [#sa1d7b3c]
**プログラムの全体 [#h5f6b73d]
 #define left Off(OUT_A); OnFwd(OUT_C);
 #define right Off(OUT_C); OnFwd(OUT_A);

 sub linetrace(){ SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15)/
 {if  (SENSOR_2<40){right;nOnline++;}else{left;nOnline=0;}Wait(1);} Off(OUT_A+OUT_C);/
 Wait(100);}
 
 sub gogo() {SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15)/
 {if (SENSOR_2<40){right;nOnline++;}else{left;nOnline=0;}Wait(1);}Off(OUT_A+OUT_C);/
 Wait (100);left;Wait(100);Off(OUT_A+OUT_C);Wait(100);}  
 
 sub leftleft() {SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15)/
 {if(SENSOR_2<40){left;nOnline++;}else{right;nOnline=0;}Wait(1);}Off(OUT_A+OUT_C);/
 Wait(100);right;Wait(120);Off(OUT_A+OUT_C);Wait(100);} 
 
 sub rightright() {SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15)/
 {if(SENSOR_2<40){right;nOnline++;}else{left;nOnline=0;}Wait(1);}Off(OUT_A+OUT_C);/
Wait(100);right;Wait(210);Off(OUT_A+OUT_C);Wait(100);}

 task main()
 {
 rightright();
 gogo();
 leftleft();
 rightright();
 rightright();
 gogo();
 OnFwd(OUT_A+OUT_C);
 Wait(30);
 Off(OUT_A+OUT_C);
 }

**動作の基本となる定義付け [#wa52dd35]
 #define left Off(OUT_A); OnFwd(OUT_C); #define right Off(OUT_C); OnFwd(OUT_A);
この2つが基本的に必要となるロボットの動作である事実上右回転と左回転を交互に行うだけでライントレースは可能だ。
**サブルーチンの説明 [#pf9b756b]
サブルーチンは交差点での動きを複数の一連の動作に分けるために使用した。
以下に示すのが交差点に差し掛かった時にロボットが止まるという、今回使用したのサブルーチンすべてに含まれている基盤となるプログラムである。
 { SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15){if  (SENSOR_2<40){right;nOnline++;}else{left;nOnline=0;}Wait(1);} Off(OUT_A+OUT_C);Wait(100);}
 { SetSensor(SENSOR_2,SENSOR_LIGHT);int nOnline=0;while(nOnline<15)/
 {if  (SENSOR_2<40){right;nOnline++;}else{left;nOnline=0;}Wait(1);} Off(OUT_A+OUT_C);Wait(100);}
カウントをはじめに設定し、センサーの値が40以下の時は右へ曲がりカウントを増やす。
40以上の時は左へと曲がりカウントをリセット。Wait(1)となっているので非常に細かい単位でのカウントとなるため微小な変化である交差点と通常のラインとの識別は容易となっている。カウントが15たまれば1秒停止するということになっている。なおここでのカウントとは黒いライン上での動作が一回終了したさいに増加する。通常のライン上では15以下のカウントでラインの外にはみ出て、左へと修正をすることでカウントをゼロにする。交差点では15回以上の動作が強要されるということだ。また、ライン外→右→ライン上→左→ライン外→右、、、の動作は、ライントレースをより誤作動なしに行うための工夫としてライン外→左→ライン上→右→ライン外→左と逆転させたプログラムも採用している。急なカーブで内側を通ることになるとロボットがカーブを交差点と誤認識してしまうため、場合に応じてトレースをする側を変更することが必要なのだ。より正確にカーブを曲がるためには外回りが重要である。
あとは交差点で左に曲がるのか右に曲がるのかはたまた直進するのかに応じて簡易なプログラムを付け足しているだけなので全体のプログラムのほうから4つのサブルーチンの違いを確認してもらいたい。
**メインとなるプログラムについて [#u8980488]
 task main()
 {
 rightright();
 gogo();
 leftleft();
 rightright();
 rightright();
 gogo();
 OnFwd(OUT_A+OUT_C);
 Wait(30);
 Off(OUT_A+OUT_C);
 }

初めはラインの右側をトレースするrightrightだ、初めの交差点Rに差し掛かり大幅に右折、次のカーブは同様に右側をトレースすれば外側を回れるのでそのまま大幅に右回転し、gogoでトレースの継続を続け、第二の交差点Qで直進、ここでトレース方法の変更が必要だ、次はラインの左側をトレースするleftleftに切り替える。交差点Pを過ぎれば残りは右側トレースで事足りるのでrightrightを二回繰り返す。ゴールではgogoでいったん直進しさらに距離を伸ばすために通常の全身をプログラミングして、動作の終了である。

*工夫・苦労した点&感想 [#p0a5062d]
**工夫・苦労した点 [#w4ddcb99]
障害として現れたのは急なカーブを交差点と誤認識してしまう点だった、改善策としてラインの右側をトレースするのと左側をトレースするプログラムを臨機応変に使い分けられるようにすることを思いつけたのが幸いだった。

**感相 [#p4ffc624]
前回よりも更に複雑なプログラミングが必要とされていたので、新たなプログラム(カウントなど)を一つ一つ使いこなすのに非常に苦労をし、辛い課題だった。しかし着実に自身のプログラミング技術が向上していることを実感できていることも事実である、成功したときは本当にうれしかった。
次の課題も頑張りたい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS