2011a

目次

メンバー

  • taka(最短距離で運ぶ)
  • okamoto(転がす)

課題内容

課題3:ランタンに向かってテニスボールを転がす(または運ぶ)ロボット

課題2で作成したコース上にランダムに置いたテニスボール(3個)を ロータリーの中央部分に置いたランタンに向かって

1.転がす

2.最短距離で運ぶ

ロボットを作成せよ。

ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。

ボールを探す際にはラインに沿っても沿わなくてもよい。

course_map.jpg

プログラム

基本プログラム

今回の課題では、最短距離で運ぶ,転がすといったペアで分担する部分以外のプログラムを

二人でアイディアを出し合い、協力して書き上げた。

#define THRESHOLD1 40 //黒線の閾値
#define THRESHOLD3 78 //ボール運搬地点で測定した光の値
#define ARM_MOVE_TIME 5 //アームの動作する時間

int light_value ; //変数(光の最大値)を定義
int turn_time ; //変数(360°回転に必要な時間)を定義
int i; // for //ループのための変数
int i_min=1,i_max=3; //i_min,i_minにそれぞれ1,3を代入

サブルーチン,変数を使用し、必要な値を設定する。

sub std_move() //基準の動き
{
	while (SENSOR_2 == 0) {
	if (SENSOR_1 < THRESHOLD1) { //センサー1が黒のとき左に旋回
	OnFwd(OUT_C);
	Off(OUT_A);
	} else { //センサー1が白のとき右に旋回
	OnFwd(OUT_A);
	Off(OUT_C);
	}
  }
}

std_move(基準の動き)はセンサー1を使用して黒線の右端を伝ってライントレースし、ボール探索をする。

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を黒線認識用の光センサーに設定
	SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2をボール認識用のタッチセンサーに設定
	SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3をランタンの位置認識用の光センサーに設定
	SetPower(OUT_A+OUT_C,4); //パワーの設定

	turn_time = 238;    // turn_time に 238 を代入

	for (i=i_min; i<=i_max; i++) { //3回繰り返す

	std_move(); //センサー2が反応するまで基準の動き

	OnFwd(OUT_C); //アームを閉じてボールをつかむ
	Wait(ARM_MOVE_TIME);

	ClearTimer(0); //Timer(0)をリセットする
	light_value = 0; //light_value に 0 を代入

	while(Timer(0) <= turn_time){ //turn_time 左回転
	OnFwd(OUT_C);
	OnRev(OUT_A);
	if(SENSOR_3 > light_value){ //SENSOR_3の値がlight_valueより明るい場合
	light_value = SENSOR_3; //SENSOR_3の値をlight_valueに更新
  }
}
	OnFwd(OUT_C); //light_valueの値まで左回転
	OnRev(OUT_A);
	until (SENSOR_3 == light_value);

☆ここに,taka(最短距離で運ぶ),okamoto(転がす)のそれぞれのプログラムを代入

}

	Off(OUT_A+OUT_C); //3回繰り替えした後停止
}

std_move(基準の動き)の最中にセンサー2がボールを感知すると、アームでボールをつかむ。

その後、360°回転しランタンの光をセンサー3で測定、light_value(光の最大値)を測定した中の最大値に更新。

次に、light_value(光の最大値)までもう一度回転。

☆それぞれの条件に合った動き

以上の動作を計3回繰り返す。

taka(最短距離で運ぶ)のプログラム

	OnFwd(OUT_A+OUT_C); //ライトの直前まで前進
	until (SENSOR_3 > THRESHOLD3);

	OnRev(OUT_C); //アームを開いてボールを離す
	Wait(ARM_MOVE_TIME);

	OnRev(OUT_A+OUT_C); //0.2秒後退
	Wait(20);

	OnFwd(OUT_C); //180°左に旋回
	OnRev(OUT_A);
	Wait(turn_time/2);

	OnRev(OUT_A+OUT_C); //センサー1が黒を見るまで後退
	until (SENSOR_1 < THRESHOLD1);

 	OnFwd(OUT_A+OUT_C); //0.1秒前進
	Wait(10);

	OnFwd(OUT_A); //90°右に旋回
	OnRev(OUT_C);
	Wait(turn_time/4);

センサー3の値がTHRESHOLD3(ボール運搬地点で測定した光の値)を上回るまで前進し、ボールを放す。

次のボールを捜索出来るように、再度ライトレースを開始しなければならない。

アームからボールが離れるように0.2秒後退し。その後180°回転する。

センサー1が黒を認識するまで後退し、回転によって黒線を越えてしまわないように0.1秒前進する。その後、90°右に旋回してライントレースの動作に戻れるようにする。

okamoto(転がす)のプログラム

	OnRed(OUT_A); //後進
	OnRed(OUT_C);
	Wait(30); 

	OnRev(OUT_B); //ボールを離す
	Wait(ARM_MOVE_TIME);

	OnFwd(OUT_A); //前進してボールを飛ばす
	OnFwd(OUT_C);
	Wait(30);
              
	OnRev(OUT_A); //右回転
	until(SENSOR_1 < THRESHOLD); //黒線で回転ストップ
	Off(OUT_A+OUT_C);

ロボット

全体

DVC00256.jpg
DVC00262.jpg

できるだけ小さく設計し、動きやすいデザインにした。

センサー1(黒線認識用の光センサー)

DVC00263.jpg

回転の影響によるズレを抑えるため、光センサーをタイヤの間に設置した。

アームとセンサー2(ボール認識用のタッチセンサー)

sensor_3_1.jpg

このアームでボールをはさむ。アームはタッチセンサーが反応しやすい構造にした。

センサー3(ランタンの位置認識用の光センサー)

sensor_2.jpg

光センサーをブロックで囲み、ランタンの正確な方向に反応できるようにした。

感想

taka

今回の課題では、積極的に取り組むことができた。ロボットのデザインやプログラミングだけでなく、レポート作成や画像編集にも苦労した。

okamato

マシンの設計とプログラムともにとても悩んだ。

コメント欄



添付ファイル: filecourse_map.jpg 245件 [詳細] fileDVC00263.jpg 246件 [詳細] fileDVC00262.jpg 232件 [詳細] fileDVC00256.jpg 236件 [詳細] filesensor_3_1.jpg 243件 [詳細] filesensor_3.jpg 147件 [詳細] filesensor_2.jpg 235件 [詳細] filesensor_1.jpg 148件 [詳細] filesensor.jpg 143件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-30 (土) 16:35:47 (2949d)