[[2009b]]写真は後日追加します。 #contents *課題 [#h3dfeb40] 光センサーを使って、ラインをトレース!~ 牛乳パックに負けず、安全確実、かつ颯爽と駆け抜けるロボットを作ろう。~ *チーム [#fe1787dc] -チーム名 「切なさと悲しさとロボティクス」~ ~ -メンバー紹介(「」内は課題にかける想い。)~ しんご (農学部) 「穴数えるの大変。」~ なかみう(教育学部)「シンプルがカッコワルいとは言わせない。」~ ~ *ロボット [#y7af0333] ロボットはシンプルに作った。~ この方針は最初から決定していたので、~ ロボットの大きな変更はなかった。~ ただ、パーツの不具合が多く、大変だった。~ ~ ~ &ref(GetAttachment6.jpg,left,アーム1); &ref(GetAttachment7.jpg,center,アーム2);~ ロボットのアーム ~ ~ #ref(./GetAttachment8.jpg,サイズ,本体) ロボットの本体。今回は基本のドライブベースを使用することにした ~ ~ #ref(./GetAttachment9.jpg,サイズ,画像の説明)~ 光センサー。今回はシンプルに板にセンサーを取り付け、それをロボットに挟み込んで装着するという方法をとった~ ~ ~ **なかみうのロボ~ [#d0729748] #ref(./ono.jpg,45%,なかみうロボ)~ これがなかみうのろぼ。~ 長いアームでがっちりキャッチします。~ 先端付近が曲がっているのは、牛乳パックを逃がさないため。~ ~ ~ *プログラム [#db4d08ee] **共通のプログラム [#j6f57639] 共通のプログラムを、なかみうが作成した。~ ~ 共通のプログラムは下の通り。~ ~ SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー(左) SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー(右) if((SENSOR_1 < white) && (SENSOR_2 < white)) //直進 {OnFwd(OUT_A+OUT_C);} if(SENSOR_1 < 0) //コースから右にそれたときの回復 {OnFwd(OUT_C); Float(OUT_A);} if(SENSOR_2 < 0) //コースから左にそれたときの回復 {OnFwd(OUT_A); Float(OUT_C);} if((SENSOR_1 < 0) && (SENSOR_2 < 0)) //交差点での停止&直進 {Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);} **オリジナルのプログラム [#n777f084] 共通プログラムのパーツを組み合わせ(改良して)~ オリジナルのプログラムを作った。~ 以下は、それぞれのプログラムと、本人による解説。~ ***しんごのプログラム [#f2889524] #define mae(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); 前進させる #define THRESHOLD 40 閾値 sub CUP() タッチセンサが反応したときの反応 {OnRev(OUT_C); 回転しパックを後ろにおき、自らは反転、レース上 に戻ります OnFwd(OUT_A);Wait(140); OnRev(OUT_A+OUT_C);Wait(100); OnRev(OUT_C); OnFwd(OUT_A); Wait(140); OnRev(OUT_A+OUT_C);Wait(100);} task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); 光センサ SetSensor(SENSOR_2, SENSOR_TOUCH); タッチセンサ SetSensor(SENSOR_3, SENSOR_LIGHT); 光センサ while (true) { if (SENSOR_2 == 1) {CUP();} if (SENSOR_1 < THRESHOLD) {OnFwd(OUT_C); Off(OUT_A); until (SENSOR_1 > THRESHOLD) ; } if (SENSOR_3 < THRESHOLD) { OnFwd(OUT_A); Off(OUT_C); until (SENSOR_3 > THRESHOLD) ; } if (SENSOR_1&& SENSOR_3 < THRESHOLD) {OnFwd (OUT_A+OUT_C);} else{OnFwd(OUT_A+OUT_C); } } } ***なかみうのプログラム [#gb976f48] #define white 40 //光センサーの値。 //これ以下は黒、これ以上は白。 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー:左 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー:右 int t = 0; //後で使う変数「 t 」 while( t <= 5 ){ // t が5以内で繰り返す。 //この t は最後の方にあります! //直進 if((SENSOR_1 > white) && (SENSOR_3 > white)){ OnFwd(OUT_A+OUT_C); } //コースから右にそれた時の処置(左に行きます) if(SENSOR_1 < white){ OnFwd(OUT_C); OnRev(OUT_A); Float(OUT_A+OUT_C); //このFloatは重要。 //Offではうまくいきません } //コースから左にそれた時の処置(右に行きます) if(SENSOR_3 < white){ OnFwd(OUT_A); OnRev(OUT_C); Float(OUT_A+OUT_C); } //交差点の通行 if((SENSOR_1 < white) && (SENSOR_3 < white)){ t = t + 1; //きました、「 t 」! Off(OUT_A+OUT_C); //5回目の後までは Wait(30); //交差点の後、コースを進む。 OnFwd(OUT_A+OUT_C); //6回目の後は、一番下のOffにいきます。 Wait(50); //ここも実はポイント。 PlaySound(SOUND_CLICK); //ピッと鳴ります。合図になります。 } } Off(OUT_A+OUT_C); //止まります。 } ~ -解説~ 全体的にシンプルさを意識した。~ 交差点を通る回数でロボを停止させるのは、なかなかの案だと思う。~ 交差点は、一回停止することでうまく通れるようになった。~ それた時の回復動作は、Float で手こずったが、意外とシンプル。~ 交差点のポイントは、最後の停止を考えて、~ OnFwdを「交差点のプログラム」に組み込んだこと。~ これで、交差点を通過した後、ちょうどコースを1周して止まれます。~ ~ *コース [#o92cde6a] コースはA1左グループと共同で作成した。~ 衝突もあったが、なんとかまとまった。~ ~ 完成したコースは、こちら。~ #ref(2009b/A1/課題2右/18.jpg,100%,コース)~ ~ ~ *コメントのコーナー [#t9fe79fd] - ロボット本体の説明は、写真がたくさんあるのはよいのですが、もう少し文章での説明が欲しいです(アームがどう動くのかとか…)。プログラムの説明がコメントになっていないところがあるのは気になります。変数を使っているところは、変数○であるということは見ればわかるので、なんのために使う変数で、どこで数字をどうしているのはなぜかという内容を書いてください。 -- [[こさか]] &new{2009-12-11 (金) 15:15:21}; - こさかさんが書いてある通りだと思います。また、プログラムの説明に関しては、ロボットがどのような動きをするのか、どうしてそのプログラムでロボットがタスクを達成できるのかを書いてください。一人目のプログラムでは、ちゃんと止まる仕組みも組み込むこと、ifの中にuntilは必要か考えてみて下さい。二人目では、ifの場合分けとその順番を考えてみてください -- [[FI]] &new{2009-12-18 (金) 15:21:40}; #comment