[[2016a/Member]] *目次 [#vb047a36] #contents *はじめに [#gca5125f] #ref(2016a-mission2.png) 課題2の内容は、光センサーを用いて&br; 次のいずれかの経路を黒い線にそって動くロボットを作成する&br; (他のメンバーとは別の経路になるようにする)。&br; ただし、なるべく速く正確に動くロボットになるように工夫して、&br; 交差点では1秒間停止すること。&br; ・A地点からB地点へ (一人目)&br; A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点&br; ・B地点からC地点へ (二人目)&br; B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点&br; ・C地点からA地点へ (三人目)&br; C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点&br; (>2016年度前期/課題2)より&br; 今回は、A地点からB地点へロボットをライントレースさせた。&br; *ロボット本体の説明 [#y97e9f0f] #ref(dc8c76bc-1dc8-4fe5-85a2-f6bf5b867d3f.jpg) ロボットの前方についているのが光センサーである。&br; ロボットの機体は初期状態のまま使用した。&br; #ref(ba881582-7541-414d-bf2f-1e1f75e8949a.jpg) 光センサーは、地表面から1センチほど離した。&br; *プログラミングの説明 [#x55c6767] 定義文 #define BLACK 34 #define WHITE 70 #define LEFT OnFwd(OUT_B,40);OnRev(OUT_C,20);//左旋回 #define RIGHT OnFwd(OUT_C,40);OnRev(OUT_B,20);//右旋回 #define nMAX 210 #define short_break Off(OUT_BC);PlaySound(SOUND_CLICK);Wait(1000)//小休止かつ発音 #define STEP 1 #define go_f OnFwd(OUT_BC,40);Wait(200);Off(OUT_BC);//前進 #define go_f1 OnFwd(OUT_BC,40);Wait(1000);Off(OUT_BC);//前進1 #define go_f2 OnFwd(OUT_BC,40);Wait(1100);//前進2 #define LEFT2 OnFwd(OUT_B,40);OnRev(OUT_C,20);Wait(500); #define RIGHT2 OnFwd(OUT_C,40);OnRev(OUT_B,20);Wait(500); #define TURN OnFwd(OUT_C,40);OnRev(OUT_B,40);Wait(650);Off(OUT_BC); #define TURN2 OnFwd(OUT_C,40);OnRev(OUT_B,20);Wait(200);Off(OUT_BC); サブルーチン sub normal() { SetSensorLight(S2); int nOnline=0;//カウント開始 int k=0; while(k==0){ int nOnline=0;//黒線のカウント開始 int k=0;//交差点のカウント開始 while(k==0){//交差点のカウントが0の時 while(nOnline < nMAX){//カウントがnMAXより少ないとき if (SENSOR_2<BLACK) {//黒線上だと右に旋回 RIGHT; nOnline++;//カウントプラス } else if (SENSOR_2<WHITE) {//白だと左旋回 LEFT; nOnline=0;//カウントリセット nOnline=0;//黒線のカウントリセット } Wait(STEP); } short_break; k++; nOnline=0; k++;//交差点のカウントプラス nOnline=0;//黒線のカウントリセット } } sub normal2() { SetSensorLight(S2); int nOnline=0;//カウント開始 int k=0; while(k==0){ int nOnline=0;//黒線のカウント開始 int k=0;//交差点のカウント開始 while(k==0){//交差点のカウントが0の時 while(nOnline < nMAX){//カウントがnMAX以下の時 if (SENSOR_2<BLACK) {//黒線上なら左旋回 LEFT; nOnline++;//カウントプラス } else if (SENSOR_2<WHITE) {//白なら右旋回 RIGHT; nOnline=0;//カウントリセット } Wait(STEP); } short_break; k++; k++;//交差点のカウントプラス nOnline=0; } } サブルーチン1は黒線の右側をライントレースし、&br; サブルーチン2は黒線の左側をライントレースする。 プログラミング task main() { normal2(); go_f1; normal(); go_f; normal(); go_f; normal (); TURN; TURN2; go_f; normal(); LEFT2; normal(); go_f2; Off(OUT_BC); } 黒のカウントが210を超えると交差点と判断する。 黒のカウントがnMAXの210を超えると交差点と判断する。&br; 交差点と判断されるとそのサブルーチンは終了する。 *感想 [#bdf73b90] 光センサーを用いた課題2は、&br; センサーの調子や、ロボット自体の判断が関わってきたので&br; 課題1に比べるとかなり難易度が高かった。&br; プログラミングに関しても、&br; 課題1に比べ、使用する単語が増え、大変だった。&br; しかしその分、プログラミングに関する&br; 理解が深まった。