[[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,ページ一覧)


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS