- 追加された行はこの色です。
- 削除された行はこの色です。
**目次 [#rafa16c0]
#contents
*課題2ライントレースするロボットを作成せよ!! [#zf57fcd9]
~各チームで作成したコースを3周するロボットを製作。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成。(他のメンバーと重ならないように一人一つのプログラムを作成する)
~1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)
~2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
~ただし、
~・速さと正確さを追求すること
~・コースを3周したら自動的に止まること
**0,メンバー [#a38c4b9c]
Ds
~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