[[2019a/Member]] #contents *課題について[#yff595ab] **コース [#w093d212] 下の図のようなコースを各チームで作成し、「ミッション」を遂行せよ。 #ref(./IMG_5614.PNG,50%) **ミッション [#ocb1991b] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) *ロボットについて [#t7f18d81] #ref(./72BD800E-741E-40CA-BCFC-2A8A03815300.jpeg,10%) 車体を比較的コンパクトになるようにした。 #ref(./C8850B42-83FF-4B3E-A903-949E054D7269.jpeg,10%) ボールをキャッチするためにアームを取り付け、アームの反対側にボールストッパーを取り付けた。 *プログラムについて [#ob2dffc3] **#defineの設定 [#d09d188f] #define Turn_RightL OnFwd(OUT_A); OnRev(OUT_C); #define Turn_LeftL OnFwd(OUT_C); OnRev(OUT_A); #define Go OnFwd(OUT_AC); #define Turn_RightS OnFwd(OUT_A); Off(OUT_C); #define Turn_LeftS OnFwd(OUT_C); Off(OUT_A); #define Catch OnRev(OUT_B); Wait(30);Off(OUT_B);OnFwd(OUT_AC);Wait(50);Off(OUT_AC);OnFwd(OUT_B);Wait(30);Off(OUT_B); #define Shoot OnRev(OUT_B);Wait(30);Off(OUT_B);OnFwd(OUT_AC);Wait(30);Off(OUT_AC); まず上から右旋回、左旋回、直進、右折、左折、ボールを掴む、ボールを放すといった動作を定義した。 **サブルーチンの設定 [#hf2e683e] sub follow_lineL() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<27){ if (SENSOR_2 > 49){ Turn_RightL; ClearTimer(0); } else if (SENSOR_2 > 45){ Turn_RightS; ClearTimer(0); } else if (SENSOR_2 >42){ Go; ClearTimer(0); } else if (SENSOR_2 > 37){ Turn_LeftS; ClearTimer(0); } else { Turn_LeftL } } Off(OUT_AC); Wait(100); ClearTimer(0); } sub follow_lineS() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<20){ if (SENSOR_2 > 49){ Turn_RightL; ClearTimer(0); } else if (SENSOR_2 > 45){ Turn_RightS; ClearTimer(0); } else if (SENSOR_2 >42){ Go; ClearTimer(0); } else if (SENSOR_2 > 37){ Turn_LeftS; ClearTimer(0); } else { Turn_LeftL } } Off(OUT_AC); Wait(100); ClearTimer(0); } sub follow_lineT() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<18){ if (SENSOR_2 > 49){ Turn_RightL; ClearTimer(0); } else if (SENSOR_2 > 45){ Turn_RightS; ClearTimer(0); } else if (SENSOR_2 >42){ Go; ClearTimer(0); } else if (SENSOR_2 > 37){ Turn_LeftS; ClearTimer(0); } else { Turn_LeftL } } Off(OUT_AC); Wait(100); ClearTimer(0); } ひとつのサブルーチンでは全ての曲がり角に対応できないので、秒数を変えた3つのサブルーチンを使って使い分けるようにした sub cross_lineL() { OnRev(OUT_C); Off(OUT_A); Wait(50); OnFwd(OUT_AC); Wait(70); Off(OUT_AC); } 曲がり角で止まったときに直進するためのサブルーチンを上のようにした。 sub cross_lineS() { OnRev(OUT_C); Off(OUT_A); Wait(90); OnFwd(OUT_AC); Wait(40); Off(OUT_AC); } Hの地点で上のサブルーチンではうまく行かないことが多かったので少し変えたサブルーチンを作った。 sub cross_lineT() { OnFwd(OUT_C); Off(OUT_A); Wait(120); Off(OUT_AC); } Jの地点で曲がるためのサブルーチンを作った。 **全体のプログラム [#i1b8d558] task main() { follow_lineL(); M→Kまで cross_lineL(); Kを直進 Catch; ボールを掴む OnRev(OUT_AC); Wait(100); Off(OUT_AC); OnFwd(OUT_C); OnRev(OUT_A); Wait(50); Off(OUT_AC); Kまで戻って旋回 OnFwd(OUT_AC); Wait(30); Off(OUT_AC); follow_lineS(); 直進してライントレースに戻る cross_lineT(); follow_lineT(); J→Iまで cross_lineL(); follow_lineS(); I→Hまで cross_lineS(); follow_lineL(); H→Fまで OnFwd(OUT_C); OnRev(OUT_A); Wait(80); Off(OUT_AC); Fで直角に曲がる follow_lineL(); F→Eまで OnFwd(OUT_C); OnRev(OUT_A); Wait(80); Off(OUT_AC); Eで直角に曲がる follow_lineS(); E→Dまで OnFwd(OUT_AC); Wait(30); Off(OUT_AC); Dを直進 follow_lineL(); D→Cまで OnFwd(OUT_AC); Wait(30); Off(OUT_AC); Cを直進 follow_lineL(); C→Bまで cross_lineL(); Bで向きを直す Shoot; } ボールをシュート *まとめ [#v7159aa7] 一通り成功することはできたが、K地点で止まることとボールを掴むところは何回かに一回成功するという感じだったので完成したとは言いがたかった。FastTimarをうまく使いこなせばうまく行けたのかもしれない。しかし、他の部分はサブルーチンを使い分けることで比較的スムーズにいったのでよかった。