2011a/A3/課題3左
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[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 == 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(最短距離で運ぶ)のプログラム [#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
終了行:
[[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 == 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(最短距離で運ぶ)のプログラム [#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
ページ名: