2016a/Member 目次

ロボットの説明

このロボットはコップを掴み上げてから運び、積み上げる場所までたどり着いたら下ろすように動かしました。もう一方のロボットは運ばれたコップを倒れないように支えておくようにする予定でした。

コップを運ぶロボット

コップを認識するために光センサーを使ったためライントレース用とコップの判断用の2つの光センサーを使った。写真のように光センサーを真ん中に2つつけることに気を付けた。真ん中につけることで、ライントレースはずれが少なくなるし、コップを真ん中で認識するためつかむときにつかみやすくなった。

1470038256310.jpg
1470038262482.jpg
1470038271739.jpg

壁として使う予定だったロボット

1470038264980.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);
}

結果

コップを運ぶロボットは1つコップを運んでくれたが、2つ目を取りに行く際にライントレースができずに1つ運ぶだけで終わってしまった。壁として使う予定だったロボットはセンサーをつけないで時間のみで判断させていたため場所が合わずに失敗した。


添付ファイル: file1470038264980.jpg 142件 [詳細] file1470038271739.jpg 127件 [詳細] file1470038262482.jpg 135件 [詳細] file1470038256310.jpg 138件 [詳細]

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