[[2010a]] 目次 #CONTENTS *第2回課題内容 [#d3f3d0ac] <黒い線に沿って動くロボット ! <1.空き缶をコース上に戻して再びコースに戻って進む <2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む <**注意点** <速さと正確さを追求すること <コースを1周したら自動的に止まること <交差点では一時停止すること *メンバーの紹介 [#z8269518] <カンウ 機械システム工学科 <ドン 機械システム工学科 *ロボットの紹介 [#oefc8e56] **最初の構想 [#hd6aaf45] ***ロボット [#add3990c] <前回に本体がよく邪魔になってたので、置く場所を選ぶのに注意した。二つのギアをどうやって同時に逆方向の回転をさせるかを考えた。 ***プログラミング [#n0f0ae0b] #clear #ref(1-horz.jpg,around) <黒線をはさむように設計した。 <センサーが両方白の上にあったら、直進するように考えた。 #clear --------- #ref(2-horz.jpg,around) <曲線条件 <片方だけが黒線を感知したらそっちの方に曲がるように考えた。 #clear ------------ #ref(3-horz.jpg,around) <交差点条件 <同時に両方が黒線に入ったら、交差点条件が始まるように考えた。 #clear **失敗作 [#me0e9d2d] #ref(sippai.jpg) <片方のギアを回すことでアームの逆回転をえられています。 **失敗作の問題点 [#peaf2c48] <1.車体とアームの連結点がただひとつの部品でつながっているので、不安定だった。 <2.ギアが空回りして、動力がうまく伝わらなかった。 <3.タッチセンサーがむき出しで反応させることが難しかった。 **最後の構造 [#ob681c95] #ref(kansei.jpg) **工夫点と改善案 [#lc491af5] <1.タッチセンサーがうまく作動しなかったので、ゴムをつけて作動しやすいようにかえた。 <2.ネジみたいなギアをつけて、アームの動きを遅くすることができた。またアームの安定感を得られた。 <3.ギアで対応できないところをゴムで対応させた。また空回りしなくなり、動力をうまく伝えるようにできた。 *プログラミング [#s8dc0897] **地図 [#f5137852] #ref(map.jpg) **カンウ [#bc3be001] #define THRESHOLD 50 //未完成です。 int a; //缶の変数 1が持っている。0が持ってない int r; int l; sub kousa(){ //交差点で缶を持ってるときと持ってないときの分別。 if(a>=1){ //缶を持っているとき。 Off(OUT_A+OUT_C); Wait(100); //一回止まる。 OnFwd(OUT_A+OUT_C); Wait(140); //缶を交差点の上に置く過程。 OnFwd(OUT_A); OnRev(OUT_C); Wait(215); Off(OUT_A+OUT_C); Wait(30); OnRev(OUT_B); Wait(75); Off(OUT_B); OnRev(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(215); OnRev(OUT_A+OUT_C); Wait(80); //終わり。 a=0; //缶を持ってない状態に戻す。 }else{ Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); Wait(20); } } sub bumper(){ //バンパー OnFwd(OUT_B); Wait(75); Off(OUT_B); a++; //バンパーが閉じたらaに1を足す。 } task main() //メインタスク。 { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); while( true ) { start go_line; //始め until (SENSOR_2 == 1); //バンパーが反応するまで。 stop go_line; //一回とまる。 Off(OUT_A+OUT_C); Wait(100); bumper(); //バンパーが動く。 } } task go_line() //ラインタスク { while (true) { if ((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) { //直進 OnFwd(OUT_A+OUT_C); } else if ((SENSOR_1 >= THRESHOLD) && (SENSOR_3 <= THRESHOLD)) { //右 OnFwd(OUT_A); OnRev(OUT_C); } else if ((SENSOR_1 <= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) { //左 OnRev(OUT_A); OnFwd(OUT_C); } else { //両方 PlaySound(SOUND_DOUBLE_BEEP) ; //両方になったら一回鳴く kousa(); //交差点サブルーチン始め。 } Wait(1); } } **ドン [#ib97d455] #define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(195);Off(OUT_A+OUT_C);//180度回転する #define turn_R OnFwd(OUT_A);OnRev(OUT_C);Wait(95);Off(OUT_A+OUT_C);//90度右回転する #define turn_L OnFwd(OUT_C);OnRev(OUT_A);Wait(95);Off(OUT_A+OUT_C);//90度左回転する #define back OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C);//後退する #define go OnFwd(OUT_A+OUT_C);//前進する #define golittle OnFwd(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C);//0.4秒前進する #define stay Off(OUT_A+OUT_C);//その場で止まる #define arm_c OnFwd(OUT_B);Wait(75);Off(OUT_B);//アームを閉じる #define arm_o OnRev(OUT_B);Wait(75);Off(OUT_B);//アームを開く #define THRESHOLD 45//光センサーの境目を45とする task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//SENSOR_1を光センサーとする SetSensor(SENSOR_2,SENSOR_TOUCH);//SENSOR_2をタッチセンサーとする SetSensor(SENSOR_3,SENSOR_LIGHT);//SENSOR_3を光センサーとする while(true){ start go_line;//go_lineをする until(SENSOR_2==1);//SENSOR_2に一度あたるまで stop go_line;//go_lineを止める stay;//止まる arm_c;//アームを閉じる Wait(30);//0.3秒待つ turn;//180度回転する Wait(30);//0.3秒待つ arm_o;//アームを開く Wait(30);//0.3秒待つ back;//後退する Wait(30);//0.3秒待つ turn;//180度回転する } } task go_line() { int n=0;//変数nを0とする while(n<14){ Wait(30);//0.3秒待つ go;//前進する until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD));//SENSOR_1が45より小さくなる時またはSENSOR_3が45より小さくなる時まで stay;//その場で止まる if(SENSOR_1<THRESHOLD){ OnFwd(OUT_C);OnRev(OUT_A);//反時計まわりをする until((SENSOR_1>THRESHOLD)||((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))); //SENSOR_1が45より大きい時またはSENSOR_1が45より小さいときかつSENSOR_3が45より小さいときまで stay;//その場で止まる } if(SENSOR_3<THRESHOLD){ OnFwd(OUT_A);OnRev(OUT_C);//時計回りする until((SENSOR_3>THRESHOLD)||((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))); //SENSOR_3が45より大きい時またはSENSOR_1が45より小さいときかつSENSOR_3が45より小さいとき stay;//その場で止まる } if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ if((n==1)||(n==8)||(n==9)||(n==12)){//n=1,8,9,12の時 PlaySound(SOUND_UP);//ピロピロ〜と高く音 Wait(15);//0.15秒待つ golittle;//0.4秒前進する Wait(30);//0.3秒待つ turn_R;//右に曲がる } else if((n==3)||(n==4)){//n=3,4の時 PlaySound(SOUND_LOW_BEEP);//ブーという低い音 Wait(15);//0.15秒待つ golittle;//0.4秒前進する Wait(30);//0.3秒待つ turn_L;//左に曲がる } else{ PlaySound(SOUND_DOWN) ;// ピロピロ〜と低くなる音 Wait(150);//1.5秒まつ n++;//n=n+1 go;//前進する until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD));//SENSOR_1かつSENSOR_3が45より大きい時 stay;//その場で止まる } } } stay;//その場で止まる } **プログラム上の問題点 [#rd3f8265] #clear #ref(4.jpg,around,70%) <コースにある直角を曲がることに問題があった。 <図のように直角の端にセンサーがかかって、交差点条件が始まってしまう。 #clear *感想 [#sae75054] **カンウ [#a4ebb17e] <前回より急にレベルが高くなってちょっと苦労した。でも今回はプログラミングの方の比重が増えて考えるのがおもしろかった。パートナーと一緒に寮に住んでいるため、会う機会が多かったのがとてもよかった。前回より考えた時間が多かったけど、ギアの仕組みや車体を作るのはやっぱり難しかった。意外とプログラミングが簡単でうまくできてよかった。でもやっぱり直角は苦労させられた。 **ドン [#pd55337c] <今回は本当にタッチセンサーがなかなか反応しないことに苦労させられた。また、アームの部分を同時に逆方向に動かすようにはどんな組み合わせのギアですればいいのかがなかなか決まらず大変だった。コースを直角に作成してしまったため直角のところででロボットが曲がるとき光センサーが同時に作動してしまうためプログラムするのがかなり大変だった。 *コメント [#oc6239ad] <コメントをお願いします。 #COMMENT