- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題 [#y81382c6]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016b%2FMission2&openfile=2016b-mission2.png)
ルート1を担当する。
「A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点においたゴールへシュートする
Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S左折 → Dへシュート
ただし、
なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。
ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい
可能であればC,Dのゴールエリアライン上からシュートする」
*ロボット [#bd99d88b]
*ロボット本体 [#bd99d88b]
**本体 [#jeb0d1df]
**プログラム [#e14514df]
***定義 [#d37083b9]
***サブルーチンプログラム [#fea0d26a]
***メインプログラム [#ua9900a3]
*プログラム [#e14514df]
**定義 [#d37083b9]
**サブルーチンプログラム [#fea0d26a]
***線を追う [#c3b5760e]
#define turn_right OnRev(OUT_B,40);
#define turn_right_slow OnRev(OUT_B,40); OnFwd(OUT_C,30);
#define turn_left OnRev(OUT_C,40);
#define turn_left_slow OnRev(OUT_C,40); OnFwd(OUT_B,30);
#define go OnRev(OUT_BC,40);
#define MAX_TIME 500
sub FOLLOW_LINE()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){ //線上黒なら右折
turn_right;
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
turn_left; //線外白なら左折
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP);
Wait(2000);
}
・QR間の急なカーブを曲がる
#define kokizami_right OnRev(OUT_B,50); OnFwd(OUT_C,40);
#define kokizami_left OnRev(OUT_C,50); OnFwd(OUT_B,40);
sub FOLLOW_LINE_KOKIZAMI()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){ //線上黒なら右折
kokizami_right;
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
kokizami_left; //線外白なら左折
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP);
Wait(2000);
}
***右折・左折・直線 [#nede7519]
sub USETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_C,50); Wait(1500); Off(OUT_C);
}
sub SASETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_B,50); Wait(1500); Off(OUT_B);
}
sub CROSS()
{
go; Wait(800); Off(OUT_BC);
}
***ゴールにシュート [#m3d8c6fb]
**メインプログラム [#ua9900a3]
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S2);
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
CROSS(); //直進Q
go;
until (abs(SensorUS(S2)-13)>=4);
if(abs(SensorUS(S2)-13)>=4){
Off(OUT_BC);
CATCH_BALL;
}
FOLLOW_LINE();
CROSS(); //直進Q
FOLLOW_LINE_KOKIZAMI();
USETSU(); //右折R
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
SASETSU(); //左折S
FOLLOW_LINE();
GOAL();
}
*実演の反省 [#t2e538f8]
*学んだこと [#r6b9eff9]
*感想 [#p819a847]