メンバー

Tomo, Yuki, Naoki, Naoyoshi

課題

2台のロボットで空き缶を収集し、ゴールに空き缶になるべく高く積み上げる

root.png

フィールドの説明

◦フィールドは課題1で使用した紙を2枚つなぎ合わせる

◦図のように空き缶を配置する(黄色)

作戦

 nxtを2つとも1台に搭載

 缶は3つ積むことが目標

 持ち上げた缶をほかの缶の上において、さらに持ち上げる。※繰り返す

 じセンサー2つで交差点を認識

 ゴ未浪伺肇札鵐機爾粘驚

 Εア比を利用した高パワー

ロボット

 我々のロボットは最初は2つのロボットで、積むためのロボットと缶を集めるためのロボットに分けるつもりだった。が、なんだか難しそうだったので、1つのロボットで両方の動作を行うことにした。

 そこで、どう積むかを考えたんだが、最初に思い浮かんだのは『エレベーター式』のものだ。だが、1回作ってみたが固定して、積み上げて、はなすという動作をすべて行うのは非常に難しく、諦めた。

なので、中学生のロボコンの映像を見て、今回の機構にした。

ボディ

0.jpg8.jpg

前にアームの重みがあるためnxtを後ろの方においてバランスをとった。だが、はじめはnxtをどこに設置するか困った。2つのnxtをいろいろな向きに合わせて設置ていたが、これはまた独特の発想が思い浮かび、L字に取り付けてしまった。

 L字に取り付けたらメリットが盛りだくさん!!それを紹介していこう。

.椒妊のバランスがよくなった。

nxtでボディを覆うように固定できたため、ロボットが頑丈になった。

モーターなどとnxtをつなぐときに、接続部分がすべてむき出しになっているので、手軽に接続できる

いっこいい!!

これくらいだろうか。デメリットは...思いつかない。主観的だからなのか、本当に皆さんがそう思うかはわからないが、思いつかなかったのだ。

 そうこうしてみると、さすがにnxtを2つ搭載しているだけのことがあって重くて走りにくそうだった。そこで、ギアを噛ませることでトルクを増大させることでうまく走るようになった。

 ロボコンのリハーサルで右のタイヤの回転が悪く不安定だった。なので、タイヤに付けているシャフトをロボットの内側で固定し安定させることで改善した。さらに、しっかり固定したおかげで2つのタイヤがハの字になりにくくなったのだ。おかげでまっすぐ進んだ。

アーム

 アームには様々な工夫が施されている。

ヾ未猟譴鮖戮┐襪海箸できるように作られている。

3.jpg

▲◆璽犲体の大きさは缶を3つまでは缶のサイズジャスト持てて、安定して持てる作りになっている。

2.jpg

アームの底の高さは缶の高さよりも少し高いくらいにして、缶がアームの真下になるように調節してからアームを開き積むようにした。

 缶の周りピッタリにアームの枠を組み、缶の底も支えることでこれまでに例がないのではないかと思うくらい缶が固定され、人が振っても落ちない優れものだ。

ぅ椒妊とアームをつなぐのは写真の四角の部分の機構である。その機構のおかげで、アームがいつでも地面に平行になるようになっている。

 それによって缶が積めるのだ。

1.jpg

 だが、缶を持つと、アーム自体の重みと缶の重みで段々前のめりになってきていた。なので、

ゲ色の輪ゴムで軽く支えることで水平に保った。

11.JPG

アームのすべての機構を含めると結構な重さになるので、モーターにそのまま接続すると、前に倒そうとすると自身の重みで勝手に倒れていった。なので、

Εアを噛ませてトルクを増大させ、この問題を解消した。

6.jpg

音波センサー

12.JPG

缶が円柱型になっているので音波センサーを横向きでつけると音波がうまく反射して返ってこなくて安定しなかった。そのため音波センサーを縦に取り付ける事でこの不具合を解消した。

本来はセンサーが回転してソナーのようにしたかったが、夢だと気付いた。諦めた。今ではソナーになる予定だった機構は、認識した物体の距離によって音が変わる楽器になったのだ・・・

光センサー

5.jpg

2つ光センサーをつけ、コースのラインをセンサーで挟むことでライントレースをしやすくした。

2つのセンサーがともに『黒』の認識だったら交差点だと判断できると思い、2つ付けることにした。

さらに光センサーを2つ付けたらロボットの幅が広がり、ずっしりと安定したロボットになった。

プログラミング

定義群

#define RIGHT OUT_B
#define LEFT OUT_C
#define BOTH OUT_BC
#define SPEED1 35
#define SPEED2 SPEED1*2
#define OnRL(speedR,speedL) OnRev(RIGHT,speedR);OnRev(LEFT,speedL);	//ギアの都合で正転と逆転が反対
#define go_forward OnRevSync(BOTH,SPEED2,0);	//左右のタイヤの移動距離をシンクロさせて前進
#define go_back OnFwdSync(BOTH,SPEED2,0);	//後退
#define turn_left1 OnFwdSync(BOTH,SPEED2,100);	//時計回りに旋回。3つ目の引数100は旋回率(右のモータと左のモータの回転角度が100%異なる)
#define turn_left0 OnRL(SPEED2,0);	//左折
#define turn_right0 OnRL(0,SPEED2);	//右折
#define turn_right1 OnFwdSync(BOTH,SPEED2,-100);	//半時計回りに旋回
#define u_turnCW OnRL(-SPEED1,SPEED1);	//時計回りに旋回。音波探知用にスピードを落としている。
#define u_turnRCW OnRL(SPEED1,-SPEED1);	//半時計回りに旋回
#define THRESHOLD 45
#define RANGE1 7		//ライントレース中に缶をつかむ動作に移行するための距離
#define RANGE2 19.8	//アームを伸ばした時の缶までの距離
#define RANGE3 23		//回転しながら
#define RANGE4 5	//前方に感知した缶をバンパーのホルダーに押しこむのに必要な距離
#define STEP 1
#define SR SENSOR_2
#define SL SENSOR_1
#define SS SensorUS(S3)
#define CONN 1
#define arm_down "arm1.rxe"	//アームを開き、つかむ準備をするプログラムを定義しなおした。特にアームをダウンさせるわけではない
#define arm_up "arm2.rxe"	//アームの降下→握り→上昇の一連の動作を定義しなおした
#define BUILD_RAG 1000	//ゴールの交差点に止まったあと、ゴール中央を向くための回転に必要な時間。
#define DO 523	//音程C、E、Gを指定。hiCはCの二倍で対応
#define MI 659
#define SO 784
#define SIGNALON 11	//Mail受信用
#define SIGNALOFF 12
#define LATIO 3	//走行駆動系のギア比(24:8)。距離の算出に必要

int nFase,angleA,angleB,msg,nCross;

float GetAngle(float r)	//引数r[cm]だけ進むのに必要な回転角を導くマクロ。ギア比考慮済み
	{
	const float diameter=5.45;
	const float pi=3.1415;
	float ang=r/(diameter*pi)*360.0*LATIO;
	return ang;
	}

マスター

ライントレース

 黒い線を見つけてそこからライントレースに移るようになっている。

sub find_line()	//黒線を見つけるまで前進し、左右両方のセンサが線を検知するまで角度を調整するサブルーチン
	{
	until((SL<=THRESHOLD)&&(SR<=THRESHOLD))
		{
		if((SL>THRESHOLD)&&(SR>THRESHOLD))
			{
			go_forward;
			}
		else if((SL>THRESHOLD)&&(SR<=THRESHOLD))
			{
			turn_right0;
			}
		else
			{
			turn_left0;
			}
		Wait(STEP);
		}
	}

sub start_traceR()	//左右の光センサが先に乗った状態から右方向にライントレースを開始するためのサブルーチン
	{
	until(SL>THRESHOLD)
		{
		turn_right0;
		}
	PlaySound(SOUND_CLICK);
	Off(BOTH);
	}

sub start_traceL()	//左右の光センサが先に乗った状態から左方向にライントレースを開始するためのサブルーチン
	{
	until(SR>THRESHOLD)
		{
		turn_left0;
		}
	PlaySound(SOUND_CLICK);
	Off(BOTH);
	}

sub traceR()	//右側の光センサを使ってライントレースを行うモード
	{
	if(SR<THRESHOLD-4) 
		{
      		turn_right1;
		}
	else if(SR<THRESHOLD) 
		{
		turn_right0;
		}
	else if(SR<THRESHOLD+4)
		{
		go_forward;
		}
	else if(SR<THRESHOLD+7)
		{
		turn_left0;
		}
	else
		{
		turn_left1; 
		}
	}

sub traceL()	//左側の光センサを使ってライントレースを行うモード
	{
	if(SL<THRESHOLD-4) 
		{
      		turn_left1;
		}
	else if(SL<THRESHOLD) 
		{
		turn_left0;
		}
	else if(SL<THRESHOLD+4)
		{
		go_forward;
		}
	else if(SL<THRESHOLD+7)
		{
		turn_right0;
		}
	else
		{
		turn_right1; 
		}
	}

sub search_crossR(int MAXCross)	//右側の光センサを使ってライントレースを行いつつ、引数MAXCrossの分だけ交差点を感知するサブルーチン。交差点の判定は左右の光センサが同時に閾値を下回ったことで行う。
	{
	nCross=0;
	while(nCross<MAXCross)
		{
		until((SL<=THRESHOLD)&&(SR<=THRESHOLD))
			{
			traceR();
			Wait(STEP);
			}
		nCross++;
		PlaySound(SOUND_UP);
		until((SL>THRESHOLD)&&(SR>THRESHOLD))
			{
			go_forward;
			Wait(STEP);
			}
		}
	}

sub search_crossL(int MAXCross)	//同じく左側の光センサによるライントレースと同時に交差点判定を行う
	{
	nCross=0;
	while(nCross<MAXCross)
		{
		until((SL<=THRESHOLD)&&(SR<=THRESHOLD))
			{
			traceL();
			Wait(STEP);
			}
		nCross++;
		PlaySound(SOUND_UP);
		until((SL>THRESHOLD)&&(SR>THRESHOLD))
			{
			go_forward;
			Wait(STEP);
			}
		}
	}

缶をつかむための動作

 この部分はスレーブとの連携の部分で、最初はBluetoothでの通信がうまくいかないことがあったが、 奧原の技術によりうまくいった。

 どこで見つけたのか、缶を見つけた時と缶を持つためにアームを下げる動作の時に音楽を流すという奇抜なアイデアをたたき出し、斬新さで勝負しにいっていたのだ!!

sub catch()	//持っている缶を新しい缶の上に載せ、掴み、また持ち上げる一連の動作。
	{
	angleB=GetAngle(RANGE4);
	RotateMotor(BOTH,SPEED1,-angleB);	//缶をホルダーの中に押しこむために少し前進する
	PlayTone(262,400);	//ネット上で見つけたメロディー。特に意味はない。
	Wait(500);
	PlayTone(294,400);
	Wait(500);
	PlayTone(300,400);
	Wait(500);
	PlayTone(294,400);
	Wait(500);
	RemoteStartProgram(CONN,arm_down);	//スレーブにアームを開かせる
	Wait(5000);
	ReceiveRemoteNumber(MAILBOX1,true,msg);
	if(msg==SIGNALON)
		{
		PlaySound(SOUND_CLICK);
		}
	else
		{
		PlaySound(SOUND_FAST_UP);
		}
	angleA=GetAngle(RANGE2);
	RotateMotor(BOTH,SPEED2,angleA);	//アームの伸びに合わせ後退する
	RemoteStartProgram(CONN,arm_up);	//スレーブに缶を掴ませる
	PlayTone(DO,120);Wait(150);	//達成感のあるメロディー。一回ごとに半音ずつ上昇させたかった
	PlayTone(MI,120);Wait(150);
	PlayTone(SO,120);Wait(150);
	PlayTone(DO*2,240);Wait(300);
	PlayTone(SO,120);Wait(150);
	PlayTone(DO*2,360);Wait(450);
	Wait(10000);
	if(msg==SIGNALON)
		{
		PlaySound(SOUND_CLICK);
		}
	else
		{
		PlaySound(SOUND_FAST_UP);
		}
	RotateMotor(BOTH,SPEED2,-angleA+angleB);	//つかむ動作の開始点まで戻る。
	}

sub build()	//ゴールで缶を載せるだけのプログラム。最後まで使われなかった
	{
	PlayTone(262,400);
	Wait(500);
	PlayTone(294,400);
	Wait(500);
	PlayTone(524,400);
	Wait(500);
	PlayTone(294,400);
	Wait(500);
	RemoteStartProgram(CONN,arm_down);
	Wait(10000);
	go_back;
	Wait(2000);
	Off(BOTH);
	nFase++;
	}

メイン

task main()	//スタートからゴールまでの一連の流れを記述したプログラム
	{
	SetSensorLight(S1);
	SetSensorLight(S2);
	SetSensorLowspeed(S3);
	nFase=0;	//第0段階開始(ラインに乗るまで)
	msg=SIGNALOFF;
	until(BluetoothStatus(CONN)==NO_ERR);
	find_line();
	start_traceR();
	nFase++;	//第一段階開始	(一つ目の缶をつかむまで)
	while(SS>RANGE1)
		{
		traceR();
		Wait(STEP);
		}
	Off(BOTH);
	catch();
	nFase++;	//第二段階開始(2つ目の缶をつかむまで)
	while(nFase<3)
		{
		until(SS<RANGE3)	//缶を感知するまで回転し続ける
			{
			u_turnRCW;
			Wait(STEP);
			}
		while(SS>RANGE1)	//感知したらホルダーに格納されるまで前進
			{
			go_forward;
			Wait(STEP);
			}
		Off(BOTH);
		catch();
		nFase++;
		}
	while(nFase<4)	//第三段階開始(3つ目の缶を格納するまで)
		{
		until(SS<RANGE3+3)
			{
			u_turnRCW;
			Wait(STEP);
			}
		u_turnCW;
		Wait(200);
		Off(BOTH);
		while(SS>RANGE1)
			{
			go_forward;
			Wait(STEP);
			}
		Off(BOTH);	//3つ目の缶は掴まず、ホルダーで抱えたままゴールで缶を2つ載せる
		nFase++;	//第四段階開始(缶をゴールに運び、塔を建てるまで)
		}
	until((SR<THRESHOLD)||(SL<THRESHOLD))	//反転し、ライントレースに戻る
		{
		u_turnRCW;
		}
	find_line();
	start_traceL();
	search_crossL(2);	//2つ目の交差点を過ぎたところで停止、缶を下ろす
	Off(BOTH);
	build();
	go_back;Wait(3000);
	u_turnRCW;Wait(BUILD_RAG);
	}

スレーブ

 スレーブの方は、アームを下げて、開閉するプログラムだけでよかった。

アームを開く

#define SIGNALON 11
#define SIGNALOFF 12
#define CONN 0

task main()
	{
	until(BluetoothStatus(CONN)==NO_ERR);
	RotateMotor(OUT_A,20,-48);
	Wait(1000);
	PlaySound(SOUND_FAST_UP);
	Wait(2000);
	SendResponseNumber(MAILBOX1,SIGNALON);
	}

アームを降ろしてからの動作

#define SIGNALON 11
#define SIGNALOFF 12
#define CONN 0

task main()
	{
	until(BluetoothStatus(CONN)==NO_ERR);
	RotateMotorEx(OUT_BC,15,450,0,true,true);
	Wait(1000);
	RotateMotor(OUT_A,30,48);
	Wait(1000);
	PlaySound(SOUND_FAST_UP);
	Wait(1000);
	RotateMotorEx(OUT_BC,40,-450,0,true,true);
	Wait(1000);
	SendResponseNumber(MAILBOX1,SIGNALON);
	}

反省・感想

 最初はロボットの構想が全く思い浮かばず、なんとなく組み立てては壊すのを繰り返していた。

 構想ができ、同じ仕組みのアームを持ったロボットを何度も作ったが、やはり軽量化が難しく、のび悩んでいた。

 ちなみに私はアームの製作担当だったのだが、軽量化ができずに作るのに苦労していた。その時に栗原が「なんとなく作ってたらこんなアームどう??」と言ってきて軽くて機能するアームを作っていた。私は結局栗原とアームを作り上げたのだが、与えられた仕事もできなかったのは残念だった。

 ボディは渡邉がとっくに大体を完成させていた。

 私は、案をだし、調節することが主になってしまった。が、結構たくさん案を出したり調節できたと思う。そこはよかった。

 やはり、与えられた仕事を時間に余裕をもってしっかりこなせるようになりたい。

 ロボコンでは審判と結果発表楽しかったです!!


添付ファイル: file6.jpg 162件 [詳細] fileroot.png 152件 [詳細] file12.JPG 184件 [詳細] file11.JPG 161件 [詳細] file8.jpg 154件 [詳細] file5.jpg 157件 [詳細] file3.jpg 193件 [詳細] file2.jpg 183件 [詳細] file1.jpg 158件 [詳細] file0.jpg 169件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-02-07 (金) 00:09:07 (2023d)