**目次 [#rafa16c0] #contents *課題2ライントレースするロボットを作成せよ!! [#zf57fcd9] ~各チームで作成したコースを3周するロボットを製作。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成。(他のメンバーと重ならないように一人一つのプログラムを作成する) ~1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) ~2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む ~ただし、 ~・速さと正確さを追求すること ~・コースを3周したら自動的に止まること **0,メンバー [#a38c4b9c] ~Ds ~Ms **1,ロボットの概要 [#p8ab4222] 今回はなるべく小型になるようにしました ***第一段階 [#t54a8e0a] ~タイヤをなるべく近くに寄せて小型化を図る。 #ref(2009a/A3/課題2右/タイヤ部分.jpg) ~出来た結果がこれ↓ #ref(2009a/A3/課題2右/第一段階.jpg) またバンパーに突起物を付けて反応しやすいように設計。 ~ところが、このタイヤだと小回りが利かないためタイヤを変えることに。 ***第二段階 [#tddef165] ~タイヤを小型のものにして、小回りが利くように設計。 ~ところがギアをうまく組むことが出来ず、やむなく後輪駆動に。 ~(見づらいですが後輪駆動になってます)↓ #ref(2009a/A3/課題2右/第二段階(最終形態).jpg) ~このときから、紙パックを運ぶための角(?)をつけた。 ~ところが今度は前輪の力がないため、カーブを曲がりきれないため、またしても改良。 ***第三段階 [#i7eef119] ~モーターを後ろに取り付けることでギアの問題を解決。 #ref(2009a/A3/課題2右/タイヤ&モーター.jpg) ~ところがこれだと後ろに重心がいってしまうので、補助タイヤを設置。 #ref(2009a/A3/課題2右/補助タイヤ.jpg) ~また、バンパーがうまく作動しないことがわかったので、さらに改良。 #ref(2009a/A3/課題2右/バンパー.jpg) ~(写真だと牛乳パックになってますが、紙パックの間違いです(^^;)) ~できたのがコレ↓ #ref(2009a/A3/課題2右/第三段階(今度こそ最終形態).jpg) ~今度はバンパーが反応しすぎるため、再度改良。 #ref(2009a/A3/課題2右/改良バンパー.jpg) **2,コースについて [#p45dc257] ~なにも言うことはあるまい・・・。 #ref(2009a/A3/課題2右/コース.jpg) ~見てのとおりです。 **3,プログラムについて [#y8237184] ***Dsの作ったプログラム [#l770a664] ~障害物に当たったらそれを次の交差点まで運ぶプログラム(つまり2番のプログラム)。 ~先にライントレースの基礎部分を書いたが、その後障害物に対するプログラムを作るのに一苦労(ToT) ~(このプログラムは途中経過です) #define BORDER 40 //閾値を設定 #define TIME 500 //タイマーの時間を設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); //それぞれのセンサーを指定 int flag=0; while(flag<12){ //交差点を12回(3周)するまで繰り返します。 if(SENSOR_1>BORDER) {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} //センサーが両方白なら直進 else {OnFwd(OUT_A);OnRev(OUT_C);} //右が黒なら右折 } else{ if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} //左が黒なら左折 else{OnFwd(OUT_A+OUT_C);flag++;} //両方黒ならflagを1足して直進。 } if(SENSOR_2==1) //紙パックにぶつかったら {OnFwd(OUT_A+OUT_C);Wait(90);flag++; //交差点を通り越してflagを1足して、 until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER)){ if(SENSOR_1>BORDER){ if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} else {OnFwd(OUT_A);OnRev(OUT_C);} } else{ if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} } } //交差点までライントレース OnRev(OUT_A+OUT_C);Wait(50); //少し下がって OnFwd(OUT_A);Wait(30); //右を向いて OnFwd(OUT_C);Wait(90); //進んで OnRev(OUT_A);Wait(60); //左向いて OnFwd(OUT_A);Wait(90); //また進んで OnRev(OUT_C);Wait(30); //もう一回進んで OnRev(OUT_A);Wait(70); //ちょっと下がって紙パックを交差点に押し戻し、 flag++; //flagを1足す。 } } ClearTimer(0); while(Timer(0)<=TIME) {if(SENSOR_1>BORDER) {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} else {OnFwd(OUT_A);OnRev(OUT_C);} } else {if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} else {OnFwd(OUT_A+OUT_C);} } } Off(OUT_A+OUT_C);} //12回交差点を通ったら、少し進んで終了!! ~タッチセンサーの感度に踊らされ、運送プログラムの設定に頭を悩まされた。 ***Msの作ったプログラム [#l770a664] #define THRESHOLD 40 //閾値設定 task main() { int i; i=0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); while(true){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_A+OUT_C); //線上を直進 }else{ if(SENSOR_1<THRESHOLD){ Off(OUT_A); OnFwd(OUT_C); //左折 }else{ if(SENSOR_3<THRESHOLD){ Off(OUT_C); OnFwd(OUT_A); //右折 } } while(i<12){ //障害にぶつかった時(交差点12回で3周) if(SENSOR_2==1){ OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); Wait(300); //一旦下がって待つ OnFwd(OUT_A); Off(OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); Wait(50); OnFwd(OUT_C); Off(OUT_A); Wait(50); OnFwd(OUT_C); Off(OUT_A); Wait(50); OnFwd(OUT_A+OUT_C); //回り込む i=i+1; } if(i==12){ Off(OUT_A+OUT_C); //3周したら止まる } }}}} **4,良かった点 [#t155d8f5] **5,苦労した点・反省点 [#kb399b1b] ~タッチセンサーを如何に反応させるかが今回最大の問題点だった。byDs *コメントをどうぞ [#pffdc37f] - 間に合わないかもしれません;; -- [[A3R Ds]] &new{2009-06-18 (木) 15:37:50}; #comment