- 追加された行はこの色です。
- 削除された行はこの色です。
[[2011a]]
#contents
*チームメンバー [#eaf74067]
-オ(運ぶ)
-MIYA(転がす)
*課題内容 [#na7bce20]
課題2で作ったコース上にランダムに3個のテニスボールをおいて、ボールを中央のランタンに向かって運ぶまたは転がすロボットを作る。
ただし
-転がす場合はボールのあった位置から直接転がす。(押さずに運んだりしないこと)
-運ぶ場合はボールのあった位置から最短距離で運ぶ。
-ロータリーの中央にランタンを置き、3個のボールをランダムに置く。
&Ref(ju.jpg);
*ロボット紹介 [#i567d96e]
**全体 [#fe56d250]
&Ref(1.JPG);
ハサミを2つ使うことによりしっかりと安定したボール運びをできるようにしました。
**アーム部分 [#c61048fb]
&Ref(DSC_0739.jpg);
道を探すセンサーは本体の真ん中に、
光を探すセンサーはできるだけ上に、
タッチセンサーはボールがタッチできたらすぐつかめるようにアームの真ん中にしました。
**センサーの位置 [#b436a834]
&Ref(DSC_0737.jpg);
ランタンの光を探すセンサーの光が広がらないように横にブロックを付けました。
&Ref(DSC_0738.jpg);
&Ref(DSC_0745.jpg);
ボールがタッチセンサーに当たったらすぐボールをつかめるようにしました。
*プログラミング [#v5f31fd3]
**オ(ボールを運ぶ) [#a2991919]
#define go(t) OnRev(OUT_A+OUT_C); Wait(t);
#define back(t) OnFwd(OUT_A+OUT_C); Wait(t);
#define hidari(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t);
#define migi(t) OnFwd(OUT_C); OnRev(OUT_A); Wait(t);
#define off(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 50
int T = 200;
int lmax1 = 0;
int lmax2 = 80;
int tmax = 0;
int a = 0 ;
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //1番センサーを付ける
SetSensor(SENSOR_2, SENSOR_LIGHT); //2番センサーを付ける
SetSensor(SENSOR_3, SENSOR_TOUCH); //3番センサーを付ける
ClearTimer(0);
while(true)
{
start go_line;
until((Timer(0) > 10000) || (a == 1) || (SENSOR_3 == 1)); //三つの条件まで前に行く
off(0);
stop go_line;
if(a == 1) //関数が1になったら
{
start search;
until(SENSOR_2 <= THERSHOLD);
stop search;
off(5);
a--;
continue;
}
else if(Timer(0) > 10000) //Timerが1000秒過ぎたら
{
break;
}
else if(SENSOR_3 == 1) //タッチセンサー(センサー3)がボールを認識したら
{
catch_on;
hikari_sagsu();
gotolight();
continue;
}
}
off(0);
}
sub hikari_sagasu() //一番明るい光を探す
{
ClearTimer(1);
while(FastTimer(1) < T)
{
hidari(1);
off(0);
if(SENSOR_1 > lmax1)
{
lmax1 = SENSOR_1;
tmax = FastTimer(0);
}
}
off(0);
}
task go_line() //前に行く
{
while(true)
{
if(SENSOR_2 <= THERSHOLD) //THERSHOLDより暗ければ
{
go(0);
}
else if(SENSOR_2 > THERSHOLD) //THERSHOLDより明るければ
{
a++;
off(0);
}
}
}
task search() //道を探す
{
hidari(10);
migi(20);
hidari(50);
migi(50);
}
sub gotolight() //一番明るい光がある所にに行く
{
migi(T-tmax);
off(10);
go(0);
until(SENSOR_1 >= lmax2);
off(0);
catch_off;
back(0);
until(SENSOR_2 <=THERSHOLD);
off(0);
}
**MIYA(ボールを転がす) [#b4c29ec2]
#define THRESHOLD 40
task main(){
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2をタッチセンサーと定義
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3を光センサーと定義
while(true){
start folow_line;
until(SENSOR_2 == 1);
stop folow_line;
start ball_kick;
Wait(1000);
stop ball_kick;
}
}
task folow_line()
task folow_line() //ライントレースのプログラム
{
while(true){
if(SENSOR_1<THRESHOLD){ //センサー1が黒線上の時
OnFwd(OUT_A);Wait(15);
}if(SENSOR_1>THRESHOLD){ //センサー1が黒線上に無い時
OnFwd(OUT_C);Wait(15);
}
}
task ball_kick()
task ball_kick() //ボールにあたってからボールをランタンに向かって押し出す
{
int l=0;
int l_max=0;
int t_max=0;
int l_max=0; //光の変数
int t_max=0; //時間の変数
OnFwd(OUT_B); Wait(50);
ClearTimer(0);
while(FastTimer(0) <= 400)
while(FastTimer(0) <= 400) //1周周り一番明るいところを測定する
{
OnFwd(OUT_A);
OnRev(OUT_C);
if(SENSOR_1>l_max){l_max=SENSOR_1;t_max=FastTimer(0);}
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(400-t_max);
Wait(400-t_max); //一番明るいところを向く
Off(OUT_A+OUT_C);
OnRev(OUT_B); Wait(50);
OnRev(OUT_B); Wait(50); //はさみを閉じてランタンに向かって押し出す
OnFwd(OUT_A+OUT_C); Wait(10);
Off(OUT_A+OUT_C);
}
*感想 [#kefa2b4c]
-ロボットを作ることやプログラミングするのは難しくてパートナーに教えてもらったりして頑張ることができてよかった。最終的にはうまくできなかったのが残念です。(MIYA)
-センサーを三つ、モターを三つしか使えないのが難しかった。それに、タッチセンサーがボールを認識するようにするものが一番難しかった。
- それぞれの変数が何のための変数なのかきちんと説明しましょう。 -- [[松本]] &new{2011-07-24 (日) 08:41:28};
#comment