2016a/Member 

目次

ロボコンの内容

2016a-mission2.png

上図のA地点とB地点からスタートし,連携しながらCD地点に置いてあるコップを交互に中心の円の中にかさねていき、速さ、数、美しさなどで競う。

ロボット本体の説明

今回の課題でコップを運ぶために使った方法は、コップを持ち上げて運び重ねていく方法です。 ロボットのコップを掴む動作は、先生が授業で話していた一つのモータで掴んで持ち上げる仕組みを使いました。 どんなロボットにしようか作成中に二台がに両方コップを運ばせることの難しさに気づき、一つはコップを固定させるためのロボット(壁ロボット)にしようというふうになりました。

31.jpg
32.jpg

コップを運ぶロボットでは、コップを認識するためにセンサが必要なので、そのために光センサを使いました。最初はタッチセンサを使おうとしましたが、コップが軽すぎてうまく反応しなかったので 光センサにしました。一台を壁ロボットにしたのは光センサーが足りなくなったからです。

33.jpg
34.jpg

プログラムの説明

コップ回収ロボット

#define SIGNALON 121	//通信用
#define MIDDLE 50	//ライントレース用の中間値
#define WHITE 50	//紙コップ認識用の値
#define turn_left1 SetPower(OUT_AC,2); Off(OUT_A); OnFwd(OUT_C);	//左
#define turn_left2 SetPower(OUT_A,1); OnRev(OUT_A); OnFwd(OUT_C);	//左旋回
#define turn_right1 SetPower(OUT_AC,2); OnFwd(OUT_A); Off(OUT_C);	//右
#define turn_right2 SetPower(OUT_C,1); OnFwd(OUT_A); OnRev(OUT_C);	//右旋回
#define go_forward SetPower(OUT_AC,7); OnFwd(OUT_AC);			//前進

int cup_count=0;	//コップのカウント

sub trace()	//ライントレース
{
	while(FastTimer(0) < 26)	//左旋回が一定時間続くまでループ
	{
		if(SENSOR_2 < MIDDLE-5)	//黒
		{
			turn_left2;	//左旋回
		}
		else
		{
			if(SENSOR_2 < MIDDLE-2)	//中間に近い黒
			{
				turn_left1;	//左曲がり
			}
			else if(SENSOR_2 < MIDDLE+3)	//中間
			{
				go_forward;	//直進
			}
			else if(SENSOR_2 < MIDDLE+6)	//中間に近い白
			{
				turn_right1;	//右曲がり
			}
			else	//白
			{
				turn_right2;	//右旋回
			}
			ClearTimer(0);
		}
	}
}

sub i_forward()	//直進
{
	turn_right2;
	Wait(30);
	go_forward;
	Wait(50);
	Off(OUT_AC);
}

sub i_left()		//左折
{
	turn_left2;
	Wait(45);
	Off(OUT_AC);
}

sub i_right()		//右折
{
	turn_right2;
	Wait(30);
	go_forward;
	Wait(30);
	turn_right2;
	Wait(80);
	Off(OUT_AC);
}

sub cup1()	//CとDのそれぞれの1つ目のコップ
{
	turn_right2;	//紙コップまで方向調整
	Wait(25);
	  
	SetPower(OUT_AC,1);	//紙コップまで移動
	OnFwd(OUT_AC);
	while(SENSOR_3 <= WHITE);
	Off(OUT_AC);
	 
	OnRev(OUT_B);	//紙コップをつかむ
	Wait(150);
	Off(OUT_B);

	turn_right2;	//ラインまで移動
	Wait(180);
	go_forward;
	Wait(20);
}

sub cup2()	//2つ目のコップ
{
	SetPower(OUT_AC,1);	//紙コップまで移動
	OnFwd(OUT_AC);
	while(SENSOR_3 <= WHITE);
	Off(OUT_AC);
	
	OnRev(OUT_B);	//紙コップをつかむ
	Wait(150);
	Off(OUT_B);

	turn_right2;	//ラインまで移動
	Wait(180);
	go_forward;
	Wait(120);
}

sub cup3()	//3つ目のコップ
{
	turn_right2;	//紙コップまで方向調整
	Wait(45);
	
	SetPower(OUT_AC,1);	//紙コップまで移動
	OnFwd(OUT_AC);
	while(SENSOR_3 <= WHITE);
	Off(OUT_AC);
	
	OnRev(OUT_B);	//紙コップをつかむ
	Wait(150);
	Off(OUT_B);

	turn_right2;	//ラインまで移動
	Wait(170);
	go_forward;
	Wait(100);
}

sub cup_down()	//コップを下すときの動作
{
	turn_left2;	//コップを下す位置まで移動
	Wait(5);
	OnRev(OUT_AC);
	Wait(5);
	Off(OUT_AC);

	if(cup_count == 1)	//最初のコップを置くとき
	{
		SendMessage(SIGNALON);	//もう一台の動作を再開する
	}

	OnFwd(OUT_B);
	Wait(50);
	Off(OUT_B);

	if(cup_count == 1)	//最初のコップを置いたとき
	{
		OnFwd(OUT_AC);	//コップを少し前に押す
		Wait(10);
	}

	OnRev(OUT_AC);	//ラインまで移動
	Wait(60);
	turn_left2;
	Wait(120);
	go_forward;
	Wait(50);
}

task main()
{
	SetSensor(SENSOR_2, SENSOR_LIGHT);
	SetSensor(SENSOR_3, SENSOR_LIGHT);
	int c=1;		//交差点の確認
	int d=0;		//1になったら動作停止
	int course_check=0;	//0ならC地点へ、1ならD地点へ

	SetPower(OUT_B,1);	//コップをつかむときのモータをできるだけ弱くする

	go_forward;	//ラインまで直進
	Wait(80);
	while(d == 0)
	{
		ClearTimer(0);
		trace();	//ライントレース

		Off(OUT_AC);	//交差点確認
		PlaySound(SOUND_UP);
		Wait(100);

		switch(c)
		{
			case 1:	//最初の交差点
				i_left();	//S地点へ
				break;
				
			case 2:	//S地点の交差点
				if(course_check == 0)
				{
					i_right();	//C地点へ
				}
				else
				{
					i_left();	//D地点へ
				}
				break;
				
			case 3:	//C地点かD地点
				if(cup_count < 2)	//集めたコップが2つより少ないなら
				{
					cup1();
				}
				else if(cup_count < 4)	//集めたコップが4つより少ないなら
				{
					cup2();
				}
				else	//集めたコップが4つ以上なら
				{
					cup3();
				}
				cup_count++;
				break;
				
			case 4:
				if(course_check == 0)	//C地点から戻ってきたら
				{
					i_left();	//P地点へ
					course_check = 1;	//次はD地点へ
				}
				else	//D地点から戻ってきたら
				{
					i_right();	//P地点へ
					course_check = 0;	//次はC地点へ
				}
				break;
				
			case 5:	//P地点の交差点
				i_left();	//Q地点へ
				break;
				
			case 6:	//Q地点の交差点
				cup_down();
				if(cup_count == 6)	//コップを集め終わったら	
				{
					d = 1;	//動作停止
				}
				break;
				
			case 7:	//P地点の交差点
				i_right();	//S地点へ
				c = 1;	//case 2に戻る
				break;
		}
		c++;
	}
	Off(OUT_ABC);
}

壁ロボット

#define SIGNALON 121	//通信用

task main()
{
	ClearMessage();
	ClearTimer(0);

	OnRev(OUT_AC);	//Q地点まで移動
	Wait(450);
	Off(OUT_AC);
	
	OnRev(OUT_A);	//向き調整
	OnFwd(OUT_C);
	Wait(5);
	Off(OUT_AC);

	until(Message() == SIGNALON);	//通信するまで動作停止

	Wait(150);	//紙コップが置かれたらアームで調整
	OnFwd(OUT_B);
	Wait(10);
	Off(OUT_B);

	Wait(30000);	//紙コップが確実に集め終わるまで動作停止(あまりよくない)
	
	OnRev(OUT_B);	//アームを広げる
	Wait(20);
	Off(OUT_B);
	
	OnRev(OUT_AC);	//紙コップから離れる
	Wait(30);
	Off(OUT_AC);
}

結果

一回目は壁ロボットがうまく作動せずにコップを置けなかったが、2回めは壁ロボットを使わずやったらうまくいって、基本点を3点もらい、全体の成績も2位だった。

感想

まず最初にまさか僕達の班が2位をとるとはおもってもいませんでした。僕達の班の発表が終わって、点数が表示された時は点数の低さに驚いたが、他の班が終わるにつれ、実は点数が高かったことがわかり、毎週遅くまで残った努力は無駄ではなかったんだなと思った。正直前期の授業の中では一番この授業が大変だったが、その分得られたものは多かった気がします。


添付ファイル: file2016a-mission2.png 134件 [詳細] file34.jpg 138件 [詳細] file33.jpg 165件 [詳細] file32.jpg 141件 [詳細] file31.jpg 154件 [詳細]

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