目次 [#l572f633] #contents *課題2 黒い線に沿って動くロボット [#y3596a15] 各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する) 1. 紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) 2. 紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む **コースの紹介 [#x232f32e] #ref(2009a/A3/課題2左/コース2.jpg,100%) Simple is best!ということでコースはなるべく簡単にしました。 **完成したロボット [#e015b271] 今回は各プログラムにつきパーツをかえてロボットをつくりました。 ***ノーマル [#z8140992] #ref(2009a/A3/課題2左/ノーマル.jpg,100%) ***恵のロボット [#uff10e12] #ref(2009a/A3/課題2左/恵のロボット1.jpg,100%) 牛乳パックはこのようにモーターBを使ってロボットの腕で抱きつく(?)みたいにつかみます。 #ref(2009a/A3/課題2左/恵のロボット2.jpg,100%) ***堀内のロボット [#bc0948b0] #ref(2009a/A3/課題2左/堀内のロボット.jpg,100%) ***ロボット作成において工夫した点 [#adda88b4] ロボットの本体は、小回りが利くようになるべく小さく、かつ頑丈に創りました。 バンパーは、テコの原理を用いて、なるべく低くしました。 by堀内(課題2の1) 牛乳パックが軽すぎて、タッチセンサーの制度を決めるのが難しかったのですが、そこはあえて牛乳パックには反応しないようにタッチセンサーを鈍くして、他のロボットとぶつかったときだけ反応するようにしました。 by恵(課題2の2) **プログラムの説明 [#kd62ac00] ***恵のプログラム [#he1cbf21] #define GO OnFwd(OUT_A+OUT_C); //前に進む #define LEFT OnRev(OUT_A); OnFwd(OUT_C); //左に曲がる #define RIGHT OnRev(OUT_C); OnFwd(OUT_A); //右に曲がる #define RUN_TIME 8000 //走る時間 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_1,SENSOR_LIGHT); //センサーの設定 ClearTimer(0); //タイマーの時間をクリアする int BORDER; BORDER = 0; //交差点の名前と、番号の設定 while (FastTimer(0)<=RUN_TIME) //80秒になるまで { if (SENSOR2=1) //センサー2(タッチセンサー)が反応すれば { Off(OUT_A+OUT_C); Wait(500); //まず止まって5秒待つ } if (BORDER==1||BORDER==5||BORDER==9) //1,5,9番目の交差点を通ると { OnFwd(OUT_B); Wait(80); Off(OUT_B); //モーターBを使い牛乳パックをつかむ } if (BORDER==2||BORDER==6||BORDER==10) //2,6,10番目の交差点を通ると { GO; Wait(100); //若干前へ進み LEFT; Wait(130); //180度回り OnRev(OUT_B); Wait(80); //モーターBで掴んでいた牛乳パックを離す RIGHT; Wait(130); //また180度回りまた黒い線を追う } if ( SENSOR_1 > 40 && SENSOR_3 > 40 ) //センサー1とセンサー3が両方白なら { GO //前へ進む } if ( SENSOR_1 < 40 && SENSOR_3 > 40 ) //センサー1が黒、センサー3が白なら { LEFT //左に曲がる } if ( SENSOR_1 > 40 && SENSOR_3 < 40 ) //センサー1が白、センサー3が黒なら { RIGHT //右に曲がる } if ( SENSOR_1 < 40 && SENSOR_3 < 40 ) //センサー1とセンサー3が両方黒なら { BORDER==BORDER+1; //BORDERに1を足して GO //前へ進む } } Off(OUT_A+OUT_B+OUT_C); //全てのモーターを止めて終了 } ***堀内のプログラム [#q40d9bdf] #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(90);Off(OUT_A+OUT_C); //左に回る #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(70);Off(OUT_A+OUT_C); //右に回る task main () { SetSensor ( SENSOR_1, SENSOR_LIGHT ); SetSensor ( SENSOR_2, SENSOR_TOUCH ); SetSensor ( SENSOR_3, SENSOR_LIGHT ); int flag=0; while(flag<12){ //交差点を12回通過する if (( SENSOR_1 > 40) && (SENSOR_3 > 40 )) { OnFwd(OUT_A+OUT_C); } //センサー1とセンサー3が白のとき直進する if(( SENSOR_1 < 40) && (SENSOR_3 > 40 )) { OnRev(OUT_A); OnFwd(OUT_C); } //センサー1が黒でセンサー3が白のとき左に回る if(( SENSOR_1 > 40) && (SENSOR_3 < 40 )) { OnRev(OUT_C); OnFwd(OUT_A); } //センサー1が白でセンサー3が黒のとき右に回る if(( SENSOR_1 < 40) && (SENSOR_3 < 40 )) { OnFwd(OUT_A+OUT_C); flag++; } //両方のセンサーが黒のときflagに1をたして直進する if (SENSOR_2==1) //タッチセンサーに触れた場合 { OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C); //後ろに下がる turn_right; OnFwd(OUT_A+OUT_C);Wait(120);Off(OUT_A+OUT_C); //前に進む turn_left; OnFwd(OUT_A+OUT_C);Wait(120);Off(OUT_A+OUT_C); //前に進む } } Off(OUT_A+OUT_C); //終了 } ***感想、反省点 [#p210bb9a] んー、なんか、ロボットの制作するのが意外と時間を食ったし、プログラムも若干、苦労しました;; でも自分的には、けっこうできた方だと思います。by恵 プログラムが自分にとってはとても難しかったです。 by堀内 **コメントお願いします [#f06c3a94] - プログラムのセンサーの閾値にしている数字は、定数にしておくとメンテナンス性が高まります。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:11:04}; - ロボットのほうもいろいろ工夫していて良いと思います。ただ、説明が少し足りないかと思います。Bのモーターは何をしているのか、どのように紙パックをつかむのか、コースを明確にしてください。 -- [[FI]] &new{2009-07-03 (金) 02:24:26}; - 恵さんのプログラムは、牛乳パックがおいてある交差点を変えても動作するのでしょうか…? -- [[こさか]] &new{2009-07-10 (金) 12:34:04}; - 書くべきことはかけています。ただ、牛乳パックを置いてある場所が決まっていないと運べないのでは少し汎用性が低いかもしれません。タッチセンサと光センサをうまく組み合わせて、交差点を決めなくても運べるようにしてください -- [[FI]] &new{2009-07-26 (日) 18:33:52}; - 書くべきことはかけています。ただ、牛乳パックを置いてある場所が決まっていないと運べないのでは少し汎用性が低いかもしれません。タッチセンサと光センサをうまく組み合わせて、交差点を決めなくても運べるようにした方が良いかと思います。 -- [[FI]] &new{2009-07-26 (日) 18:33:52}; #comment