#contents
*ロボコンの内容とルール [#y102ff4f]

[[ルール:http://yakushi.shinshu-u.ac.jp/robotics/?2010b%2F%A5%ED%A5%DC%A5%B3%A5%F3]]

**フィールドの紹介 [#j8f00ab1]

#ref(./フィールド.png,100%,)

#ref(./フィールド2.png,100%,)


今回はRCXが2個あるので、ピンポン玉を拾うロボットと、上へ運んでかごに入れるロボットの2台を作った。
*拾うロボット [#vc7734b2]
**ロボットの仕組み [#u9d4e979]

#ref(./全体2.jpg,100%,)
ロボの全体です。初めはRCXを後ろにつなげていましたがロボットが長くなるので上に置きました。

#ref(./内部.jpg,100%,)
ピンポン玉を取り込む装置です。OnFwdとOnRevを使い、取り込み、吐き出しをします。少しでも高いとホイールに当たらず、少しでも低いと入らなくなったりして調節に時間が一番かかったところです。

#ref(./構造2.jpg,100%,)
RCXを取り除いた内部です。ホイールの位置や数の調節が大変でした。

#ref(./アーム1.jpg,100%,)
リーグ戦用に設置したタッチセンサー付きのアームです。センサーが反応したらターンするようになっています。主に妨害用で作ったのですが、分散したピンポン玉を回収することがありまた上げるロボットの方に持って行けたら面白かったかもしれません・・・

**プログラム [#s1abc8c8]
***玉を回収するプログラム1(単独競技用) [#g6bc14a9]

 #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間前進
 #define turn_left(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間左に曲がる
 #define turn_right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間右に曲がる
 #define back(t)  OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);		//秒間後退
 task main()
 {
	SetSensor(SENSOR_1,SENSOR_TOUCH);	//センサー1をタッチセンサと認識 
	SetSensor(SENSOR_3,SENSOR_TOUCH);	//センサー2をタッチセンサと認識
	OnFwd(OUT_B);		//玉を回収するモーターを始動
	turn_right(54)		//玉がある位置まで移動する
	go_straight(90)
	turn_left(55)
	go_straight(170)
	turn_left(55)
	go_straight(90)		//玉に向かって直進し、回収する
	back(200)
	go_straight(25)			//相方に玉を渡しに戻る
	turn_left(55)
	go_straight(115)
	turn_right(54)
	go_straight(60)		//相方の前にセッティング
	OnRev(OUT_B);		//玉を吐き出す
	Wait(500);
	Off(OUT_B);
	back(60)                //後退
	turn_left(55)           //スタート地点に戻る
	go_straight(75)
	turn_right(54)
	go_straight(130)
	Off(OUT_A+OUT_C+OUT_B);  //終わり
 }

回転センサや光センサを付けずにタイマーで動かすプログラムにした。最後のほうは電池がなくなってきて、毎回違う動きをするようになってしまい、うまく動かせなかった。
やはり、回転センサや光センサを使って常に同じ動きをするようにするべきだった。

***玉を回収するプログラム2(リーグ戦用) [#c0935070]

 #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間前進
 #define turn_left(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間左に曲がる
 #define turn_right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);	//t秒間右に曲がる
 #define back(t)  OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);Wait(50);		//秒間後退
 task main()
 {
	SetSensor(SENSOR_1,SENSOR_TOUCH);	//センサー1をタッチセンサと認識 
	SetSensor(SENSOR_3,SENSOR_TOUCH);	//センサー2をタッチセンサと認識
	OnFwd(OUT_B);		//玉を回収するモーターを始動
	turn_right(54)		//玉がある位置まで移動する
	go_straight(90)
	turn_left(55)
	go_straight(170)
	turn_left(55)
	go_straight(90)		//玉に向かって直進し、回収する
	back(200)
	go_straight(25)			//相方に玉を渡しに戻る
	turn_left(55)
	go_straight(115)
	turn_right(54)
	go_straight(60)		//相方の前にセッティング
	OnRev(OUT_B);		//玉を吐き出す
	Wait(500);
	Off(OUT_B);
	OnFwd(OUT_B);
	back(85)		//後ろに下がって相手の陣地行く
	turn_right(62)
	go_straight(200)
	repeat(8){
	ClearTimer(0);		//タイマーをセット
	while(Timer(0) <= 200){		//20秒間whileの中を実行
	if((SENSOR_1 == 0) && (SENSOR_3 == 0)){	//センサが2つとも反応しない場合
	OnFwd(OUT_A+OUT_C);					//前進
	}
	if(SENSOR_1 == 1){					//センサ1だけ反応した場合
	back(30)						//少し後退して右に曲がる
	turn_right(55)
	}
	if(SENSOR_3 == 1){					//センサ3だけ反応した場合
	back(30)						//少し後退して右に曲がる
	turn_left(40)
	}
	if((SENSOR_1 == 1) && (SENSOR_3 == 1)){	//センサが2つ戸も反応した場合
	back(50)
	turn_right(50)					//後退して右に曲がる
	}
 }
 	OnRev(OUT_B);					//玉を吐き出す
 	Wait(300);
	Off(OUT_B);
	Wait(100);
	OnFwd(OUT_B);					//whileの中はここまで
 }
 Off(OUT_A+OUT_C+OUT_B);					//終わり
 }

一回ボールを取りに行くと球が散らばってしまい、特定の場所に取りに行くことができないので、タッチセンサを使って動き回らせて、球を回収するのに加え、相手のマシンを邪魔するようなプログラムにしました。
一回ボールを取りに行くと玉が散らばってしまい、特定の場所に取りに行くことができないので、タッチセンサを使って動き回らせて、玉を回収するのに加え、相手のマシンを邪魔するようなプログラムにしました。

*上げるロボット [#s3a54112]
**ロボットの仕組み [#ne298fd4]

下の写真ははじめに作った装置です。
#ref(./ピンポン階段装置.gif,100%,)
階段状レールの下からピンポン玉を押し上げて、3段の階段を上がります。


この装置の問題点は上方向への移動距離が短いことと、ピンポン玉がスムーズに階段を上がらないことです。
そのため、別の装置と組み合わせることにしました。


新しく作ったのが下の写真の装置です。
#ref(./CA3C0383.JPG,100%,)
ホイールとチューブを組み合わせた先端はピンポン玉がぴったりはまります。

&ref(./CA3C0390.JPG,100%,);  &size(25){図1};

これをギザギザな歯のあるブロックを使って上下に動かします。

UFO装置のホイール部分に工夫をしました。
図1の白で囲った部分にタッチセンサーを取り付けました。これは、ホイールが一番上まで上がった時にモーターが止まるようにするためです。

さらに、ピンポン玉がうまく落ちるように工夫しました。次の図は装置の仕掛けです。最初は右のタイヤが重りになっていて最初は傾いています。モーターで先ほどのホイールを上げます。すると、ホイールの上の黄色の部品が地面と平行になります。そうなることで、左の棒がピンポン玉を押して下に落ち、カゴに入るという動作をします。

#ref(./仕掛け.gif,100%,仕掛け)

しかしこの2つの装置を組み合わせようとしましたが、ブロックが足りなくなってしまい固定が出来ませんでした。
そこで、最初に作った階段の装置を壊して新しく作った装置だけでカゴに入れるようにしました。

しかし、ここでも新たな問題点が上がりました。ギザギザのブロックが全部で8個しか無く、高さが足りないということです。カゴの高さは30cmもあるので、それより高くしなければピンポン玉を入れることはできません。

いろいろなブロックで穴を埋めようとしましたが、なかなか見つかりませんでした。最終的に図2の黄色で囲ったブロックにしました。ギザギザの部品の代わりにはいきませんでしたが、空回りが少なく今までで一番良く動きました。

&ref(./CA3C0394.png,100%);  &size(25){図2};

次に最初の装置で余った部品で、UFO装置のモーターを頑丈に固定しました。

#ref(./CA3C0399.JPG,100%)

しかし、そうすることで頭が重くなってしまい前屈みになってしまったので、ベルトコンベアで固定しました。

&ref(./CA3C0395.JPG,100%);	&ref(./CA3C0397.JPG,100%);

UFO装置がかなり重たくなってしまい、モーター2つでも移動が難しくなってしまいました。そこで、ウォームギアを両輪に取り付けました。下はその写真です。かなり遅いですが移動が出来るようになりました。

#ref(./CA3C0396.JPG,100%)

この上昇させるロボットの長所は移動する場所が良ければ確実にカゴにピンポン玉を入れることができることです。しかし、欠点がいくつかあります。まずはロボットが重いということ、そして玉が装置の真下に来ないと意味がないということです。

**プログラム [#of201d55]

機体が重たくなってしまった為移動が難しくなり、向こう側のカゴへの移動は断念しました。回収するロボットが上昇させるロボットに玉を渡した前提のプログラムです。

 task main(){
 	SetSensor(SENSOR_1,SENSOR_TOUCH);	//センサー1(タッチセンサー)を定義
 	SetPower(OUT_A,4);		//左のモーターの力を4に定義する
 	SetPower(OUT_C,3);		//右のモーターの力を3に定義する
 
 	OnFwd(OUT_A+OUT_C);	Wait(180);	//手前のカゴの位置に進む
 	OnRev(OUT_A);Wait(350);
 	OnFwd(OUT_A+OUT_C);	Wait(500);
 	Off(OUT_A+OUT_C);
 
 	repeat(5){			//5回繰り返す
 		OnFwd(OUT_B);Wait(60);	//一旦UFOを持ち上げて停止
 		Off(OUT_B);Wait(30);
 		OnRev(OUT_B);Wait(60);	//UFOを下げる
 		while(SENSOR_1 != 1){	//センサーが反応するまで持ち上げる
 			OnFwd(OUT_B);Wait(30);	//UFOを上まで持ち上げてゴールする
 			Off(OUT_B);//Wait(10);
 		}
 		Off(OUT_B);Wait(100);
 		OnRev(OUT_B);Wait(300);	//下までUFOを下げる
 		Off(OUT_B);Wait(50);
 	}
 	OnRev(OUT_C);Wait(350);		//元の位置に戻る
 }

*感想・反省 [#vdde3f30]
ただピンポン玉を回収し、運び、カゴに入れるだけなのにいざロボでやるとなると大変だった。限られた時間の中で十分な性能を持つロボを作る大変さを改めて知った。

*コメント [#z1520ca6]
- とても詳しく書いてあって良いと思います。どのように戦略を考えたのか、プログラムにおいてどのような意図をもって条件判断や命令実行を行わせたのか等まで踏み込めるとさらに良いです -- [[FI]] &new{2011-02-12 (土) 19:03:44};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS