[[2019a/Member]] 目次 #contents *課題2 [#x8ff2dc5] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ. #ref(2019a/Member/Matsui/Mission2/2019a-mission2.png) **コース [#n7213d58] 黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールには、長さ15または16のブロックおく. **ミッション [#je2585f0] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする). A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること. *ロボットの説明 [#r75924e2] ロボットのサイズやアームについて工夫した. **ロボットのサイズ [#udb43620] タイヤ間をモーター分だけにして小回りが利くようにした. #ref(2019a/Member/Matsui/Mission2/IMG_0198.JPG,ロボサイズ) **アーム [#y5e1e00c] モーターで開閉でき向きを変えればシュートを打てるアームを作った.(正面) #ref(2019a/Member/Matsui/Mission2/IMG_0197.JPG) モーターで開閉でき向きを変えればシュートを打てるアームを作った.(上) #ref(2019a/Member/Matsui/Mission2/IMG_0199.JPG) *プログラムの説明 [#fe750778] **defineの設定 [#ff20c1c3] RUN_TIMEや旋回について以下のように定義した. #define RUN_TIME1 800 #define RUN_TIME2 500 #define RUN_TIME_GHIJ 480 #define RUN_TIME_LM 1500 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define turn_left OnFwd(OUT_C);OnRev(OUT_A); **subルーチン の設定[#cdf814a1] 交差点を判断するために黒を検知する時間をとった.まずラインとレースに支障が出ず,その後の直進や曲がるときに大きな動きにならない時間を測った.その時間より長くセンサーが黒を感知すると一秒停止するようにした. D地点までのプログラム sub line_trace1() //Dの交差点で止まるまでライントレースし続けるプログラム { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME1){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); } DからGまでのラインとレースのプログラム sub line_trace2() //DからG(交差点)までライントレースするプログラム { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME2){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); } GHI間のラインとレースするプログラム sub line_trace_GHIJ() //GHIJ間のライントレース(内側) {SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME_GHIJ){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); } LM間のラインとレースするプログラム sub line_trace_LM() //LM間のライントレース {SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME_LM){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } } **全体のプログラム [#uca48c5d] task main(){ OnFwd(OUT_AC);Wait(100);//Aからライン上(外側)まで動かす line_trace1();//D地点の交差点までライントレース turn_right;Wait(45);OnFwd(OUT_AC);Wait(15); //停止後、右に旋回して位置調整し、少し前に進んで次のライントレースに備える line_trace2();//DEFGのライントレース turn_right;Wait(45);OnFwd(OUT_AC);Wait(25);//内側をライントレースするために位置調整 line_trace_GHIJ();// turn_right;Wait(100);OnFwd(OUT_AC);Wait(15); //J点で右に90度旋回し、まっすぐ進んで黒線を超える line_trace2();//交差点用ライントレース OnFwd(OUT_AC);Wait(15);//外側を通りたいので、少しまっすぐ動く turn_left;Wait(70);OnFwd(OUT_AC);Wait(100); //左に旋回しKLのセント車体を平行に、その 後L地点まで移動 OnFwd(OUT_B);Wait(15);//バンパーを閉じ、たまをキャッチ turn_right;Wait(200);//180度旋回 line_trace_LM();// turn_right(15);Off(OUT_AC);//車体を真っ直ぐにし、停止 OnRev(OUT_B);Wait(15);//バンパーを開く OnRev(OUT_AC);Wait(300);//車体を後ろに下げる OnFwd(OUT_B);Wait(15);//バンパーを閉じる OnFwd(OUT_AC);Wait(300);//直進してたまをシュートする } *まとめ [#n703b220] 今回の課題では交差点の判断をうまくしてくれなかったり,直角や急カーブをうまく曲がり切れなかったりして難しかった.最後は成功したがなぜ失敗するか考えるのが難しかった.ロボットやプログラムの改良をもっとスムーズにできるようにしたい.