目次 #contents *課題2 黒い線に沿って動くロボット [#y3596a15] 各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する) 1. 紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) 2. 紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む **完成したロボット [#e015b271] 今回は各プログラムにつきパーツをかえてロボットをつくりました。 ***ノーマル [#z8140992] #ref(2009a/A3/課題2左/ノーマル.jpg,50%) ***恵のロボット(改善前) [#uff10e12] #ref(2009a/A3/課題2左/恵のロボット.jpg,50%) ***堀内のロボット [#bc0948b0] #ref(2009a/A3/課題2左/堀内のロボット.jpg,50%) ***改善前の光センサー [#uf094e72] #ref(2009a/A3/課題2左/光センサー.jpg,50%) ***ロボット作成において工夫した点 [#adda88b4] ロボットの本体は、小回りが利くようになるべく小さく、かつ頑丈に創りました。 バンパーは、テコの原理を用いて、なるべく低くしました。 **プログラムの説明 [#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_3, SENSOR_LIGHT ); //センサーの設定 ClearTimer(0); //タイマーを初期化 int flag; //交差点の名前 flag = 0; //交差点の値を0にしておく while( FastTimer(0) <= RUN_TIME ) //タイマーの時間を満たすまで { while ( SENSOR_2 == 1 ) //センサー2が反応する間 { OnFwd(OUT_B); //牛乳パックを捕まえる Wait(50); Off(OUT_B); if (flag==4 || flag==10 ) //もし4番目と10番目の交差点を通れば { GO; Wait(80); LEFT; Wait(170); //若干前に進み、左に180度回り、 OnRev(OUT_B); Wait(50); Off(OUT_B); //捕まえた牛乳パックを放す RIGHT; Wait(170); //右に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が黒のとき、flagに1を足して、前に進む { flag==flag+1; GO } } if ( SENSOR_1 > 40 && SENSOR_3 > 40 ) { GO } if ( SENSOR_1 < 40 && SENSOR_3 > 40 ) { LEFT } if ( SENSOR_1 > 40 && SENSOR_3 < 40 ) { RIGHT } if ( SENSOR_1 < 40 && SENSOR_3 < 40 ) { flag==flag+1; GO } } Off(OUT_A+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}; #comment