[[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 turn OnFwd(OUT_A);OnRev(OUT_C);Wait(200);Off(OUT_A+OUT_C);//180度回転する
 #define turn_R OnFwd(OUT_A);OnRev(OUT_C);Wait(85);Off(OUT_A+OUT_C);//90度右回転する
 #define turn_L OnFwd(OUT_C);OnRev(OUT_A);Wait(85);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 golittle OnFwd(OUT_A+OUT_C);Wait(60);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度回転する
                    back;//後退する
                   }
 }
 task go_line()
 { 
 {
      int n=0;//変数nを0とする
      while(n<14){
                  Wait(30);//0.3秒待つ
                  Wait(1);//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の時
                    if((n==1)||(n==7)||(n==8)||(n==11)){//n=1,8,9,12の時
                         PlaySound(SOUND_UP);//ピロピロ〜と高く音
                         Wait(15);//0.15秒待つ 
                         Wait(15);//0.15秒待つ
                         n++;//n=n+1 
                         golittle;//0.4秒前進する
                         Wait(30);//0.3秒待つ
                         turn_R;//右に曲がる
                        }
                    else if((n==3)||(n==4)){//n=3,4の時
                    else if((n==3)){//n=3の時
                         PlaySound(SOUND_LOW_BEEP);//ブーという低い音
                         Wait(15);//0.15秒待つ
                         n++;//n=n+1
                         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
1.
#ref(4.jpg,around,70%)
<コースにある直角を曲がることに問題があった。
<図のように直角の端にセンサーがかかって、交差点条件が始まってしまう。
#clear
***解決案 [#jb1072ea]
<1.変数nを設定し、一つ一つの交差点と直角に番号をつける。交差点と直角を通ったらnに1を足しながら、設定されてある番号に合わせて反応するようにする。
<でもたまに直角がうまくいくことがあり、番号に合わなくなってしまう。
<2.ロボットが自分で直角と交差点の違いを感知するようにする。交差点の前は直進に比べて、直角の前は曲線から始まる。
<2.ロボットが自分で直角と交差点の違いを感知するようにする。交差点の前は直進するのに比べて、直角の前は曲線から始まってかかることを利用する。
<でも交差点の前で必ず直進をするわけではなく、プログラミングがとても難しかった。
<3.ロボットが自分で直角と交差点を別々で認知することではなく、両方かかったら少し進んで左右に回ることによってまた線に載せるようにする。これで一応コースをトレースすることはできた。
<でも別々で認知することができないため、直角でも一時停止をしてしまう。また缶を持ってるとき、直角でも反応するようになってしまう。
------------------------
<僕達はこの中で一番完走可能性がたかい3番を使った。
*感想 [#sae75054]
**カンウ [#a4ebb17e]
<前回より急にレベルが高くなってちょっと苦労した。でも今回はプログラミングの方の比重が増えて考えるのがおもしろかった。パートナーと一緒に寮に住んでいるため、会う機会が多かったのがとてもよかった。前回より考えた時間が多かったけど、ギアの仕組みや車体を作るのはやっぱり難しかった。意外とプログラミングが簡単でうまくできてよかった。でもやっぱり直角は苦労させられた。
**ドン [#pd55337c]
<今回は本当にタッチセンサーがなかなか反応しないことに苦労させられた。また、アームの部分を同時に逆方向に動かすようにはどんな組み合わせのギアですればいいのかがなかなか決まらず大変だった。コースを直角に作成してしまったため直角のところででロボットが曲がるとき光センサーが同時に作動してしまうためプログラムするのがかなり大変だった。
*コメント [#oc6239ad]
<コメントをお願いします。
- イラストを使い、問題点と解決案も明確で良いと思います -- [[TAKA]] &new{2010-07-02 (金) 17:10:38};

#COMMENT


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