- 追加された行はこの色です。
- 削除された行はこの色です。
[[2012b/Member]]
* メンバー [#m268be8b]
Konbu・・・・繊維学部機械ロボット学系 ロボ作り初心者。
ARomeo・・・工学部 社長。
*課題 [#iaa20874]
・図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。
・1人目 i.スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。
ii.ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。
iii.ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。
・2人目 i.上の動作でスタートとゴールを逆にして同様の動きをするプログラムを作成せよ。ロボット本体は共通のものを使うとする。
#ref(2012b-mission1.png)
*ロボットの紹介 [#kd97b0ad]
・説明
高さと長さが目立つ構造で、ヘラクレスオオカブトに似た形となった。
アーム部分を、ボールを取る動作と蹴る動作をなるべく簡略するための構造とした。
#ref(201212172028000.jpg)
・写真の真ん中の黄色のアーム部分でボールを捉え、左の黒のアームでボールが横から転がるのを抑えている。
右のアームはアーム全体を持ち上げるのと同時にボールが発射するためのアーム。
#ref(201212171955000.jpg)
・このように三つのアームから成り立つ機構であり、モーターBを上げる動作と下げる動作の二つだけでボールの捕獲とキックができる。
#ref(201212172037000.jpg)
*プログラム [#c26f0cb0]
**戦略 [#t6e8ee4f]
交差点を曲がらないようにするため黒い線を捉えると直進するようにしたが、
しかしそれでは二個目の交差点を越えられないので、タイマーで時間を計測しプログラムを切り替えることにした。
大きく分けて四つのプログラムから成り立ってをり、なるべく時間の誤差が少なくするためにプログラムの切り替え場所を増やした。
#define BLACK 35
#define u_turn OnRev(OUT_A); OnFwd(OUT_C);
#define go_forward OnFwd(OUT_AC);
#define turn_left OnRev(OUT_A); OnFwd(OUT_C);
#define turn_right OnFwd(OUT_A); OnRev(OUT_C);
#define n_turn OnFwd(OUT_A); OnRev(OUT_C);
#define STEP 1
task main()
{
SetSensor(SENSOR_3, SENSOR_LIGHT);
ClearTimer(3);
OnFwd(OUT_B);
Wait(20);
OnFwd(OUT_AC);
Wait(90);
Off(OUT_B);
Off(OUT_AC);
Wait(70);
OnFwd(OUT_AC);
Wait(30);
ClearTimer(3);
while (FastTimer(3) <=100){
if (SENSOR_3 <= BLACK){
Off(OUT_AC);
Wait(50);
} else if(SENSOR_3 > BLACK && FastTimer(3) <=40){
OnFwd(OUT_AC);
Wait(5);
} else if(SENSOR_3 > BLACK && FastTimer(3) >40){
OnRev(OUT_AC);
Wait(5);
}
}
ClearTimer(3);
while (FastTimer(3) <=650){
if (SENSOR_3 <= BLACK){
go_forward;
Wait(10);
turn_right;
Wait(10);
ClearTimer(0);
}else if(FastTimer(0) >=100){
u_turn;
ClearTimer(0);
}else if(FastTimer(0) >40){
turn_right;
} else if(SENSOR_3 > BLACK){
turn_left;
}
}
Off(OUT_AC);
Wait(5);
u_turn;
Wait(40);
ClearTimer(3);
while (FastTimer(3) <=100){
if (SENSOR_3 <= BLACK){
Off(OUT_AC);
Wait(50);
} else if(SENSOR_3 > BLACK){
u_turn;
Wait(10);
}
}
Off(OUT_AC);
Wait(10);
ClearTimer(3);
while (FastTimer(3) <=2400){
if (SENSOR_3 < BLACK ){
go_forward;
ClearTimer(1);
ClearTimer(0);
}else if(SENSOR_3 > BLACK && FastTimer(1) >=60){
n_turn;
}else if(SENSOR_3 > BLACK && FastTimer(0) >=20){
turn_left;
} else if(SENSOR_3 > BLACK ){
turn_right;
}
}
Off(OUT_AC);
Wait(5);
ClearTimer(3);
while (FastTimer(3) <=1000){
if (SENSOR_3 < BLACK ){
go_forward;
ClearTimer(1);
ClearTimer(0);
}else if( FastTimer(1) >=10){
u_turn;
}else if( FastTimer(0) >=70){
turn_right;
} else if(SENSOR_3 > BLACK ){
turn_left;
}
}
Off(OUT_AC);
Wait(5);
ClearTimer(3);
while (FastTimer(3) <= 800){
if (SENSOR_3 < BLACK){
go_forward;
Wait(10);
ClearTimer(0);
}else if(SENSOR_3 > BLACK && FastTimer(0) >=40){
n_turn;
}else if(SENSOR_3 > BLACK && FastTimer(0) >=10){
turn_left;
} else if(SENSOR_3 > BLACK){
turn_right;
}
}
Off(OUT_AC);
Wait(100);
OnRev(OUT_AC);
Wait(60);
Off(OUT_AC);
turn_left;
Wait(40);
OnFwd(OUT_B);
Wait(20);
Off(OUT_B);
Off(OUT_AC);
}