2010a

目次

第2回課題内容

黒い線に沿って動くロボット !

1.空き缶をコース上に戻して再びコースに戻って進む

2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

**注意点**

速さと正確さを追求すること

コースを1周したら自動的に止まること

交差点では一時停止すること

メンバーの紹介

カンウ 機械システム工学科

ドン 機械システム工学科

ロボットの紹介

最初の構想

ロボット

前回に本体がよく邪魔になってたので、置く場所を選ぶのに注意した。二つのギアをどうやって同時に逆方向の回転をさせるかを考えた。

プログラミング

1-horz.jpg

黒線をはさむように設計した。

センサーが両方白の上にあったら、直進するように考えた。


2gif.gif

曲線条件

片方だけが黒線を感知したらそっちの方に曲がるように考えた。


3-horz.jpg

交差点条件

同時に両方が黒線に入ったら、交差点条件が始まるように考えた。

失敗作

sippai.jpg

片方のギアを回すことでアームの逆回転をえられています。

失敗作の問題点

1.車体とアームの連結点がただひとつの部品でつながっているので、不安定だった。

2.ギアが空回りして、動力がうまく伝わらなかった。

3.タッチセンサーがむき出しで反応させることが難しかった。

最後の構造

kansei.jpg

工夫点と改善案

1.タッチセンサーがうまく作動しなかったので、ゴムをつけて作動しやすいようにかえた。

2.ネジみたいなギアをつけて、アームの動きを遅くすることができた。またアームの安定感を得られた。

3.ギアで対応できないところをゴムで対応させた。また空回りしなくなり、動力をうまく伝えるようにできた。

プログラミング

地図

map1.jpg

カンウ

#define THRESHOLD 41
int bump=0;								//缶の変数 1が持っている。0が持ってない
int search=0;							//探すの変数 両方かかった場合、1を足します。
sub ryoho(){								//交差点で缶を持ってるときと持ってないときの分別。
	if(bump>=1){							//缶を持っているとき。
		PlaySound(SOUND_CLICK) ;        		// ピッ
		Off(OUT_A+OUT_C); Wait(100);			//一回止まる。
		OnFwd(OUT_A+OUT_C); Wait(170);			//缶を交差点の上に置く過程。
		OnFwd(OUT_A); OnRev(OUT_C); Wait(215);	
		Off(OUT_A+OUT_C); Wait(30);
		PlaySound(SOUND_DOWN) ;         		// ピロピロ〜と低くなる音
		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(90);			//終わり。
		bump=0;						//缶を持ってない状態に戻す。
		ClearTimer(0);  
	}else{
		PlaySound(SOUND_DOUBLE_BEEP) ;			//両方になったら一回鳴く
		Off(OUT_A+OUT_C); Wait(100);
           OnFwd(OUT_A+OUT_C); Wait(30);
		Off(OUT_A+OUT_C);
		search++;
	}
}
sub bumper(){								//バンパー
		PlaySound(SOUND_UP) ;          				 // ピロピロ〜と高く音
		OnFwd(OUT_B); Wait(75);
		Off(OUT_B);
		bump++;							//バンパーが閉じたらaに1を出す。
}
task main()									//メインタスク。
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  ClearTimer(0);
  while( true ) {
      start go_line;	     					//始め
	until ((SENSOR_2 == 1) || (search==1) || (Timer(0)>=150));
	//タッチが反応したり、交差点に入ったり、タイマーが1.5秒を過ぎるまで、
	stop go_line;					      //一回とまる。
      if(SENSOR_2 == 1){	      				     //バンパーが反応するまで。
    		 Off(OUT_A+OUT_C); Wait(100);		
	  	 bumper();						//バンパーが動く。
	 }else if(search==1){					//交差点から出たら探すタスクにいきます。
		start sagasu;
	 	until((SENSOR_1 <= THRESHOLD) || (SENSOR_3 <= THRESHOLD));//黒線の発見
		search=0;						//search変数をゼロに戻します.
	 	stop sagasu;						//探すタスク終わり。
	 }else{
		break;							//交差点から出て1.5秒になったら止まります.
	}
  }
		Off(OUT_A+OUT_C);
		stop go_line;
}
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)) { //左
	    OnFwd(OUT_C);OnRev(OUT_A);
      } else {						//両方
		ClearTimer(0);  				//両方かかる場合はタイマーをリセットします。
		ryoho();					//両方サブルーチン始め。
        }
        Wait(5);
  }
}
task sagasu(){						//探すタスク始め
	OnFwd(OUT_C);OnRev(OUT_A);Wait(90);		//右に曲がります。
	OnFwd(OUT_A);OnRev(OUT_C);Wait(150);		//左に曲がります。
	Off(OUT_A+OUT_C);
}

ドン

#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(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(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==7)||(n==8)||(n==11)){//n=1,8,9,12の時
                        PlaySound(SOUND_UP);//ピロピロ〜と高く音
                        Wait(15);//0.15秒待つ
                        n++;//n=n+1 
                        golittle;//0.4秒前進する
                        Wait(30);//0.3秒待つ
                        turn_R;//右に曲がる
                       }
                   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;//その場で止まる
}                                                         

プログラム上の問題点

1.直角条件

4.jpg

コースにある直角を曲がることに問題があった。

図のように直角の端にセンサーがかかって、交差点条件が始まってしまう。

2.最後の止め方

…廠僂里擦い妊魁璽垢鬚靴辰り通ることができず、何回かの試行錯誤をするにつれて通るため、どこの交差点からタイマーをはかるということができない。

同じ理由で、最初の交差点から初めて交差点の数を数えながら最初の交差点に戻ってきたら止めるということは難しい。

解決案

1.直角条件

(竸nを設定し、一つ一つの交差点と直角に番号をつける。交差点と直角を通ったらnに1を足しながら、設定されてある番号に合わせて反応するようにする。

でもたまに直角がうまくいくことがあり、番号に合わなくなってしまう。

▲蹈椒奪箸自分で直角と交差点の違いを感知するようにする。交差点の前は直進するのに比べて、直角の前は曲線から始まってかかることを利用する。

でも交差点の前で必ず直進をするわけではなく、プログラミングがとても難しかった。

ロボットが自分で直角と交差点を別々で認知することではなく、両方かかったら少し進んで左右に回ることによってまた線に載せるようにする。これで一応コースをトレースすることはできた。

でも別々で認知することができないため、直角でも一時停止をしてしまう。また缶を持ってるとき、直角でも反応するようになってしまう。

kousa.gif
chokkaku.gif

****カンウは3番を、ドンは1番を使った。

右の図は3番を説明する絵です。

よいプログラムがなくて基本のものでやったので、汚いです。


2.止め方

〆埜紊妨鮑硬世覆靴猟垢ぅ魁璽垢△蝓△修海里△い世了間を利用する。

 交差点に入ったらタイマーをリセットし、一定の時間を過ぎたら停止させる。

¬簑蠹世2番をすこしなおして最初からうまく通る直角を計算しておく。

感想

カンウ

前回より急にレベルが高くなってちょっと苦労した。でも今回はプログラミングの方の比重が増えて考えるのがおもしろかった。パートナーと一緒に寮に住んでいるため、会う機会が多かったのがとてもよかった。前回より考えた時間が多かったけど、ギアの仕組みや車体を作るのはやっぱり難しかった。意外とプログラミングが簡単でうまくできてよかった。でもやっぱり直角は苦労させられた。

ドン

今回は本当にタッチセンサーがなかなか反応しないことに苦労させられた。また、アームの部分を同時に逆方向に動かすようにはどんな組み合わせのギアですればいいのかがなかなか決まらず大変だった。コースを直角に作成してしまったため直角のところででロボットが曲がるとき光センサーが同時に作動してしまうためプログラムするのがかなり大変だった。

コメント

コメントをお願いします。

  • イラストを使い、問題点と解決案も明確で良いと思います -- TAKA? 2010-07-02 (金) 17:10:38
  • ライントレースの原理もきちんとかいてあるし、問題点やその解決方法もわかりやすいです。プログラムの細かい部分の説明はできていると思いますが、フローチャートを使うなどして全体の構造をはっきりさせると、よりわかりやすくなるかもしれません -- FI? 2010-07-29 (木) 09:18:49


添付ファイル: filemap1.jpg 188件 [詳細] filechokkaku.gif 231件 [詳細] filekousa.gif 192件 [詳細] file2gif.gif 182件 [詳細] file2-horz.jpg 100件 [詳細] file3-horz.jpg 186件 [詳細] file1-horz.jpg 176件 [詳細] file2-1-horz.jpg 105件 [詳細] file4.jpg 182件 [詳細] filesippai.jpg 210件 [詳細] filemap.jpg 127件 [詳細] filekansei.jpg 216件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-29 (木) 09:18:49