目次

課題

白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)

1. 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。

2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。

ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。

ロボット

1.ロボットボディー

all.jpg
ーロボットの全体模様ー
基本的なボディーの上にコントロールキットをついた後でセンサーはその上についた。
コントロールキットの上にまた発射台もついた。


front.jpg
ーロボットの前模様ー
前についている光センサー二つ


back.jpg
ーロボットの後ろ模様ー
車輪の模様。回転しやすいために一つ車輪を使った。


side.jpg
ーロボットの横模様ー
発射台の模様と車輪が見えること。


body.jpg
ーロボットの基本的なボディーー
これに基づいてロボットを作った。


sensor.jpg
ーロボットのセンサー部分ー
光の干渉を避けるためにセンサーの間の距離を遠くした。


2.発射機

shoot_front.jpg
ー発射台の前模様ー
ブロックが出る入り口。


shoot_side.jpg
ー発射台の横模様ー
ブロック三個を入れれる模様。


shoot_back.jpg
ー発射台の後ろ模様ー
モーターを発射機に直接ついてパワフルに発射できるようにした。


shootting.jpg
ー発射台の作動原理ー
モーターを使ってロボットの腕を曲がってブロックを打つ。 


プログラム

1.懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる

  • 発射機のモターを動作させてブロックを投げる。
    sub Shoot ()
    {
    	OnRev ( OUT_C );
    	Wait ( 100 );
    	PlaySound ( SOUND_DOUBLE_BEEP );
    	Off ( OUT_C );
    }  
task main ()
{
	int iDegreeOfLight = 60;
 	int iAverage;
	
	SetSensor ( SENSOR_1, SENSOR_LIGHT );
	SetSensor ( SENSOR_3, SENSOR_LIGHT );
	
    // 懐中電灯が現れる前まで待っている
	until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
		PlaySound ( SOUND_CLICK );
	}
	
	while ( 1 ) 
	{              
		if ( SENSOR_1 > SENSOR_3 )
		{
			iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
			while (  SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage  - 1	)
	 		{				
				OnFwd ( OUT_B );
			}			
		}
		else
		{
                      // ロボットが左折だけできるから
                      // 懐中電灯がロボットの右側にあったら一回転して光を探す。
			OnFwd ( OUT_B );
			Wait ( 280 );
		}
		Off ( OUT_B );
		Shoot ();
		break;
	}
	
}

2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

  • 発射機のモターを動作させてブロックを投げる。
    sub Shoot ()
    {
    	OnRev ( OUT_C );
    	Wait ( 100 );
    	PlaySound ( SOUND_DOUBLE_BEEP );
    	Off ( OUT_C );
    }
task main ()
{
 	
	int iDegreeOfLight = 60;
    int iAverage, iAverage_After = 0;
	
	SetSensor ( SENSOR_1, SENSOR_LIGHT );
	SetSensor ( SENSOR_3, SENSOR_LIGHT );
	
       // 懐中電灯が現れる前まで待っている
	until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
		PlaySound ( SOUND_CLICK );
	}
	
	while ( 1 ) 
	{
		if ( SENSOR_1 > SENSOR_3 )
		{
			iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
			while (  SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage - 1	)
			{				
				OnFwd ( OUT_B );
			}			
		}
		else
		{
                      // ロボットが左折だけできるから
                      // 懐中電灯がロボットの右側にあったら一回転して光を探す。
			OnFwd ( OUT_B );
			Wait ( 280 );
		}
		Off ( OUT_B );
		
  • 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
    		iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
    		while ( iAverage != iAverage_After ) {
    			PlaySound ( SOUND_CLICK );
    			OnRev ( OUT_B );
    			iAverage = iAverage_After;
    			Wait ( 20 );
    			iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
    		}
    		Off ( OUT_B );
		
		Shoot ();
		break;
	}
	
}

3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。

#define DISTANCE_50	50 
  • 発射機のモターを動作させてブロックを投げる。
    sub Shoot ()
    {
    	OnRev ( OUT_C );
    	Wait ( 100 );
    	PlaySound ( SOUND_DOUBLE_BEEP );
    	Off ( OUT_C );
    }  

task main ()
{
	
	int iDegreeOfLight = 60;
	int iAverage, iAverage_After = 0;
	
	SetSensor ( SENSOR_1, SENSOR_LIGHT );
	SetSensor ( SENSOR_3, SENSOR_LIGHT );
	
       // 懐中電灯が現れる前まで待っている
	until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
		PlaySound ( SOUND_CLICK );
	}
	
	while ( 1 ) 
	{
		if ( SENSOR_1 > SENSOR_3 )
		{
			iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
			while (  SENSOR_3 > iAverage + 2 || SENSOR_3 < iAverage - 2 )
			{				
				OnFwd ( OUT_B );
			}			
		}
		else
		{
                      // ロボットが左折だけできるから
                      // 懐中電灯がロボットの右側にあったら一回転して光を探す。
			OnFwd ( OUT_B );
			Wait ( 280 );
		}
		Off ( OUT_B );
	
  • 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
    		iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
    		while ( iAverage != iAverage_After ) {
    			PlaySound ( SOUND_CLICK );
    			OnRev ( OUT_B );
    			iAverage = iAverage_After;
    			Wait ( 20 );
    			iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
    		}
  • 懐中電灯が止まったら光センサーの数値を利用して懐中電灯からロボットまでの距離を判断する。何度計って懐中電灯からロボットまでの距離が50cmになる光センサーの数値にする。
    		iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
    		while ( iAverage > DISTANCE_50 ) {
    			OnRev ( OUT_B );
    			iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
    		}
    		
    		Off ( OUT_B );
		
		Shoot ();
		break;
	}
	
}

難しかったところ&工夫したところ

  • 何もないところから始めたから発射機をどう作ればいいかなと考えることが一番難しかった。モターの回転運動を利用して発射機のブロックを直線に投げるようにすることとブロックを投げる前に準備して置くことなどが難しかった。
  • また、ロボットが左折だけできるから懐中電灯が右側にある場合には一回回転して懐中電灯を正確に探すことが難しかった。でも、何回試してみてどのぐらい回転すればいいか分かった。
  • 二個の光センサーを使って懐中電灯を向かうようにプログラムを作ることと懐中電灯が動いているかどうかを判断することと懐中電灯とロボット間の距離を計ることも難しかった。解決策は二個の光センサーの数値の平均を計って二個の光センサーの中で一つの光センサーの数値がその平均と同じくなるまで回転するようにした。また、懐中電灯とロボット間の距離は何回試して光センサーの数値によって距離を求めた。
  • まだ解決しなかったんだけど前進するとき重量中心が異なるかもしれないけど直進するときまっすぐ行けない問題がある。

コメントをどうぞ


ロボットの説明、プログラムを頑張っています。
*ただ、iAverageを使わなくても式の変形によって簡単に表せるところもあります。
 例えば、課題1ではSENSOR_3>SENSOR_1+2とすれば解りやすいです。
*また、ディファレンシャル・ギアの両側にストッパーをつけることで、左右どちらにも曲がれます。
*課題1では相対的に最も明るい方向を求めてください。I


添付ファイル: fileback.jpg 367件 [詳細] fileside.jpg 262件 [詳細] fileshootting.jpg 238件 [詳細] fileshoot_side.jpg 235件 [詳細] fileshoot_front.jpg 217件 [詳細] fileshoot_back.jpg 215件 [詳細] filesensor.jpg 223件 [詳細] filefront.jpg 206件 [詳細] filebody.jpg 196件 [詳細] fileback tire.jpg 116件 [詳細] fileall.jpg 237件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-03 (日) 21:53:33