[[2017a/Member]] 目次 #contents *今回の課題について [#v9709070] #ref(./course1.png,100%,a) 1 E右折(SOUND_UP) 2 P一時停止(SOUND_DOWN)&左折 3 Q(SOUND_UP)&直進 4 R(SOUND_UP)&左折 5 T一時停止(SOUND_DOWN)&直進 6 T一時停止(SOUND_DOWN)&直進 7 H(SOUND_UP) 8 G(SOUND_UP) 9 S一時停止(SOUND_DOWN)&左折 10 P直進(SOUND_UP) 11 Q左折(SOUND_UP) 12 F(SOUND_UP) 13 E直進 14 A停止(SOUND_DOWN) という道順で進むロボットを作らなければなりませんでした。 さらに、以下の条件を満たすようなロボットを作らなければなりませんでした。 ・できるだけ素早く正確に動くロボットになるように工夫しなければなりません。 ・一時停止の交差点および丁字路ではSOUND_DOWNを鳴らした後、1秒間停止しなければなりません。 ・直角コーナーと一時停止が必要でない丁字路ではSOUND_UPを鳴らし、停止せずに進まなければなりません。 ・ロボットのサイズは、15cmX15cmに収めなければなりません(高さに制限にありません)。 ・交差点、丁字路、直角コーナーについては、差し掛かった時点で判別しなければならず、予め設定した走行時間のみで判定したり、走行 距離のみで判定してはいけません。 *ロッボトについて [#f4d447b5] **概形 [#r0397754] #ref(./senn2.jpg,10%,a) 15cm四方の枠内に収めなければならないという条件が存在したのでできるだけコンパクトなロボットを作りました。 **車輪 [#pd458f58] #ref(./senn3.jpg,10%,a) 最初は前二輪、後一輪の三輪にしていましたが、後ろにタイヤをつけると小回りが利かなくなってしまうので、車輪を外し、後ろは支えるだけにしました。 **センサー [#xc1d8db6] #ref(./senn1.jpg,10%,a) センサーが本体から遠すぎたり近すぎたり紙から遠かったりするとすると、ロボットの動きが毎回変わってしまうので、センサーの位置を適当な位置に配置しました。 *交差点判断 [#v417694e] 白と黒の中間色より白が一定時間以上続く場合に、交差点と判断させるようにした。 *定数・マクロ [#dcdbd4e7] 最初に明るさの基準値を決めておき、その値から離れ具合によって次の行動を決定します。 また、場所によって曲がる角度が変化するので、曲がる方向が同じでも場所に応じて複数個に分けてみたり、交差点の直進か右折か左折かの判断の為に時間を計りました。 #define THRESHOLD 45 #define go_forward OnFwd(OUT_AC); //直進 #define turn_right0 OnFwd(OUT_A);OnRev(OUT_C); //右旋回 #define turn_right1 OnFwd(OUT_A); //右折 #define turn_left0 OnRev(OUT_A);OnFwd(OUT_C); //左旋回 #define turn_left1 OnFwd(OUT_C); //左折 #define s_up PlaySound(SOUND_UP); #define s_down PlaySound(SOUND_DOWN); #define Tmax 29 //ライン上を走る時間の上限 int t=0; //ライン上にTmax以上いた回数 *サブルーチン [#te702616] 直角に左折 sub cross_left(){ s_up; turn_left0; until(SENSOR_2 < THRESHOLD -3); } 直角に右折 sub cross_right(){ s_up; turn_left0; until(SENSOR_2 < THRESHOLD -3); } その場で一時停止 sub cross_stop(){ Off(OUT_AC);Wait(100); s_down; } 交差点を直進 sub cross_straight(){ turn_right1; Wait(20); go_foward; until(SENSOR_2 < THRESHOLD -3); turn_right1; until(SENSOR_2 < THRESHOLD +8); } n秒間ラインの左側をたどる void linetrace1(int s){ SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(2); while(FastTimer(2)<s){ if(SENSOR_2 < THRESHOLD -8){ turn_left0; }else if(SENSOR_2 < THRESHOLD -3){ turn_left1; }else if(SENSOR_2 < THRESHOLD +3){ go_forward; }else if(SENSOR_2 < THRESHOLD +8){ turn_right1; }else { turn_right0; } ClearTimer(0); } } *プログラミングについて [#c422dabd] 「t==0」のとき、最初の「if」の中に入ります。Fで交差点を見つけると「linetrace0」が終わります。 このとき「t==1」になりますが、「if」の動作が終わるまで「if」のままです。 そして「cross_left」に移ります。 「cross_left」が終わると「t==0」の「if」から出て、「t==1」の「if」に入ります。 #define go_straight OnFwd(OUT_AC); Wait(25); Off(OUT_AC); //交差点直進 #define cross_right Off(OUT_AC); Wait(3); OnFwd(OUT_A ); //右折 #define turn_right Off(OUT_AC); Wait(3); OnFwd(OUT_A); OnRev(OUT_C); //右回転 #define right_angle OnFwd(OUT_AC); Wait(25); Off(OUT_AC); OnFwd(OUT_A); OnRev(OUT_C); Wait(52); Off(OUT_AC); //右回転(直角) #define cross_left Off(OUT_AC); Wait(3); OnFwd(OUT_C); //左折 #define turn_left Off(OUT_AC); Wait(3); OnFwd(OUT_C); OnRev(OUT_A); //左回転 #define left_angle OnFwd(OUT_AC); Wait(25); Off(OUT_AC); OnFwd(OUT_C); OnRev(OUT_A); Wait(77); Off(OUT_AC); //右回転(直角) task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int a=0; while( a < 5 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; a++; } } //ここまでE PlaySound(SOUND_UP); right_angle; int b=0; while( b < 4 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 40 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; b++; } } //ここまでP Off(OUT_AC); Wait(100); PlaySound(SOUND_DOWN); left_angle; int c=0; while( c < 4 ){ if(SENSOR_2 >= 50){ turn_right; } else if(SENSOR_2 >= 45 ){ cross_right; } else if(SENSOR_2 >= 40 ){ cross_left; } else if(SENSOR_2 >= 30 ){ turn_left; c++; } } //ここまでQ go_straight; int d=0; while( d < 4 ){ if(SENSOR_2 >= 50){ turn_right; } else if(SENSOR_2 >= 45 ){ cross_right; } else if(SENSOR_2 >= 40 ){ cross_left; } else if(SENSOR_2 >= 30 ){ turn_left; d++; } } //ここまでR go_straight; int e=0; while( e < 5 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_light; } else if(SENSOR_2 >= 30 ){ turn_right; e++; } } //ここまでT PlaySound(SOUND_DOWN); go_straight; int f=0; while( f < 6 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; f++; } } //一周してTに戻る PlaySound(SOUND_DOWN); go_straight; int g=0; while( g < 11 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; g++; } } //ここまでH PlaySound(SOUND_UP); right_angle; int h=0; while( h < 60 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; h++; } } //ここまでG PlaySound(SOUND_UP); right_angle; int i=0; while( i < 3 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; i++; } } //ここまでS PlaySound(SOUND_DOWN); Off(OUT_AC); Wait(100); left_angle; int j=0; while( j < 4 ){ if(SENSOR_2 >= 50){ turn_right; } else if(SENSOR_2 >= 45 ){ cross_right; } else if(SENSOR_2 >= 40 ){ cross_left; } else if(SENSOR_2 >= 30 ){ turn_left; j++; } } //ここまでP PlaySound(SOUND_UP); go_straight; int k=0; while( k < 4 ){ if(SENSOR_2 >= 50){ turn_right; } else if(SENSOR_2 >= 45 ){ cross_right; } else if(SENSOR_2 >= 40 ){ cross_left; } else if(SENSOR_2 >= 30 ){ turn_left; k++; } } //ここまでQ PlaySound(SOUND_UP); go_straight; int l=0; while( l < 5 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37 ){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; l++; } } //ここまでF PlaySound(SOUND_UP); right_angle; int m=0; while( m < 10 ){ if(SENSOR_2 >= 50){ turn_left; } else if(SENSOR_2 >= 45 ){ cross_left; } else if(SENSOR_2 >= 37){ cross_right; } else if(SENSOR_2 >= 30 ){ turn_right; m++; } } //スタート地点に戻る Off(OUT_AC); PlaySound(SOUND_DOWN); } //停止して終了 * 結果 [#g5b4d5d4] 前回の課題同様上手くいく時と上手くいかない時がありました。上手く行かなっかた時のほうが多かったのですが最終的には上手く行きました。一番難易度が高かったのは交差点を直進するのか、曲がるのかを判断させるプログラミングを組むことでした。