[[2017a/Member]] *課題について [#b551f234] **右折ルート [#w9fb12af] #ref(2017a/Member/takato/Mission2/コースj.png,100%) E右折(SOUND_UP) P一時停止(SOUND_DOWN)&左折 Q(SOUND_UP)&直進 R(SOUND_UP)&左折 T一時停止(SOUND_DOWN)&直進 T一時停止(SOUND_DOWN)&直進 H(SOUND_UP) G(SOUND_UP) S一時停止(SOUND_DOWN)&左折 P直進(SOUND_UP) Q左折(SOUND_UP) F(SOUND_UP) E直進 A停止(SOUND_DOWN) といったコースです。 *ロボットについて [#pa074fe5] **工夫した点 [#sc125f70] できるだけセンサーの位置をロボット本体に近くして、急旋回を可能にさせて、誤作動も少なくすることができた。 左側正面 &ref(2017a/Member/takato/Mission2/taka.jpg,50%);&br;左側側面 &ref(2017a/Member/takato/Mission2/to.jpg,50%);&br;裏面 &ref(2017a/Member/takato/Mission2/su.jpg,50%);&br;センサーアップ &ref(2017a/Member/takato/Mission2/ki.jpg,50%);&br;正面 &ref(2017a/Member/takato/Mission2/zu.jpg,50%);&br; 今回の課題ではロボットの大きさ制限(幅15cm長さ18cm以内)があったため、説明書に載っている基本の形を少し改良して収まるようにした。 *プログラムについて [#q6d5df60] **define [#r2bc4ac1] #define THRESHOLD 45 //閾値 #define SPEED_H 40 #define SPEED_L 25 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H, SPEED_H); //前方に直進 #define turn_left1 OnRL(SPEED_H, -SPEED_H); //左に旋回 #define turn_left0 OnRL(SPEED_L, 0); //左に旋回(左側のタイヤは停止) #define turn_right0 OnRL(0, SPEED_L); //右に旋回(右側のタイヤは停止) #define turn_right1 OnRL(-SPEED_L, SPEED_L); //右に旋回 #define STEP 1 #define nMAX 100 //最大値 #define short_break Off(OUT_BC); Wait(1000); //一秒停止 #define cross_line RotateMotor(OUT_BC,35,122); //交差点を直進 #define turn_right60 RotateMotor(OUT_BC,25,40); RotateMotor(OUT_C,24,170); //交差点を右折(右折後ロボットから見て線の左側でライントレース開始) #define turn_right45 RotateMotor(OUT_C,25,400); RotateMotor(OUT_B,24,-250); //右折(ライントレースの位置は変えない) #define turn_left90 RotateMotor(OUT_B,25,20); //左折(ライントレースの位置は変えない) #define turn_left60 RotateMotor(OUT_BC,25,70);RotateMotor(OUT_B,25,240);RotateMotor(OUT_C,25,-170); //(左折後ロボットから見て線の左側でライントレース開始) #define turn_left80 RotateMotor(OUT_BC,25,70); RotateMotor(OUT_B,25,240); //右折(右折後ロボットから見て線の左側でライントレース開始) **subrutine [#b8aefbec] sub asd() //交差点を感知したら右折 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_right0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } Off(OUT_BC); PlaySound(SOUND_UP); turn_right60; nOnline=0; } sub ksd() //交差点を感知したら左折 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_left0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } PlaySound(SOUND_DOWN); short_break; turn_left90; nOnline=0; } sub csd() //交差点を感知したら直進 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_left0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } Off(OUT_BC); PlaySound(SOUND_UP); turn_right60; nOnline=0; } sub dsd() //交差点を感知したら左折 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_left0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } Off(OUT_BC); PlaySound(SOUND_UP); turn_right1; Wait(nMAX*STEP); turn_left80; nOnline=0; } sub msd() //交差点を感知したら直進 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_right0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } Off(OUT_BC); PlaySound(SOUND_DOWN); short_break; cross_line; nOnline=0; } sub gsd() //交差点を感知したら右 { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_right0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } PlaySound(SOUND_UP); turn_right60; nOnline=0; } sub wsd() //左急カーブ { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_left0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } turn_left60; nOnline=0; } sub vsd() //右急カーブ { SetSensorLight(S3); int nOnline=0; while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-11) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-7) { turn_right0; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } Off(OUT_BC); turn_right45; nOnline=0; } **メインタスク [#vbef8b70] task main () { asd(); ksd(); csd(); dsd(); msd(); msd(); gsd(); wsd(); vsd(); gsd(); ksd(); csd(); dsd(); asd(); msd(); msd(); } **交差点の検知の仕方 [#h1b3dabf] 必ず交差点を検知するときは直進すると黒い部分にぶつかる側をラインとレースするようにプログラミングしているためタイムカウントのようなことをしなくても交差点を検知するようになっている。 *問題点 [#n1f1e00f] ロボットのセンサーを近づけようとした結果、センサーをしっかりと固定できず、たまに反応しなくなったり、反応しすぎてしまったりすることがあります。 *最後に [#b11ef7f4] 最終的に3回に1回くらいしか成功できず、安定性が低いプログラミングとなってしまいました。その理由はセンサーの安定性だけではなく、プログラミングの詰めの甘さも理由の一つと考えられます。 次はついにロボコンなので今回の改善点をしっかりと考慮して、気合を入れて取り組んでいきたいと思います。