- 追加された行はこの色です。
- 削除された行はこの色です。
[[2011a]]
#contents
*チームメンバー [#m8bd8def]
-tama
-ホン
*課題内容 [#j05220e3]
課題2で作ったコース上にテニスボールを置き、ロータリーに置いてあるランタンに持っていく又は蹴る。
*ロボット紹介 [#g6aec5c4]
**ロボットの全体図 [#s9fbb70f]
#ref(0.JPG);
-ロボットの全体写真です。
**ア−ム [#wa247e59]
#ref(1.jpg);
-モータをこのように連結して作動方向を変わりました。
#ref(22.JPG);
-最後の歯車にアームを連結しました。
#ref(3.JPG);
-アームの上に黄色の部品も連結して、ボールが出ないようにした。
-アームの上に黄色の部品を連結して、ボールが出ないようにしました。
#ref(4.JPG);
#ref(11111.JPG);
#ref(22222.JPG);
-棒だけではタッチがうまくできないので青い部品を連結しました。
#ref(5.JPG);
#ref(6.png);
*プログラム [#f61e4e30]
**tama(蹴る) [#g1e688b2]
#define THRESHOLD 45
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_TOUCH);
while(true){
start follow_line;
until(SENSOR_3 == 1);
stop follow_line;
start boll_kick;
start follow_line; //ライントレースを始める
until(SENSOR_3 == 1); //タッチセンサーが押されるまで実行する
stop follow_line; //ライントレースをやめる
start boll_kick; //ランタンを探し、ボールを蹴る
Wait(1000);
stop boll_kick; }
stop boll_kick; } //10秒待ってから止める
}
task follow_line()
task follow_line() //ライントレースのプログラム
{
while(true){
if (SENSOR_2 < THRESHOLD){OnFwd(OUT_A); Off(OUT_C);}
else{OnFwd(OUT_C); Off(OUT_A);}
}
}
task boll_kick()
task boll_kick() //ランタンを探し、ボールを蹴るプログラム
{
int l=0;
int l_max=0;
int t_max=0;
OnFwd(OUT_B); Wait(50);
ClearTimer(0);
while(FastTimer(0)<=400)
int l_max=0; //光の最大値を記憶するための変数を定義
int t_max=0; //光が最大値になった時間を記憶するための変数を定義
OnFwd(OUT_B); Wait(50); //アームを下ろす
ClearTimer(0); //タイマーをクリアする
while(FastTimer(0)<=400) //4秒間繰り返す
{
OnFwd(OUT_A);
OnRev(OUT_C);
if(SENSOR_1>l_max){l_max=SENSOR_1;t_max=FastTimer(0);}
OnRev(OUT_C);
if(SENSOR_1>l_max){l_max=SENSOR_1;t_max=FastTimer(0);} //もしl_maxより大きい値を感知したら、その値をl_maxに入れ、その時間をt_maxに記憶する
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(400-t_max);
Wait(400-t_max); //ランタンの方向へ向ける
Off(OUT_A+OUT_C);
OnRev(OUT_B); Wait(50);
OnFwd(OUT_A+OUT_C); Wait(30);
OnRev(OUT_B); Wait(50); //アームを上げる
OnFwd(OUT_A+OUT_C); Wait(30); //ボールを蹴る
Off(OUT_A+OUT_C);
}
**ホン(運ぶ) [#h4c716ef]
#define go_straight(t) OnRev(OUT_A+OUT_C); Wait(t);
#define back(t) OnFwd(OUT_A+OUT_C); Wait(t);
#define go_left(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t);
#define go_right(t) OnFwd(OUT_C); OnRev(OUT_A); Wait(t);
#define stopp(t) Off(OUT_A+OUT_C); Wait(t);
#define catch_on OnFwd(OUT_B); Wait(10); Off(OUT_B);
#define catch_off OnRev(OUT_B); Wait(10); Off(OUT_B);
#define THERSHOLD 40int a = 0 ;//線を探す時に使う変数、普通はa=0でa=1になると線探しstart
int T = 400;
int lmax1 = 0;
int lmax2 = 48;
int tmax = 0;
task line()
{
while(true)
{
if(SENSOR_2 <= THERSHOLD)
{
go_straight(0); //センサーが基準値より暗くなるとgo
}
else if(SENSOR_2 > THERSHOLD)
{
a++; //基準値より明るくなると変数aが1になって線をさす。
stopp(0);
}
}
}
task search()
{
go_left(10);
go_right(20);
go_left(40);
go_right(60);
go_left(90);
go_right(120);//センサー一つで道を探すために左右に回る幅をどんどん大きくして道を探しました。これで交差点も解決で着ました。//
}
sub search_lmax()
{
ClearTimer(1);
while(FastTimer(1) < T)
{
go_left(0);
if(SENSOR_1 > lmax1)
{
lmax1 = SENSOR_1;
tmax = FastTimer(0);
}
}
stopp(0);
}
sub gotolight()
{
go_right(T-tmax);
stopp(10);
go_straight(0);
until(SENSOR_1 >= lmax2);
stopp(0);
catch_off;
back(0);
until(SENSOR_2 <=THERSHOLD);
stopp(0);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_TOUCH);
ClearTimer(0);
while(true)
{
start line;
until((Timer(0) > 10000) || (a == 1) || (SENSOR_3 == 1));
stopp(0);
stop line;
if(a == 1)
{
start search;
until(SENSOR_2 <= THERSHOLD);
stop search;
stopp(5);
a--;
continue;
}
else if(Timer(0) > 10000)
{
break;
}
else if(SENSOR_3 == 1)
{
catch_on;
search_lmax();
gotolight();
continue;
}
}
stopp(0);
}
*感想 [#kd5052c6]
最初はボールに当たってもセンサーが反応しないことがあったが、先生のアドバイスを参考にセンサーの位置を変えたところ、うまく反応するようになった。
*コメント [#b9456984]
- ホンさんのプログラムをもう少しきちんと整形してください。 -- [[松本]] &new{2011-07-23 (土) 13:52:25};
#comment