- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#q0beaeb0]
#contents
*課題の説明 [#ib723224]
&ref(./img.jpeg,20%);
-画像のようなコースを作成し、与えられた条件を満たしてゴールせよ。
***条件 [#ndfbf27e]
+A,B,Cのいずれかから、それぞれ指定された場所までコースに沿って移動する。(AからB,BからA,CからA)
+交差点は曲がらずに通過する。
+途中に設置されたボールをゴールまで持っていく。(可能ならシュートする)
*ロボットの説明 [#bd77b578]
**本体 [#s425d79f]
&ref(./image[1].jpeg,20%);
&ref(./image[2].jpeg,20%);
これが今回私たちのチームが制作したロボットです。
アームでボールを囲み、ゴールまで運びます。
**アーム [#ie485727]
***アーム1 [#wf712d8e]
&ref(./image.jpeg,13%);
本体の下部にあり、ボールをキャッチし外に出ないようにする役割をもちます。
***アーム2 [#peeefd4c]
&ref(./image[6].jpeg,15%);
本体の上部にあり、最初は開いています。
ボールが射程範囲に入るころに閉じ、ゴールまで運べるようにプログラムしてあります。
シュートのときは再度開きます。
*コンセプト [#a317f46d]
光センサの値が低い(黒〜灰色)ときは右に、高い(灰色〜白)ときは左に曲がります。
そのためラインの左側に沿ってゴールまで移動していきます。
光センサの値が低い場合が続いたら交差点と判断し、突破用のプログラムが作動します。
光センサの値が高い場合が続いたらゴール前だと判断し、シュートして動作を終了します。
ボールは上で書いたように、2つのアームを使って運びます。
シュートはアーム2を開き、体当たりすることで行います。
*プログラム [#ye3fb51e]
**マクロ [#y9ccd10e]
#define THRESHOLD 39 //光センサの基準値
#define SPEED_H 30 //直線に進むときのスピード
#define SPEED_L 20 //曲線に進むときのスピード
#define downtime 10000 //ボールが射程範囲に入る時間で、この時間あたりでアーム2を下げる
#define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(300); //アーム2を下げる
#define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300); //アーム2を上げる
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); //引数に応じて運動する
#define go_forward OnRL(SPEED_H, SPEED_H); //まっすぐ進む
#define turn_left1 OnRL(SPEED_L, -SPEED_L); // 左旋回
#define turn_left0 OnRL(SPEED_L, 0); // 左折
#define turn_right0 OnRL(0, SPEED_L); // 右折
#define turn_right1 OnRL(-SPEED_L, SPEED_L); // 右旋回
#define STEP 1
#define nMAX 300 //光センサの値が低い状態がこの時間だけ続いたら、交差点突破プログラムを発動する
#define CROSS_TIME 200 //交差点突破に必要な時間
#define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500);\
up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); //シュートするプログラム
**サブルーチン [#mc07ce40]
sub short_break(long s)
{
int a=0;
while(a<1000)
{
Off(OUT_BC);
Wait(STEP);
if(CurrentTick()-s<=downtime+1.0 && downtime<=CurrentTick()-s)
{
down;
}
a++;
}
}
sub cross_line(long t)
{
int b=0;
while(b<CROSS_TIME)
{
OnRL(SPEED_L,SPEED_L);
Wait(STEP);
if(CurrentTick()-t<=downtime+1.0 && downtime<=CurrentTick()-t)
{
down;
}
b++;
}
}
sub c_direction(long u)
{
int c=0;
while(c<nMAX)
{
turn_left1;
Wait(STEP);
if(CurrentTick()-u<=downtime+1.0 && downtime<=CurrentTick()-u)
{
down;
}
c++;
}
}
**メイン [#a1376baa]
***開始から10秒まで [#i2b8cf80]
task main()
{
SetSensorLight(S3);
int nOnline=0;
long t0=CurrentTick();
int g=0;
while (CurrentTick()-t0<10000)
{
while (nOnline < nMAX)
{
if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0)
{
down;
}
if (SENSOR_3 < THRESHOLD-8)
{
turn_right1;
nOnline++;
}
else
{
if (SENSOR_3 < THRESHOLD-5)
{
turn_right0;
}
else if (SENSOR_3 < THRESHOLD+5)
{
go_forward;
}
else if (SENSOR_3 < THRESHOLD+8)
{
turn_left0;
}
else
{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
short_break(t0);
c_direction(t0);
cross_line(t0);
nOnline=0;
}
***開始から10秒以降 [#c297922f]
while(CurrentTick()-t0>10000.0 && CurrentTick()-t0<10000000.0)
{
while (nOnline < nMAX)
{
if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0)
{
down;
}
if (SENSOR_3 < THRESHOLD-8)
{
turn_right1;
nOnline++;
g=0;
}
else if (SENSOR_3 >= THRESHOLD+8)
{
turn_left1;
g++;
nOnline=0;
if(g==nMAX)
{
nOnline=nMAX;
}
}
else
{
if (SENSOR_3 < THRESHOLD-5)
{
turn_right0;
}
else if (SENSOR_3 < THRESHOLD+5)
{
go_forward;
}
else if (SENSOR_3 < THRESHOLD+8)
{
turn_left0;
}
nOnline=0;
g=0;
}
Wait(STEP);
}
if(g<nMAX)
{
short_break(t0);
c_direction(t0);
cross_line(t0);
nOnline=0;
}
else if(g==nMAX)
{
short_break(t0);
turn_right1;
Wait(nMAX*STEP);
goal;
t0-=10000000;
}
}
}
*結果 [#e41fff56]
*苦労したところ・反省点 [#h7ce2d02]
**苦労したことと解決法 [#b65b839b]
**反省点 [#o868e8fc]
*感想 [#f439ae4e]