[[2009a]]へ戻る 目次 #contents *課題 [#f8f9a8d8] 黒い線上を進むロボットの製作。~ 詳細は[[2009a/練習問題]]、課題2の項を参照。 課題2−1のプログラムをdaikiが担当、課題2−2のプログラムを俺が担当 *メンバー [#o372f62e] -daiki -俺 *ロボット [#zbea3a80] **外観 [#jd6c3733] 全体 #ref(2009a/A5/課題2右/robo01.jpg,100%,全体) -[http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA5%2F%B2%DD%C2%EA%A3%B1%BA%B8 前回使用した機体]の腕を挿げ替えてタッチセンサーを付けただけ ~ #ref(2009a/A5/課題2右/robo02.jpg,100%,腕) -この鎌のような腕で牛乳パックを捕らえ、引きずっていく -発想は[http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA10%2F%B2%DD%C2%EA%A3%B2%BA%B8 この班]のものを拝借しました -違う点は、右の腕に誤って牛乳パックが触れてしまわないよう、腕をひっこめてある点と、コースの関係上タッチセンサー回りがより簡単な構造になっていることです。 -このことで、機体の重心が前に傾き過ぎず、滑らかに走ることができます。 ~ #ref(2009a/A5/課題2右/robo03.jpg,150%,タッチセンサー) -牛乳パックとの当たり判定をするタッチセンサーは、機体の上の方(赤の丸で囲われている部分)についています。これは腕と連動しています。 -牛乳パックが機体の下の方(青い丸で囲われている部分に)や腕に接触すると、タッチセンサーが反応する構造になっています。 *コース [#e97bcc63] 概要図 #ref(2009a/A5/課題2右/rosen.JPG,100%,コース) -交差点は3つ -3つの交差点をもつものの中では、最も簡単な形 -簡単な形ですので、機体の揺れなどは殆どなく、タッチセンサーが誤って反応してしまうようなことはありません。そのため、機体も簡単な構造にすることができました。 *プログラム [#y1cf4393] **daikiのプログラム [#sb789298] int SYOU; #define STOP_TIME 1500;//三周するまでの時間 task main() { SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサー2 SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサー1 SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサー3 SYOU = 0; ClearTimer(0); while (Timer(0)<STOP_TIME){//三周するまで続ける if(SENSOR_2==0){ if(SENSOR_1>40){ if(SENSOR_3>40){ OnFwd(OUT_A+OUT_C); } else{ OnFwd(OUT_A); Off(OUT_C); } }else{ OnFwd(OUT_C); Off(OUT_A); } if(SENSOR_1<40){ if(SENSOR_3<40){ OnFwd(OUT_A+OUT_C); } } }//センサー1と3で線を挟んで進むプログラム if(SENSOR_2==1){ if(SYOU==0){ OnRev(OUT_A+OUT_C); Wait(70);//パックから遠ざかる OnFwd(OUT_A); Wait(70); OnFwd(OUT_C); Wait(110);//パックを避けるため脱線 OnRev(OUT_A); Wait(70); OnFwd(OUT_A); Wait(250); OnRev(OUT_A); Wait(70); OnFwd(OUT_A); Wait(100); OnRev(OUT_C); Wait(85);//線路に戻る Off(OUT_A+OUT_C); }//1回目の衝突 if(SYOU==1){ OnRev(OUT_A+OUT_C); Wait(65);//パックから遠ざかる OnFwd(OUT_A); Wait(80); OnFwd(OUT_C); Wait(110);//パックを避けるため脱線 OnRev(OUT_A); Wait(75); OnFwd(OUT_A); Wait(250); OnRev(OUT_A); Wait(80); OnFwd(OUT_A); Wait(50); OnRev(OUT_C); Wait(85);//線路に戻る Off(OUT_A+OUT_C); }//2回目の衝突 if(SYOU==0){ SYOU = 1; }else{ SYOU = 0; } } } Off(OUT_A+OUT_C);//三周したら停止する } ~ ~ **俺のプログラム [#c0008c96] [http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA5%2F%B2%DD%C2%EA%A3%B2%B1%A6%2F%A5%D7%A5%ED%A5%B0%A5%E9%A5%E002 俺のプログラム](別ページに飛びます) //[[2009a/A5/課題1左/プログラム02]]へのリンク *コメントをどうぞ [#m8eee5ef] - コースが面白いですね。プログラムは改善の余地ありです。RUN_TIMEはプログラム内で数値が変わるので「変数」である必要がありますが、RUN_TIME_JやRUN_TIME_Fは変わらない数ですから、「定数」(define)の方が適当かと思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:20:37}; - 追記:動画すごくわかりやすいです! -- [[こさか]] &new{2009-07-02 (木) 22:21:08}; - プログラムにいろいろ工夫しているのがよいと思いますが、まだ改善点があります。何よりも、3周したら止まるようにしましょう。できれば、ロボットの説明も増やしましょう。-- [[FI]] &new{2009-07-03 (金) 03:05:12}; - 3周したら止まるというのを判断するのに、秒数を使っていると、モーターの具合やパックの摩擦などの条件で微妙に3周にならないことがあるかもしれません。もっと確実に3周を数える方法がないか考えてみてください! -- [[こさか]] &new{2009-07-10 (金) 12:10:50}; #comment #ls2(,link,ページ一覧)