2010a

目次

第3回課題内容

懐中電灯に向かってブロックを投げるロボット!

1.全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。

2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。

メンバーの紹介

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

てらすぃー 学校教育教員養成課程

ロボットの紹介

最初の構想

1.タイヤの方は普通に二つのモータを使い、ランチャーの方にディファレンシャル‐ギアを使い、リロードと発射をひとつのモータで解決するよう考えた。具体的に、ランチャーはゴムによって発射するようにし、左のギアが動けなくなったら右のギアからランチャーをバックさせ、後ろの壁にぶつかるようにした。それによって空間ができ、左ギアが動くことで弾を発射するという感じで考えてみた。

2.1番は無理だという限界に気づいて、他の構想をした。でも基本的にリロード→発射の準備→発射っていう段階は維持したかったため、移動にディファレンシャル‐ギアを使い、ランチャーの方に二つのモータを使うことにした。ひとつのモータでリロード、発射の準備の過程をし、もうひとつのモータで発射するように考えた。

ロボット&工夫点

ロボットがとても汚く、いらないことばっかり入れてしまって本当にわけがわからない状態になっていると思います。なので、一つ一つ部品を説明しながら、そこで得られた工夫点を説明します。

mitame1.jpg
mitame2.jpg

全体的な外形です。

部品(車体、レール)

tiregear.jpg
nejigear.jpg

車体です。ディファレンシャル‐ギアを使いました。形としては説明書にのっているものと変わりません。構想1番でランチャーのほうで使ってみたかったのですが、思ったとおりにはできませんでした。

車体の上に、ランチャーを動かすギアのついた部品を載せます。特徴はないですが、ネジのようなギアを使うことによって減速比を増やし、軸の移動が可能であったことを前回のロボットから参照しました。

rail.jpg
touch.jpg

前方の部品の上に載せます。レゴ部品の特徴でレゴの上を滑るということができませんが、右図のように部品をつけることによってなめらかに滑るようになりました。またこのレールの端にはタッチセンサーがついています。

部品(ランチャー)

tiregear2.jpg

これがランチャーです。基本的に二つのゴムタイヤの回転によって弾をとばします。左のタイヤは開いたり、閉じたりしてよくがたがたしました。そのため、モータがついている右のタイヤの回転にうまく反応できませんでしたが、タイヤの下にあるギアと回転と関係ないギアをゴムで連結して摩擦を増やし、安定感を増やしました。

launchergear2.jpg
launchergear.jpg

ランチャーの後ろにはラックギアをつけて前後の運動ができるようにしました。そして発射の一番大事な部分であるモータと右タイヤです。これは通常は噛み合っていませんが、ランチャーが前にでることで噛み合うようになります。また、ランチャーがちょうどモータと噛み合うところでタッチセンサーに当たります。タッチセンサーが反応したらモータを回転させるようにプログラミングしました。

tiregear3.jpg
hiriki.jpg
toji.jpg

先ほどの左のタイヤについてたギアです。ギアが閉じたままではリロードができないので、開閉をできるようにしました。ラックギアの隣に固定されてるギアをとおることによってランチャーがバックしたら開き、前進したら閉じることができるようにしました。

reload.jpg

最後にリロードするギミックです。ランチャーで弾が入る位置より高い中心の線は常に高さを維持します。よってランチャーが前後運動をしているときは待機し、弾が入るところがきたら、リロード部品が少し弾を相対的に押すだけでリロードができます。

shooting.gif

リロードから発射までの過程を説明する絵です。

実はあのタイヤはランチャーについています。

プログラミング

カンウ (課題2)

int a=0;                                       //シュットが1番目が2番目かを区別する変数

sub reload(){					//リロードサブルーチン
	OnRev(OUT_A);				//ランチャーをバックさせます。
	Wait(330);
	Off(OUT_A);
}

sub shooting(){					//発射サブルーチン
	Off(OUT_B);				
	OnFwd(OUT_A);				//ランチャーを前進させます。
	until(SENSOR_3 == 1);			//タッチセンサーに当たるまで
	Off(OUT_A);
	OnFwd(OUT_C); Wait(50);			//発射モータ、発射
	Off(OUT_C);
	a++;					//最初と区別するためにaに1を足します。
}

task main()					//メインタスク
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_TOUCH);
	while(true){
	ClearTimer(0);
	if(a>1){				//一回以上発射した状態だったらリロードから始まります。
		reload();
	}
	start move;				//車体が動き出します。
	until(Timer(0)>=30);			//電灯が3秒以上動かなかった場合
	stop move;
	shooting();				//発射サブルーチンに入ります。
	}
}

task move()					//ムーヴタスク
{
while(true){                                   
	if(SENSOR_1 >= 70){                     //光が強かったら停止します。
		Off(OUT_B);
		ClearTimer(0);
	}else{                                  //光が弱くなったら進みます。
		OnFwd(OUT_B);
		ClearTimer(0);
	}
	Wait(5);
}
}

てらすぃー (課題1)

int light1=0;						//前の光の値
int light=0;						//今の光の値
int time1=0;					 	//1番目の位置
int time2=0;						//2番目の位置
int a=0;						//何番目の電灯か区別する変数
					
sub reload(){						//リロードサブルーチン
	OnRev(OUT_A);					//ランチャーをバックさせます。
	Wait(330);
	Off(OUT_A);
}
sub shooting(){						//発射サブルーチン
	Off(OUT_B);				
	OnFwd(OUT_A);					//ランチャーを前進させます。
	until(SENSOR_3 == 1);				//タッチセンサーに当たるまで
	Off(OUT_A);	
	OnFwd(OUT_C); Wait(50);				//発射モータ、発射
	Off(OUT_C);
}
task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_TOUCH);
	ClearTimer(0);					//電灯の位置をはかるタイマー
	OnRev(OUT_B);			
	while(FastTimer(0)<430){			//一回回る時間の間に
		light = SENSOR_1;			//現在の位置での光の値を入れます
		if(light > 60){				
		//ある程度光が当たってるところから始めます
			if(light >= light1){		//今の値が前の値より大きければ
				light1 = light;		//前の値を更新します
			}else if(light < light1){	//今の値が前の値より小さければ
				if(a>=1){		//2番目
					time2 = FastTimer(0);//そのときの時間を入れます	
				}else{			//1番目
					time1 = FastTimer(0);//そのときの時間を入れます	
					a++;
					Wait(70);
				}
			}
		}		
	}
	Off(OUT_B);Wait(30);
	OnRev(OUT_B);Wait(time1);		//1番目の電灯までかかった時間ほど回します。
	Off(OUT_B);
	shooting();
	OnRev(OUT_B);Wait((time2-time1));		//1番目と2番目の間の時間だけ回る。
	Off(OUT_B);
	reload();
	shooting();
}

プログラミングの構想

課題3-1

課題2のプログラムを少し応用してもうひとつのタスクを作って光が弱くなったら進み、強かったら停止します。懐中電灯が長い時間動かなかった場合、ムーヴタスクを止めてシュットサブルーチンを行います。

kadai3.gif

課題3-2

最大点を見つける同時に時間をtime1(1番目),time2(2番目)にいれます。その時間を利用して一回転させたあと、その時間回してシュットさせるプログラムになってます。

プログラミング上の問題点

1.ディファレンシャル‐ギアを使い、軸が車体の重心でないため、きれいな円に動かすことができない。

2.プログラミングが想像によるため、本当はどうなるかわからない・・・

3.一回の回転だけで二つの電灯を認知させるのがなかなかうまくできなかった。

解決案

1.仕方がなく、電灯の位置をそれに合わせておくことで解決できた。

感想

カンウ

今回は今までやった課題の中で一番大変でした。内容的のきつさもありますが、最初の一週間を無駄に過ごしたし、やろうとしてた3連休の時にも学校のロッカーにおいてきちゃったり、そのときまで手もつけることができなかったので、時間的にとても大変でした。内容も難しかったですが、おかしいこだわりのせいで何かさらに難しい道を自分で歩いたんじゃないかなと思います。結局結果物もそんなたいしたもの出なかったし・・でも別にいらないところまで手をつけたりすることによって、もっと、ギアの動きや作り方などがどんどんわかってくる気がしてよかったと思います。

てらすぃー

今回自分がどれほど役に立ったかは分かりませんでしたが、相方とブレインストーミングをしながらアイディアをぶつけ合うことはとても楽しかったです。 それにしてもどんどんと課題がややこしくなっていき、文系頭どころか芸術系頭の自分にはオーバーヒート気味…。けれど班員に色々聞きながら課題をこなすことができてとてもおもしろいです。

コメント

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

  • ロボットの説明は写真なども多く、ちゃんと書いてると思います。授業中に説明があったとおり、今回の課題は、変数を用いて全方向から最大と2番目に大きい光を見つけ出す課題なので、それに沿ったプログラムにしてください。 閾値を用いると、光量が最大の方向、すなわち懐中電灯のある正確な方向に投げられなくなります。-- FI? 2010-07-30 (金) 17:11:53
  • 写真に矢印、丸といった図を入れるとより分かりやすくなると思います。プログラムについては課題に沿った修正をお願いします -- TAKA? 2010-07-30 (金) 17:32:44
  • ロボットの説明は詳しくてよいです。レゴは返してしまったと思うので、後はプログラムとその説明だけでよいので改良してください。どんな命令をしているかはわかるので、どんな意図があるのか(変数の意味、判断)をはっきりさせてください。特に二人目は、一つ目の懐中電灯の位置が明るさが増大し続けた後に減少し始めたところ(=ピーク)としたとしても、どのようにして二つ目の懐中電灯の位置を見つけられるかを一つ目の位置の説明も含めて詳しく説明してください。 -- FI? 2010-08-11 (水) 13:49:26


添付ファイル: filekadai3.gif 156件 [詳細] filetiregear3.jpg 200件 [詳細] filetiregear2.jpg 206件 [詳細] filerail.jpg 209件 [詳細] filetoji.jpg 221件 [詳細] filenejigear.jpg 225件 [詳細] filehiriki.jpg 226件 [詳細] fileshooting.gif 176件 [詳細] filetouch.jpg 215件 [詳細] filereload.jpg 209件 [詳細] filelaunchergear2.jpg 211件 [詳細] filelaunchergear.jpg 222件 [詳細] filetiregear.jpg 219件 [詳細] filemitame1.jpg 223件 [詳細] filemitame2.jpg 213件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-08-12 (木) 13:11:06 (3239d)