ロボコンの発表(15,16班)

ロボットコンテスト優勝 \(^O^)/

メンバー: 永田卓嗣、中澤幌、戸田博康、柳澤孔亮、宮崎

version 0.3
Last modified: Fri Feb 14 16:54:51 JST 2003

0. ロボができるまで
1. 本体の紹介
2. プログラミングの紹介
3. 感想&ロボができるまで


0.ロボができるまで

メンバー 僕達のロボットは始めは一体型のロボットではなくて分離型のロボットでした。 つまりライントレースで箱の前まで来て、そしてコップの前にきたらもう一方のロボットがそのロボットのうえから出発して箱の上のコップをとってもって帰り再びロボットのうえに乗る物を考えていました。

しかし、本番の前日に大きな壁にぶつかり、急遽一体型のロボットに変更しました。 アームを作る人や土台を作る人、問題点を見つけたり助言する人、プログラムを作る人などに分かれて作業しました。 前日の夕方四時ごろからもう一度ロボットを作り初めて学校がしまったら、グループの人の家で作業再開してアイディアを出し合い「あーだ、こーだ」言いながらロボットを作っていました。

途中休憩でセブンへ。 そしてついに完成して時計を見たら夜の二時でした。 そこからロボットを作っていた人たちは、いままで集中していたストレスをゲームで発散!めちゃめちゃ楽しんでいました。 一方プログラムをつっくていた人はゲームやりたいと思いながらプログラムを作るために何回もデータを集めて繰り返し書き直していました。 何回も「できた」といっては失敗していました。

途中休憩でセブンへ。 徐々に完成していき、そしてついに完成しました。 時計を見たら朝の七時でした。 後は学校に行って細かい微調整をするだけでした。 ここで何人か仮眠をとった。

そしていよいよ本番、最後の微調整を行いロボコンがスタート! 他のグループが終わっていき、ついに僕達のグループの発表がやってきました。

1. ロボット本体の紹介

工夫した点

マシンの写真 ← このロボットは速さと正確さを考慮して作りました。 所々に最適な補強をして多少の衝撃にも耐えれるように作りました。 軽量化などをするのにもいろいろ考えました。
アームの写真1 アームの写真2 ← アームの部分では軽量化をして馬力が出るように、ギヤ比を考えて作りました。 そして、アームの部分が壊れないように補強の部分などにも工夫があります。
ハンドの写真 ← ここでは、回転した後コップの前に進むときの微妙な誤差をカバーするためにアームをかなり開けるようなしくみにしました。
RCXの写真 ← ロボット間の通信を正確に行えるようにくっつける様なかたちをとりました。 そして、プログラミングを入れるときなどに簡単に入れれるように取り外しが簡単にできるように工夫されています。
タッチセンサーの写真 ← タッチセンサーの感度を上げるために少し工夫してみました。 それから、回転するときのことを考えて少し前で察知できるように作られています。
ライントレースの写真 ← 土台の部分にはそのアームを支えると同時に全体のバランスを考え手作られています。 馬力を出すためにキャタピラを使っています。 ビンビールを超える高さはだせなかったけれど、缶ビールの高さは超えることができるような土台を作りました。
そして、問題点には即座対応してバージョンアップさせていき、 完成したものです。

2.ロボコンに使ったプログラム

使ったモータとセンサの紹介

一つ目のRCXについて
出力A … 左のタイヤのモータ
出力C … 右タイヤのモータ
センサー1 … 光センサー(左のタイヤのモータの制御)
センサー2 … タッチセンサー
センサー3 … 光センサー(右のタイヤのモータの制御)
二つ目のRCXについて
出力A … アームを動かすモータ
出力B … ハンドを動かすモータ

ロボットの動き

始めコップの目の前にロボットをおきスタートする。 ロボットがコップをつかみアームを引っ込めて回転する。 ライントレースではセンサー1が左のモータの制御をして、センサー2が右のモーターを制御する。 このようにすることにより、単純な装置ですがかなり正確にできます。 まさにシンプルイズべストです。 ちなみにセンサーのあいだの距離は5cmぐらいだったと思います。 なぜはっきりしないかというと、その辺は適当に作ったからです。 まー言ってみれば、作る人がよかったということです。 ライントレースをしてタッチセンサーがオンになると回転して台と平行に走りコップを置くサークルの前で止まり、アームを伸ばしてコップをサークルの円の中に落とします。 そしたら箱の真ん中まで戻りまた回転します。 ライントレースをしてまた戻っていくという行動をします。

実際のプログラム

int number ;
int time ;

#define Sol 784
#define Do  523
#define turn_around OnFwd(OUT_C);OnRev(OUT_A);Wait(340);Off(OUT_C+OUT_A);	//回転 
#define go_around OnFwd(OUT_C+OUT_A);Wait(time);Off(OUT_C+OUT_A);		//ラインの場所から進む
#define back_around OnRev(OUT_C+OUT_A);Wait(time);Off(OUT_C+OUT_A);		//ラインの場所に戻る

task play_music() 						//ドの音がなるプログラム
  { PlayTone(Do,25); Wait(10);PlayTone(Do,25); Wait(10); }
task play_music1() 						//ソの音がなるプログラム
  { PlayTone(Sol,25); Wait(10); PlayTone(Sol,25); Wait(10);}
task go_line()					//ライントレースの行き(コップがあるほうから無いほう進むのを「行き」とする)
{
		OnFwd(OUT_A+OUT_C);	
		while(SENSOR_2==0)		//タッチセンサーがoffの時
		{
			if (SENSOR_1 < 40)	//黒線に入った時の行動
			{
			OnRev(OUT_A);	
                  	}
			else
			{
			OnFwd(OUT_A);
			}
			if (SENSOR_3 < 40)	//黒線に入った時の行動
			{
		   	OnRev(OUT_C);	
                  	}
			else
			{
			OnFwd(OUT_C);
			}
			if (SENSOR_2==1)	//タッチセンサーが触れるとwhile文から脱出
			{
			break;
			start play_music ;
			}
		}
		Off(OUT_C+OUT_A);		//停止してから回転、コップの前まで進みメッセージを送り五秒待つ。
		Wait(50);
                turn_around;
		start play_music ; 
                back_around;
		start play_music1 ; 
               SendMessage(number); 
		Wait(500);		
}
task go_line1()					//ライントレースの行きの最後の時だけ
{
		OnFwd(OUT_A+OUT_C);	
		while(SENSOR_2==0)
		{
			if (SENSOR_1 < 40)	//黒線に入った時の行動
			{
			OnRev(OUT_A);	
                  	}
			else
			{
			OnFwd(OUT_A);
			}
			if (SENSOR_3 < 40)	//黒線に入った時の行動
			{
		   	OnRev(OUT_C);	
                  	}
			else
			{
			OnFwd(OUT_C);
			}
			if (SENSOR_2==1)	//停止してから回転、コップの前まで進みメッセージを送り五秒待つ。
			{
			break;
			start play_music ;
			}
			
		}
		Off(OUT_C+OUT_A);
		Wait(50);
                turn_around;
		start play_music ;
		go_around;
		start play_music1 ; 
               SendMessage(number); 
		Wait(500);	
}
task backgo_line()				//ライントレースの帰り
{
	OnFwd(OUT_A+OUT_C);	
		while(SENSOR_2==0)
		{
			if (SENSOR_1 < 40)	//黒線に入ったら
			{
			Off(OUT_A);	
                  	}
			else
			{
			OnFwd(OUT_A);
			}
			if (SENSOR_3 < 40)	//黒線に入ったら
			{
		   	Off(OUT_C);	
                  	}
			else
			{
			OnFwd(OUT_C);
			}
			if (SENSOR_2==1)	//タッチセンサーが触れるとwhile文から脱出
			{
			break;
			start play_music ;
			}
		}
		Off(OUT_C+OUT_A);		//停止してから回転、コップの前まで進みメッセージを送り五秒待つ。
		Wait(50);
                turn_around;
		start play_music ; 
                back_around;
		start play_music1 ; 
                SendMessage(number);
		Wait(500); 
}
task backgo_line1()				//ライントレースの帰り最後の時だけ
{
		OnFwd(OUT_A+OUT_C);	
		while(SENSOR_2==0)
		{
			if (SENSOR_1 < 40)	//黒線に入った時の行動
			{
			OnRev(OUT_A);	
                  	}
			else
			{
			OnFwd(OUT_A);
			}
			if (SENSOR_3 < 40)	//黒線に入った時の行動
			{
		   	OnRev(OUT_C);	
                  	}
			else
			{
			OnFwd(OUT_C);
			}
			if (SENSOR_2==1)	//タッチセンサーが触れるとwhile文から脱出
			{
			break;
			start play_music ;
			}
		}
		Off(OUT_C+OUT_A);		//停止してから回転、コップの前まで進みメッセージを送る。
		Wait(50);
                turn_around;
		start play_music ;
		go_around;
		Wait(time);
		Off(OUT_C+OUT_A);
		start play_music1 ; 
                SendMessage(number); 
}
task main()  //master
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
		
		start play_music1 ;
		Wait(300);		//三秒待つ。
		start play_music1 ;
		number=1;
    		SendMessage(number); 	//メセージを送る。真ん中のコップをつかむ
		Wait(150);	
		 turn_around;
		 number=2;
		 time=50;		
		 start backgo_line;	//ライントレースをしてコップを真ん中の円の中においてくる
		 go_around;
		 turn_around;


		 number=3;
		 time=200;
		 start go_line;		//ライントレースをして向かって右端のコップをつかむ
		 go_around;	
		 turn_around;
		 number=4;
		 time=200;		
		 start backgo_line;	//ライントレースをしてコップを右端の円の中においてくる
		 go_around;
		 turn_around;


		 number=5;
		 time=100;
		 start go_line1;	//ライントレースして向かって左端のコップをつかむ
		 back_around;	
		 turn_around;
		 number=6;
		 time=100;		
		 start backgo_line1;	//ライントレースをしてコップの左端の円の中においてくる
		
		Off(OUT_C+OUT_A);	//終わり
		start play_music ;
		start play_music1 ;
}

int time ;

#define Sol 784
#define Do  523

task play_music() 						//ドの音がなるプログラム
  { PlayTone(Do,25); Wait(5); PlayTone(Do,25); Wait(5);}
task play_music1() 						//ソの音がなるプログラム
  { PlayTone(Sol,25); Wait(5);PlayTone(Sol,25); Wait(5); }
task go1_box()							//コップをつかむプログラム
{
	OnRev(OUT_B);Wait(155);Off(OUT_B);			//ハンドを開きアームを伸ばしハンドを閉じてアームを引っ込める	
	OnFwd(OUT_A);
	Wait(time);
	Off(OUT_A);
	OnFwd(OUT_B);Wait(163);Off(OUT_B);
	OnRev(OUT_A);
	Wait(time);
	Off(OUT_A);
	start play_music1 ; 
}
task go2_box()							//コップを円の上においてくるプログラム
{
	OnFwd(OUT_A);						//アームを伸ばしハンドを開きアームを引っ込めてハンドを閉じる
	Wait(time);
	Off(OUT_A);
	OnRev(OUT_B);Wait(60);Off(OUT_B);	
	OnRev(OUT_A);
	Wait(time);
	OnFwd(OUT_B);Wait(60);Off(OUT_B);
	Off(OUT_A);
	start play_music1 ; 
}
task main() //slave
{   
while(true)
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	ClearMessage();
	until(Message() !=0);
	if(Message() ==1)	//メッセージ1が来た時
	{
	OnFwd(OUT_B);Wait(45);Off(OUT_B);
	OnRev(OUT_A);Wait(100);Off(OUT_A);
         };

	if(Message() ==2)	//メッセージ2が来た時
	{
	time=150;		//真ん中の円にコップをおく
	start play_music1 ;
	start go2_box;
	};

	if(Message() ==3)	//メッセージ3が来た時
	{
	time=150;		//右の円のコップをつかむ
	start play_music1 ;
	start go1_box;
	};

	if(Message() ==4)	//メッセージ4が来た時
	{
	time=45;		//右の円にコップをおく
	start play_music1 ;
	start go2_box;
	Wait(100);		//↓微調整
	OnFwd(OUT_A);
	Wait(40);
	Off(OUT_A);
	Wait(2000);
	OnRev(OUT_A);
	Wait(time);
	Off(OUT_A);		//↑
	};

	if(Message() ==5)	//メッセージ5が来た時
	{
	time=150;		//左の円のコップをつかむ
	start play_music1 ;
	start go1_box;
	};

	if(Message() ==6)	//メッセージ6が来た時
	{
	time=45;		//左の円にコップをおく
	start play_music1 ;
	start go2_box;
	};
} 
}



工夫した点

プログラミングで大変だったところは、まず時間がなかったところです。 前日にマシンを作り直していたので、みんなで徹夜での作業をしました。 プログラミングの細かい設定は家で何回も試した結果から得たものでした。    設定で一番苦労したところは電池の量によって速度が変わってしまうので、何ボルトのときにどれくらいの数値だったかを記録しておきました。    やはり、うまい具合に90度回転してくれないとアームを伸ばしたときにかなりの誤差が生まれてしまうので、結構慎重にやりました。     電力を強くすると力が変わっていることにきずきタイマーを 使ってプログラムをすればよかったと思いました。 ですが、発表の時のプログラミングが完璧でうれしかったです。

3.感想&反省

ロボットは完璧ですべてのコップを円の中に置くことができました。 家での練習などではギアが外れてしまうことがあり、補強しておきましたがどうなるな心配でした。 しかし、そんな心配は要りませんでした。 ロボットの上のアームの部分は、軽量化してあるのですがやはり走っているときは振動が大きくなっていたのでひやひやしました。 ホント完璧にできてメチャメチャうれしかったです。 結果を見たら優勝していました。 大学に入ってから、今までに無い充実感を感じました。ひとつのことに夢中になれることはいいことだとい思います。 しかし、反省すべき点があります。やはり前日のすべてをやるのは無理があります。 少しでもいいから集まる回数を増やしてみんなで話し合ってやるべきでした。 今回は何とかできてからよかったです。 今後はこれらのことを教訓にしていきたいと思います。 The hardship cracked exactly and the soapberry cracked!


質問等がありましたら、下のアドレスまで連絡してください。
永田卓嗣t021044@mail.shinshu-u.ac.jp