[[2008b]] *ライントレースロボット(黒い線に沿って動くロボット)の作成 [#i9078868] 各チームで作成したコースに沿って動くロボットを作成する。ただし、 -速さと正確さを追求すること -交差点で優先側を走っていない場合には、一時停止すること -前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと -コースを2周したら自動的に止まること **目次 [#a45ea9ef] #contents **方針 [#z018e9bc] ロボットもプログラムもあまり複雑になりすぎない、簡潔なものを目指す。 **コース [#pedac8b4] 交差点は全部で4つ。きついカーブをおりまぜた難易度やや高めのコースを作成した。 &ref(2008b/A5/課題2右/081202_203355.jpg,100%,course); **ロボット [#l5d74869] -基礎部分 この課題では小回りが利くことが求められるため、3輪駆動を採用した。 -光センサ ライントレースをするのに必要。今回は2つの光センサを使用した。 &ref(2008b/A5/課題2右/081204_1645082.jpg,100%,machine1); -タッチセンサ ほかのロボットとの衝突などを想定してバンパーを搭載。今回、シングルバンパーを採用したため、タッチセンサは1つだけ使用した。 &ref(2008b/A5/課題2右/081204_1642312.jpg,100%,machine2); **プログラム [#w0477c1d] 2周したあとロボットを停止させるために関数を用いた。また、ほかのロボットと衝突した際の動き(衝突→後退→しばらく停止→前進して元の位置に戻る)を工夫した。 #define THRESHOLD 40 //閾値を40に設定 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ1が光センサであると宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2がタッチセンサであると宣言 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ3が光センサであると宣言 int count; count=0; int count_max=8; while(true) { until(count>=count_max){ //(※)の回数が8回になるまで以下の命令を繰り返す if (SENSOR_1<THRESHOLD) { OnRev(OUT_A); OnFwd(OUT_C); } //センサ1が閾値よりも小さな値を示す、すなわち左の光センサが黒いラインを感知したら左に曲がる if(SENSOR_3 <THRESHOLD){ OnRev(OUT_C); OnFwd(OUT_A); } //センサ3が閾値よりも小さな値を示す、すなわち右の光センサが黒いラインを感知したら右に曲がる if((SENSOR_1 <THRESHOLD)&&(SENSOR_3 <THRESHOLD)){ Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C);Wait(50);count=count+1;} //センサ1とセンサ3が閾値よりも小さな値を示す、 すなわち両側の光センサが黒いライン(交差点)を感知したら一時停止した後しばらく前進する・・・・・・・(※) if(SENSOR_2==1){ OnRev(OUT_A+OUT_C) ; Wait(50); Off(OUT_A+OUT_C); Wait(150); OnFwd(OUT_A+OUT_C) ;Wait(50);} //タッチセンサが反応、すなわちバンパーに何かがぶつかったら後退し、少し待ってから再び前進する else { OnFwd(OUT_A+OUT_C);}} //上記以外は前進する Off(OUT_A+OUT_C);} //(※)の回数が8回になったら止まる } **その後の改良 [#i38dcfe8] **反省&感想 [#c42ede4b] コメントをどうぞ - よくできています。その他の改良の欄が空白ですが書き忘れですか? -- [[なかむら]] &new{2008-12-11 (木) 13:57:46}; #comment