課題2目次 #contents *今回の課題 [#c1b03ade] #ref(2015a-mission2.png) 任意の地点からラインをたどって目標の任意の地点まで行く。その最中ボールをキャッチし目標の地点でゴールを決める。ただし交差点は直進することが条件。 *ロボットの説明 [#t37f6b59] **ライントレースロボット概要 [#w0838273] ロボットが急なカーブを曲がれるように、タイヤは後輪の2つのみで前輪部分はタイヤの代わりに滑りやすいパーツを使い極力摩擦を減らすようにした。 #ref(20150716_190437 2.jpg) ボールキャッチアームはタイヤを回転させることでボールをキャッチできるようにした。 **本体 [#w359c5f4] 後輪の2つのタイヤはそれぞれ違うモーターで動かす仕様になっている。そのためモーター1つのロボットに比べて今回のロボットはカーブで微妙な動きの調整ができるようになっている。 #ref(20150716_190026.jpg) **ボールキャッチアーム [#e7bcbfec] アームを動かす動力にはモーターを1つ使った。2つのタイヤを回転させることで、ボールを本体に引き寄せるようにキャッチできる。 #ref(1437052449142.jpg) **作成における工夫 [#mea281e0] ロボットの基本形でもプログラムを工夫すれば急なカーブを曲がることもできたかもしれないが、グループで話し合い自分たちで改良したロボットを作ろうと決めたこと。またタイヤを後輪のみにすることで、少しでもスムーズに曲がれるようにしたところ。 *プログラム [#daca1f06] #define naka 45 //境界線の明るさ #define kuro 40 //境界線と中央部の明るさ int nmax=10; //連続して左折してもよい回数 int n=0; //左折の回数 int e=0; //右折の回数20回以上でゴールしたと考える int S=0; //交差点に入った回数 task main() { SetPower(OUT_B,6); OnFwd(OUT_B); //アームの起動 SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー起動 while(e<=20) //ゴールしていない間繰り返す { { while((n<=nmax)&&(e<=20)){ //繰り返し if (SENSOR_2 < kuro){ //黒い部分に入った時 OnFwd(OUT_C); Off(OUT_A); n+=1; e=0; } //左旋回し、nを1増やしeをリセット if (SENSOR_2 > kuro){ //黒い部分に完全に入ってない時 if (SENSOR_2 < naka){ //境界線の内側 OnFwd(OUT_A); Off(OUT_C); n=0; e=0; //右旋回し、nとeをリセット } if (SENSOR_2 > naka){ //完全に白の上の時 OnFwd(OUT_A); OnRev(OUT_C); n=0; e+=1; //右を向きnをリセットしeを1増やす } } } while ((n>=nmax)&&(S==0)) //黒い部分に長い間いて一度も交差点に入っていないとき { PlaySound(SOUND_CLICK); Off(OUT_A); Off(OUT_C); Wait(200); //三又路なので2秒止まる n=0; nmax+=5; S=1; //nをリセットし、交点を1回増やし、基準変更 } while ((n>=nmax)&&(S==1)) //黒い部分に長い間いて一回交差点に入ったとき { PlaySound(SOUND_CLICK); Off(OUT_A); Off(OUT_C); //十字路で停止 n=0; nmax-=7; S=2; //nをリセットし、交点を1回増やし、基準変更 } while ((n>=nmax)&&(S==2)) //黒い部分に長い間いて二回交差点に入った時 { PlaySound(SOUND_CLICK); Off(OUT_A); Off(OUT_C); Wait(200); n=0; nmax+=10; S=3; //nをリセットし、交点の回数を1増やし、基準変更 } while ((n>=nmax)&&(S==3)) //黒い部分に長い間いて三回交差点に入った時 { PlaySound(SOUND_CLICK); Off(OUT_A); Off(OUT_C); n=0; //nをリセット } } } Off(OUT_A); Off(OUT_C); OnFwd(OUT_C); OnRev(OUT_A); //ゴールを向くように左を向く Wait(100); Off(OUT_A); Off(OUT_C); OnRev(OUT_B); //ボール発射 Wait(20); Off(OUT_B); } **ライントレース [#a9f01d71] 黒い線の左側を走行されるため、黒い部分に入ったときは左旋回させ、完全に白い部分、黒い部分と白い部分の境界は右旋回させるようにした。こうすることでCの手前の急カーブが曲がれるようになった。 **プログラムについて [#oedfb2cd] 今回はロボットの作成を中心に進めていたので、プログラムはグループのメンバーに助けてもらいながらなんとか出来ました。自分1人だけでは到底時間内にできなかったと思うので、やっぱりチームでの役割分担をはっきりとさせておいて良かったです。 **走行内容 [#d03f49d6] #ref(1437052446281 2.jpg) *問題点 [#q7ef6108] ボールを掴むときに2つのタイヤの間にうまく挟まらず、ボールを飛ばしてしまう可能性が高かった。改善の余地があると思う。また、しきい値が変化することで毎回プログラムの内容を変更しなければならなかったこと。