2009a/A2/課題2左
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2009a/A2/課題2左]]
**目次 [#q77653ee]
#contents
*課題2:黒い線に沿って動くロボット † [#ad0779ed]
各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)
2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい)
ただし、速さと正確さを追求すること
コースを3周したら自動的に止まること
*コースについて [#k0fbe68c]
↓↓最初のコース
#ref(090619_180927~000.jpg)
交差点が直角じゃないとうまくライントレースできないと思い...
コース変更!
#ref(090619_180914.jpg)
うまくライントレースするようになりました。
*ロボットについて [#vc6a8a90]
まずは光センサーについて
~ななめから...
#ref(090625_205755.jpg)
~この位置に光センサーを付けました。
~正面から...
#ref(090625_205710.jpg)
~1個ではなく、2個でラインを挟むように付けました。
~下からの図...
#ref(090625_205730.jpg)
うまくライントレースできます。
~次はタッチセンサーについて
~まずは斜めから...
#ref(090617_201342.jpg)
~紙パックをつかむようにしたのですがうまくいかず、単純に押すようにしました。
~正面から...
#ref(090617_201415.JPG)
この長さが、ちょうど紙パックに反応する長さだった。これ以上長くすると、走っているときに振動でタッチセンサーが発動してしまいます。
*プログラムの説明 [#w325b54a]
**Fahimのプログラム [#f8d2d085]
#define gofront(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
#define goback(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
#define gostraight OnFwd(OUT_A+OUT_C);
#define close OnRev(OUT_B);Wait(40);Off(OUT_B);
#define open OnFwd(OUT_B);Wait(40);Off(OUT_B);
#define THRESHOLD 40
int x = 0;
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
SetPower(OUT_A,5);
SetPower(OUT_C,5);
while (true) {
gostraight
OnFwd(OUT_B);
if (SENSOR_1 < THRESHOLD) { //左の光センサー黒い線の上にあるとき
OnRev(OUT_A);
Wait(3);
OnFwd(OUT_A);
} else if (SENSOR_3 < THRESHOLD) { //右のセンサー黒い線のにあるとき
OnRev(OUT_C);
Wait(3);
OnFwd(OUT_C);
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //交差点のにあるとき
gofront(20)
x = x + 1;
}else if (SENSOR_2 == 1) { //牛乳パックにぶつかったとき
ClearTimer(0);
goback(110)
gofront(70)
} else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) {
Float(OUT_A+OUT_C+OUT_B);
close
OnRev(OUT_B);
gofront(120)
OnFwd(OUT_C);OnRev(OUT_A);
Wait(200);
Float(OUT_A+OUT_C);
Off(OUT_B);
open
goback(70);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(130);
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x ==2)){
Float(OUT_A+OUT_C);
break;
}
}
}
**naotoのプログラム [#obbaec46]
#define THRESHOLD 45 //しきい値を決める
int flag = 0; //ループを抜け出すためのフラグ用変数
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT ); //センサー1を光センサーに
SetSensor (SENSOR_2, SENSOR_TOUCH ); //センサー2をタッチセンサーに
SetSensor (SENSOR_3, SENSOR_LIGHT ); //センサー3を光センサーに
While ( flag < 19 ){ //交差点を19回通ったら停止(3周なので)
if ( SENSOR_2 == 1 ){ //タッチセンサーが発動したら
OnRev(OUT_A+OUT_C);
Wait(100);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(250);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100);
OnFwd(OUT_A+OUT_C);
Wait(250);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50); //紙パックを避けるプログラム
}
else{ //タッチセンサーが発動してない場合
if ( SENSOR_1 > THRESHOLD ){ //右センサーは白で、
if ( SENSOR_3 > THRESHOLD ){ //左センサーも白なら
OnFwd(OUT_A+OUT_C); //直進
}
else { //左センサーは黒なら
OnFwd(OUT_A);
Off(OUT_C); //左のほうに曲がる
}
}
else { //右のセンサーは黒で
if ( SENSOR_3 > THRESHOLD ){ //左センサーは白なら、
Off(OUT_A);
OnFwd(OUT_C); //右のほうに曲がる
}
else { //左センサーも黒なら
OnFwd(OUT_A+OUT_C);直進
flag++; //交差点カウンター+1
}
}
}
}
Off(OUT_A+OUT_C); //終わり!!
*感想・反省 [#n1f13efb]
ちょうど3周したときに止まるにはどうすればいいかをすごく悩みましたが、交差点を通った数にするようにしました。ロボットも工夫したので、見てほしいです。(naoto)
*コメント欄(ご自由にどうぞ) [#u202109c]
- 更新しました。 -- [[naoto]] &new{2009-08-09 (日) 14:01:33};
- 全体として必要なことはかけていると思います。Fahimさんのプログラムの中でタイマーや変数xがどんな働きをしているのかが良くわかりませんので説明をしていただきたいです。 -- [[こさか]] &new{2009-08-09 (日) 21:59:09};
#comment
終了行:
[[2009a/A2/課題2左]]
**目次 [#q77653ee]
#contents
*課題2:黒い線に沿って動くロボット † [#ad0779ed]
各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)
2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい)
ただし、速さと正確さを追求すること
コースを3周したら自動的に止まること
*コースについて [#k0fbe68c]
↓↓最初のコース
#ref(090619_180927~000.jpg)
交差点が直角じゃないとうまくライントレースできないと思い...
コース変更!
#ref(090619_180914.jpg)
うまくライントレースするようになりました。
*ロボットについて [#vc6a8a90]
まずは光センサーについて
~ななめから...
#ref(090625_205755.jpg)
~この位置に光センサーを付けました。
~正面から...
#ref(090625_205710.jpg)
~1個ではなく、2個でラインを挟むように付けました。
~下からの図...
#ref(090625_205730.jpg)
うまくライントレースできます。
~次はタッチセンサーについて
~まずは斜めから...
#ref(090617_201342.jpg)
~紙パックをつかむようにしたのですがうまくいかず、単純に押すようにしました。
~正面から...
#ref(090617_201415.JPG)
この長さが、ちょうど紙パックに反応する長さだった。これ以上長くすると、走っているときに振動でタッチセンサーが発動してしまいます。
*プログラムの説明 [#w325b54a]
**Fahimのプログラム [#f8d2d085]
#define gofront(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
#define goback(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
#define gostraight OnFwd(OUT_A+OUT_C);
#define close OnRev(OUT_B);Wait(40);Off(OUT_B);
#define open OnFwd(OUT_B);Wait(40);Off(OUT_B);
#define THRESHOLD 40
int x = 0;
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
SetPower(OUT_A,5);
SetPower(OUT_C,5);
while (true) {
gostraight
OnFwd(OUT_B);
if (SENSOR_1 < THRESHOLD) { //左の光センサー黒い線の上にあるとき
OnRev(OUT_A);
Wait(3);
OnFwd(OUT_A);
} else if (SENSOR_3 < THRESHOLD) { //右のセンサー黒い線のにあるとき
OnRev(OUT_C);
Wait(3);
OnFwd(OUT_C);
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //交差点のにあるとき
gofront(20)
x = x + 1;
}else if (SENSOR_2 == 1) { //牛乳パックにぶつかったとき
ClearTimer(0);
goback(110)
gofront(70)
} else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) {
Float(OUT_A+OUT_C+OUT_B);
close
OnRev(OUT_B);
gofront(120)
OnFwd(OUT_C);OnRev(OUT_A);
Wait(200);
Float(OUT_A+OUT_C);
Off(OUT_B);
open
goback(70);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(130);
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x ==2)){
Float(OUT_A+OUT_C);
break;
}
}
}
**naotoのプログラム [#obbaec46]
#define THRESHOLD 45 //しきい値を決める
int flag = 0; //ループを抜け出すためのフラグ用変数
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT ); //センサー1を光センサーに
SetSensor (SENSOR_2, SENSOR_TOUCH ); //センサー2をタッチセンサーに
SetSensor (SENSOR_3, SENSOR_LIGHT ); //センサー3を光センサーに
While ( flag < 19 ){ //交差点を19回通ったら停止(3周なので)
if ( SENSOR_2 == 1 ){ //タッチセンサーが発動したら
OnRev(OUT_A+OUT_C);
Wait(100);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(250);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100);
OnFwd(OUT_A+OUT_C);
Wait(250);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50); //紙パックを避けるプログラム
}
else{ //タッチセンサーが発動してない場合
if ( SENSOR_1 > THRESHOLD ){ //右センサーは白で、
if ( SENSOR_3 > THRESHOLD ){ //左センサーも白なら
OnFwd(OUT_A+OUT_C); //直進
}
else { //左センサーは黒なら
OnFwd(OUT_A);
Off(OUT_C); //左のほうに曲がる
}
}
else { //右のセンサーは黒で
if ( SENSOR_3 > THRESHOLD ){ //左センサーは白なら、
Off(OUT_A);
OnFwd(OUT_C); //右のほうに曲がる
}
else { //左センサーも黒なら
OnFwd(OUT_A+OUT_C);直進
flag++; //交差点カウンター+1
}
}
}
}
Off(OUT_A+OUT_C); //終わり!!
*感想・反省 [#n1f13efb]
ちょうど3周したときに止まるにはどうすればいいかをすごく悩みましたが、交差点を通った数にするようにしました。ロボットも工夫したので、見てほしいです。(naoto)
*コメント欄(ご自由にどうぞ) [#u202109c]
- 更新しました。 -- [[naoto]] &new{2009-08-09 (日) 14:01:33};
- 全体として必要なことはかけていると思います。Fahimさんのプログラムの中でタイマーや変数xがどんな働きをしているのかが良くわかりませんので説明をしていただきたいです。 -- [[こさか]] &new{2009-08-09 (日) 21:59:09};
#comment
ページ名: