- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]目次
#contents
*課題2 [#ee8817df]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(./2019a-mission2.png,90%,ラインコース)
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
*ロボットの説明 [#defc7733]
**ロボット本体への工夫 [#va9a5665]
**センター部分への工夫 [#obf992dd]
**ロボット本体 [#va9a5665]
#ref(./tukamu.jpg,30%,全体)
**光センサー [#obf992dd]
#ref(./mae.jpg,40%,ラインコース)
*プログラムについて [#s7843b79]
**マクロプログラム [#a74845ee]
#define RUN_TIME1 30
#define RUN_TIME_JIH 170
#define RUN_TIME_HGF 380
#define RUN_TIME_FE 180
#define RUN_TIME_DB 1000
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define turn_left90 OnRev(OUT_A);OnFwd(OUT_C);Wait(100);
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);Wait(30);
#define go_straight OnFwd(OUT_AC);
#define turn180 OnRev(OUT_A);OnFwd(OUT_C);Wait(130);
#define go_back OnRev(OUT_AC);
**サブルーチンプログラム [#h8048afa]
***交差点で止まるまで動き続けるプログラム [#gab04cab]
sub line_trace1() //交差点で止まるまで動き続けるプログラム
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while ( FastTimer(0) <= RUN_TIME1 ) {
if ( 48 < SENSOR_2 ){
OnFwd(OUT_A); Off(OUT_C);ClearTimer(0); //白なら右へ
} else if (45 <SENSOR_2 < 49) {
Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ
} else {
OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回
}
}
Off(OUT_AC);Wait(100);
}
***JからI、IからHまでのライントレース一定時間内でライントレースし続ける [#r844b152]
sub line_trace_JIH()
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while ( FastTimer(0) <= RUN_TIME_JIH ) {
if ( 48 < SENSOR_2 ){
OnFwd(OUT_A); Off(OUT_C); //白なら右へ
} else if (45 <SENSOR_2 < 49) {
Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ
} else {
OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回
}
}
turn_right;Wait(22);OnFwd(OUT_AC);Wait(15);
}
***HからFまで一定時間内ライントレースし続ける [#ad14dcb9]
sub line_trace_HGF()
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while ( FastTimer(0) <= RUN_TIME_HGF ) {
if ( 48 < SENSOR_2 ){
OnFwd(OUT_A); Off(OUT_C); //白なら右へ
} else if (45 <SENSOR_2 < 49) {
Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ
} else {
OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回
}
}
}
***FからEまで一定時間内ライントレースし続ける [#sd63a8eb]
sub line_trace_FE()
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while ( FastTimer(0) <= RUN_TIME_FE ) {
if ( 48 < SENSOR_2 ){
OnFwd(OUT_A); Off(OUT_C); //白なら右へ
} else if (45 <SENSOR_2 < 49) {
Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ
} else {
OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回
}
}
}
***DからBまでのライントレース一定時間内ライントレースし続ける [#o92004ea]
sub line_trace_DB()
{ SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while ( FastTimer(0) <= RUN_TIME_DB ) {
if ( 48 < SENSOR_2 ){
OnFwd(OUT_A); Off(OUT_C); //白なら右へ
} else if (45 <SENSOR_2 < 49) {
Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ
} else {
OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回
}
}
}
**メインプログラム [#x0a4eba2]
task main(){
line_trace1(); //kから出発
line_trace_JIH(); //JからI
line_trace_JIH(); //IからH
line_trace_HGF(); //HからF
turn_left90; //Fで左90度旋回
line_trace_FE(); //FからE
turn_left; //Eで左旋回(90度以下)
line_trace1(); //EからDまでのライントレース後、一時停止
turn_right;Wait(25); //Dで左へ傾いた分、右に曲がって位置調整
line_trace_DB(); //DからB
turn180; //180度旋回
OnRev(OUT_B); //アーム展開
power(0);
Wait(25);
Off(OUT_B);
go_straight; //ボールから離れる
Wait(100);
OnFwd(OUT_B); //アームを閉じる
power(0);
Wait(25);
go_back; //後ろに下がって位置調整
Wait(55);
OnFwd(OUT_B);
Wait(10); //ボールをアームで弾いてAにシュート
}
*まとめ [#m9f10804]