2011a

目次

メンバー

  • さくらだ
  • ソリョン

課題3

課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって

転がす
最短距離で運ぶ

ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。
ボールを探す際にはラインに沿っても沿わなくてもよい。

ロボット制作過程

キャタピラ型

これは先生が授業中に言っていたモーター1つで方向転換も可能にしたロボットで、
バックするときだけ片方の車輪を止めることによって方向転換することができる。
しかし、このロボットは一方向にしか回転することができないので黒い線を追うことができないという弱点があったため没となった。

大車輪型

110708_1626~010.JPG

ボールをつかむためのアーム。
真ん中の黒いブロックにボールが触れるとタッチセンサーが反応してアームが閉じるようになっている。 しかし、このアームがボールを探しているときに外側でボールを弾いてしまい、邪魔になってしまった。

110708_1625~030.JPG

初めはモーターの位置がやや上だったので、腹をすらないために大車輪を用いた。
しかし、カーブをする時などに大車輪は横の摩擦が大きいため曲がらずにボツとなる。

110708_1625~010.JPG

この形を受け継ぐようにして最終形をつくった。

最終形

ue.jpg

周りの光の最大値を探すための光センサー。
ランタンと同じ高さにする工夫をしたことによって、若干だが感度が良くなった。

touch.jpg

アーム部分のタッチセンサー。ここでボールがきたのを感知する。
しかし、ボールだけでは黒いブロックを押すのに力不足であったために、
小さい車輪をおもりにして感度を上げた。

sita.jpg

ライントレースをするための部分。
今回はライントレースだけが目的ではなく、光の最大値を見つけるための目的もあったため、光センサーを1つだけしか使えなかった。

gear.jpg

車輪を小さくし、前のタイヤをなくすことでカーブのさいなめらかになるよう工夫した。
しかし、そのせいで前方の振り幅が大きくなるというデメリットもあった。

プログラム

さくらだ

#define go OnFwd(OUT_A+OUT_C);				//進む
#define turn_r OnFwd(OUT_C);OnRev(OUT_A);		//右に回頭
#define turn_l OnFwd(OUT_A);OnRev(OUT_C);		//左に回頭
#define stp Off(OUT_A+OUT_C);				//止まる
#define border 40						//白黒の境界  
int lmax = 0;				//光の最大値を記憶する関数
int tmax = 0;				//光の最大値をとる時間を記憶する関数
int lmax2 = lmax;				//ランタンに近づくための関数
task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);			//センサー1はライントレース用
SetSensor(SENSOR_2,SENSOR_TOUCH);			//センサー2はテニスボールを感知する用
SetSensor(SENSOR_3,SENSOR_LIGHT);			//センサー3は明るい場所を探す用
SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
	while(true){						//今回はライントレースが目的ではないので簡単なライントレースをする
		if(SENSOR_1 <= border){
		OnFwd(OUT_A);
		Float(OUT_C);
		}
		else{
		OnFwd(OUT_C);
		Float(OUT_A);
		}
	if(SENSOR_2 == 1){					//アームにボールが触れたとき
	OnFwd(OUT_B);					//アームでボールを掴む
	Wait(10);
	ClearTimer(0);
		while(FastTimer(0) <= 500){		
		PlaySound(SOUND_UP) ;
		turn_l;
			if(lmax <= SENSOR_3){
			lmax=SENSOR_3;
			tmax=FastTimer(0);		//回転して光の最大値を見つける
			PlaySound(SOUND_CLICK);
			}
		PlaySound(SOUND_DOUBLE_BEEP) ;
		}
	turn_r;
	Wait(500-tmax);
	go;
	until(SENSOR_3 < 40);
	PlaySound(SOUND_DOWN);	
	stp;
	OnRev(OUT_B);
	Wait(10);
	}
	}
}

ソリョン

#define THRESHOLD 40   // 閾値
task main ()
{  
 int check;
 int time; //turn to best bright
  int max; //save best bright
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);   
while(1)
{
	while(SENSOR_2 == 0)
    {
       if (SENSOR_1 < THRESHOLD)   //in black
         {   
           OnFwd(OUT_A+OUT_C);
           
         }       
             if (SENSOR_1 > THRESHOLD) //in white
         {   	
            
          check=1;
	ClearTimer(0);
	    while((Timer(0)<=5)&&(check))
              {	
		OnFwd(OUT_A);              //migini chotto magate michi wo sagasu
            OnRev(OUT_C);             
              if(SENSOR_1 < THRESHOLD)
                     {check=0;}
         }//while		
		 if(check==1)
		{ClearTimer(0);
		     while((Timer(0)<=10)&&(check))
          		    {	
				OnFwd(OUT_C);              //migini chotto magate michi wo sagasu
           	             OnRev(OUT_A);
           		      if(SENSOR_1 < THRESHOLD)
                	      {check=0;}	
          		  }//while
		}
         }//if
   }
   OnFwd(OUT_B);
      Wait(10);
	 Off(OUT_B);//catch
      time=0;
      max=0;   
     ClearTimer(0);
     while(FastTimer(0)<355) //turn360 and search brightest
      {
      OnFwd(OUT_A);
      OnRev(OUT_C);             
        if(max<SENSOR_3)
           {
             max=SENSOR_3;	
	        time=FastTimer(0);
	    }        
       } 
Off(OUT_A+OUT_C); 
PlaySound(SOUND_UP);
OnFwd(OUT_B);
      Wait(5);
	 Off(OUT_B);//catch
		  Wait(150);
ClearTimer(0);
    Off(OUT_A+OUT_C);    
      while(FastTimer(0)<time) //turn brightest
      {
      OnFwd(OUT_A);
      OnRev(OUT_C);                
       } 
     Off(OUT_A+OUT_C); 
      OnRev(OUT_B); //open hand
      Wait(10);
      Off(OUT_B);
       OnRev(OUT_A+OUT_C); //back
            Wait(50);
       OnFwd(OUT_A+OUT_C);//go and hit
            Wait(200);
      
      OnRev(OUT_A+OUT_C); //back to way
            Wait(150);
       Off(OUT_A+OUT_C);   	
}
}

工夫点や反省点

ソリョン

-道を探すプログラム
最初のプログラムの部分でセンサ1が40以下の黒い線の上にいるときは前進して白い部分に行った場合はtimerを
使ってまず右に回って黒い線を探します。探したらまたその探した道を前進しますがもし探してない場合は
(checkに入ってる数字で判断します1=探したor0=探してない次のwhile()に行って黒い線を探すまで左に回りま 
す。
-ボールを捕まるプログラム 
センサ2を使います。道を探すプログラムはwhile(SENSOR_2 == 0)によってくぐられていますがこれはセンサ2が認識
つまりボールを感じる前まではづっと道を行くことを意味します。でボールとあったてセンサ2が1になったら次のB
のモタを前に動かし手をしぼんで捕まります。
-番明るいところをさがすプログラム
ボールを掴んだ後ある実行するプログラムです。最初は360度を一回りしますが。センサ3は回る度中づっと光の大き
さをmaxに入れます。で、その時の時間も一緒にtimeにいれます。でif(max<SENSOR_3)を使って一番多い時だけ入力
するようにすれば最後には一番明るい時の光るさとその時の時間が残ります。で一回りした後一番明るかった時間を
利用しその位置まで回ります。
-ボールを打つプログラム
この部分はいま一番明るい部分に向かっているのでまずボールを放したあと、後ろに行ってまた前に前進しながら衝
突します。
-問題点
推進力が足りなかったためボールがうまく行きません。他の打つ時使えるモタが欲しいです。

さくらだ

今回は正確にライントレースをするのが目的ではなく、ライン上にあるボールを取ることが目的だったため、
ライントレース自体は非常に簡単なプログラムにまとめられた。
しかしそのプログラムによって前の振りが大きくなったことと相まって、
ライン上のボールを取るためのアームが逆にボールを弾いてしまい、カーブ先のボールなどが取りにくくなってしまったのは反省。
これは駆動輪を前方につけることなどにより前のふりを小さくして改善することができた。
ボールをとってからは光の最大値を見つけるために一度回転し、
それから光の最大値の場所へ500-tmaxを使って逆回転するプログラムを使った。
これによってちょうど一回転しなくともtmaxだった場所へと戻ることができるため、
正しい方向にロボットを向けることができた。

コメント



添付ファイル: fileue.jpg 159件 [詳細] filetouch.jpg 162件 [詳細] filesita.jpg 151件 [詳細] filegear.jpg 175件 [詳細] file110708_1626~010.JPG 166件 [詳細] file110708_1625~030.JPG 168件 [詳細] file110708_1625~020.JPG 88件 [詳細] file110708_1625~010.JPG 162件 [詳細] file110708_1626~01.JPG 108件 [詳細] file110708_1625~03.JPG 110件 [詳細] file110708_1625~02.JPG 101件 [詳細] file110708_1625~01.JPG 93件 [詳細] filelight2.nqc 67件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-08-04 (木) 18:45:34 (2936d)