[[2006a/B2]] #contents *ロボットの構造☆ [#w027d20f] **製作過程 [#d8f58e4d] ・今回は、タッチセンサーはシングルバンパーで、光センサーは二つ使うというアイデアはすんなりまとまった。 ・しかし、これらふたつのセンサーをどのようにつけるかで時間を食ってしまう・・・(泣) ・結局ロボット製作に二時間ほどかかってしまった。 **出来上がったロボット[#d52be7a1] &ref(kadai2.1.jpg); &ref(kadai2.3.jpg); ↑↑バンパーのついている方が前です。 **タッチセンサーの装着 [#i64439f4] &ref(kadai2.9.jpg); ←斜めから見た様子 &ref(kadai2.8.jpg); ←真横から見た様子 何かにぶつかったら、センサーのスイッチが入りタッチセンサーが作動する仕組みになってます。 **光センサーの装着 [#ad9f5061] &ref(kadai2.6.jpg); ←右側の光センサー &ref(kadai2.7.jpg); ←左側の光センサー &ref(kadai2.5.jpg); ←車体の裏から見た光センサー 二つの光センサーで、黒い線を挟み込むようにして黒い線の上を走行します。 右側の光センサーが黒い線を感知したら左側のモーターを正回転させ、 左側の光センサーが黒い線を感知したら右側のタイヤを正回転させて前に進みます。 *試作プログラム達♪♪[#f6858232] **障害物にぶつかったら反転するプログラム [#xe917385] シングルバンパーでの反転するプログラムです。 製作日//:06-6-14 製作者//:しげ task main() SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2がタッチセンサーと宣言 while(true) { OnFwd(OUT_A+OUT_C); until(SENSOR_2==1); //タッチセンサーが押されるまで直進 OnRev(OUT_A+OUT_C); //タッチセンサーが押された後、後退 Wait(20); OnRev(OUT_A); //モーターAを逆回転 Wait(200); OnFwd(OUT_C); //モーターCを正回転 Wait(190); OnFwd(OUT_A+OUT_C); //反転して直進 } } 床の摩擦によって多少動きにブレはあるが、ちゃんと反転してくれた↑↑ **黒い線の上を走行するライン・トレースのプログラム [#b9bd5fa9] 光センサー二つをつけたときのライン・トレースのプログラムです。 製作日//:06-6-14 製作者//:Blue task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3が光センサーと宣言 while(true) { if (SENSOR_1> 40) //光センサー1が黒い線まで来ていないとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } else //光センサー2が黒い線に来たとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } if (SENSOR_3>40) //光センサー3が黒い線まで来ていないとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } else //光センサー3が黒い線まで来たとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } } } } 動きはたどたどしいけれど、ちゃんと黒い線の上を走ってます! **追い越しのプログラム [#l2215d6f] 障害物にぶつかってから、追い越しをして黒い線上に戻るプログラムです。 製作日//:06-6-14 製作者//:Blue たか task main() { #define go_A(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);//右旋回 #define go_C(t) OnFwd(OUT_C);Wait(t);Off(OUT_C);//左旋回 #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off (OUT_A+OUT_C);//まっすぐ直進 #define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//まっすぐ後退 SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1が光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー3が光センサーと宣言 SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2がタッチセンサーと宣言 while(true) { OnFwd(OUT_A+OUT_C); until(SENSOR_2==1); //タッチセンサーが押されるまでまっすぐ前進 go_back(80); //まっすぐ後退 go_A(80); //左旋回 go_straight(80); //まっすぐ前進 go_C(80); //右旋回 go_straight(150); //まっすぐ前進 go_C(80); //右旋回 OnFwd(OUT_A+OUT_C); //タッチセンサー3が黒い線に来るまでまっすぐ前進 until(SENSOR_3<45); OnFwd(OUT_A); //左旋回 OnRev(OUT_C); until(SENSOR_1<40); //タッチセンサー1が黒い線を認識するまで左旋回 OnFwd(OUT_A+OUT_C); //まっすぐ前進 } } *いよいよ本プログラム・・・ [#a92562f1] **反転プログラム [#f8f7ab32] 製作日//:06-6-15 製作者//:しげ task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1が光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー2が光センサーと宣言 SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー3がタッチセンサーと宣言 while(true) { while(SENSOR_2==0) //センサー2が作動していない間 { if(SENSOR_1>40) //センサー1が白紙上にいるとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } else //センサー1が白紙上にいないとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } if(SENSOR_3>40) //センサー3が白紙上にいるとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } else //センサー3が白紙上にいないとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } } if(SENSOR_2==1); //センサー2が作動したとき { OnRev(OUT_A+OUT_C); //0.4秒間まっすぐ後退 Wait(40); OnFwd(OUT_A); //モーターAを正回転 OnRev(OUT_C); //モーターCを逆回転 until(SENSOR_1>40); //センサー1が白紙上に来るまで until(SENSOR_3<40); //センサー3が黒い線に来るまで } } } **追い越しプログラム [#j5191e0d] 製作日//:06-6-15 製作者//:Blue たか task main() { #define go_A(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); //モーターAを正回転 #define go_C(t) OnFwd(OUT_C);Wait(t);Off(OUT_C); //モーターCを正回転 #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off (OUT_A+OUT_C); //まっすぐ前進 #define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);Off (OUT_A+OUT_C); //まっすぐ後退 SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3が光センサーと宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2がタッチセンサーと宣言 while(true) { while(SENSOR_2==0) //センサー2が作動していないとき { if(SENSOR_1>40) //センサー1が白紙上にいるとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } else //センサー1が白紙上にいないとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } if(SENSOR_3>40) //センサー3が白紙上にいるとき { OnFwd(OUT_C); //モーターCを正回転 Off(OUT_A); //モーターAを静止 } else //センサー3が白紙上にいないとき { OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを静止 } } if(SENSOR_2==1); //センサー2が作動したとき { go_back(100); //1.00秒間まっすぐ後退 go_A(150); //モーターAを1.50秒間正回転 OnFwd(OUT_A+OUT_C); //モーターA、モーターCを until(SENSOR_3<45); //センサー3が黒い線にくるまで正回転 go_A(20); //モーターAを0.20秒間正回転 Off(OUT_C); //モーターCを静止 OnFwd(OUT_A); //モーターAを until(SENSOR_1<40); //センサー1が黒い線にくるまで正回転 } } } *発表の様子 [#y1d67d61] &ref(kadai2.10.jpg); ↑下のマシンが自分達のものです。 &ref(kadai2.11.jpg); ↑↑ぶつかっている瞬間の衝撃映像 結局失敗に終わるかと思った今回の課題だが、またも大成功をおさめてしまった。 前回同様、ギリギリでうまいこといくロボットである。。。 *考察 [#cd9a4178] **工夫した点 [#f6861995] ・光センサー二つを用いて、黒い線をまたぐ方式にしたおかげで、動きのイメージはつきやすかった。 ・追い越しの仮想障害物マシンとして、500mlペットボトル二本を並べて使用。サイズ的にぴったりだったので実験しやすかった。 ・黒い線のサーキットは、普段お世話になっているということで、アップルコンピュータのシンボルマークを採用。 *形は若干かえております・・・。 **難しかった点 [#la0aa674] -whileを使ってどのように打ち込んで無限ループにしたらいいかわからなかった。 とにかく何度も試行錯誤を繰り返し、思い通りの動きにすることに成功 -どんなサーキットにするか非常に悩む。 家、キノコ、食パンマンなど候補は色々あったが、リンゴのマークが目に留まり、即採用。あっけない結末。。。 -追い越しをかけて、そのままコースアウト 光センサーにより解決。追い越したら、黒い線に来るまで直進し、 右側の光センサーが黒い線を感知したら、左センサーが再び黒い線を感知するまで左旋回して、再びコースに戻ることに成功!! **今後の課題 [#iebb87e2] ・前回と同じだが、プログラミングの完成がギリギリだったので、余裕をもって完成させたい。 ・ホームページに変化や特徴が感じられないので、おもしろみのあるものにしたい。 **感想 [#x0b64520] ・今回はマシンも早くできて、黒い線の上をたどるのも難なく出来たので割と楽に終わると思った。 ところがそんなことなかった。 特に黒い線をたどりながらの追い越しには手を焼いた。どのようにライン上に戻すかで苦戦した。 -コメントをお願いします #comment