[[2011a]]

目次
#contents


*メンバー [#h1d6b852]
-taka(最短距離で運ぶ)
-okamoto(転がす)


*課題内容 [#acb72e98]
**課題3:ランタンに向かってテニスボールを転がす(または運ぶ)ロボット [#c08f3f33]
課題2で作成したコース上にランダムに置いたテニスボール(3個)を
ロータリーの中央部分に置いたランタンに向かって

1.転がす

2.最短距離で運ぶ

ロボットを作成せよ。

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

ボールを探す際にはラインに沿っても沿わなくてもよい。
#ref(course_map.jpg)
*プログラム [#t3f030c1]
**基本プログラム [#qb5aab9c]

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

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

 #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 == 1) {
 	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が反応するまで
 	
 	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(最短距離で運ぶ)のプログラム [#y285c738]

 	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(転がす)のプログラム [#kb8cbf07]

 	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);

*ロボット [#sebca79f]
**全体 [#ie8c59e0]
#ref(DVC00256.jpg)
#ref(DVC00262.jpg)
できるだけ小さく設計し、動きやすいデザインにした。
**センサー1(黒線認識用の光センサー) [#r5274ed9]
#ref(DVC00263.jpg)
回転の影響によるズレを抑えるため、光センサーをタイヤの間に設置した。
**アームとセンサー2(ボール認識用のタッチセンサー) [#iad9365a]
#ref(sensor_3_1.jpg)
このアームでボールをはさむ。アームはタッチセンサーが反応しやすい構造にした。
**センサー3(ランタンの位置認識用の光センサー) [#vbdcdbe6]
#ref(sensor_2.jpg)
光センサーをブロックで囲み、ランタンの正確な方向に反応できるようにした。
*感想 [#nf71d5a9]
**taka [#w545b1f7]
今回の課題では、積極的に取り組むことができた。ロボットのデザインやプログラミングだけでなく、レポート作成や画像編集にも苦労した。
**okamato [#id4a5e5e]
マシンの設計とプログラムともにとても悩んだ。

*コメント欄 [#u6df13d0]
#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS