[[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