*黒線に沿って走らせろ! [#b2e8acd5] 目次 #contents *メンバー [#x1c071aa] -ぐっP -鍾馗……電気電子工学科。ロボットに無駄なものを付けては改悪している。 *課題内容 [#r868ffa5] 次のような周回コース(黒い線)を動くロボットを作成せよ。 ・通常の交差点が2箇所以上ある ・ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む) ・直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する ・急なヘアピンカーブが1箇所以上ある ・スタート地点に目印がある ・黒い線の幅は15〜20mm程度 センサー、モーターはいくつ使ってもよい。プログラムは次の2つを作成すること。 1.直角のコーナーを通る 2.直角のコーナーを通らない(近道する) 交差点を曲がる時には、光センサを有効に使うこと(ある地点からの距離や時間だけに頼らないこと) との指令を受けて、私たちが開発したコースがこちらとなります。 なお、条件にある直角コーナーの進行は厳正なるじゃんけんの結果、''ぐっP→通る''、''鍾馗→近道''となりました。 #ref(2011b/A1/課題2左/course.jpg,100%,コース) 交差点では直進、ロータリーでは条件通り反時計回りに進行します。 ちなみに、ロータリー内の硬貨は大きさ比較のために置いただけです。やや大きめの紙に描いてあることがわかっていただければ幸いです。 *ロボットの紹介 [#gcb856c7] *プログラムの紹介 [#vb1b8168] **ぐっPのプログラム [#kd2772aa] **鍾馗のプログラム [#u84ae5cb] #define value 45 //明るさ1 #define Hvalue 50 //明るさ2 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int situation = 1; int cross = 0; int count = 0; SetPower(OUT_A,1); SetPower(OUT_C,1); while(situation!=100){ //最初の一歩。左に注意して進む while(situation==1 || situation==16){ OnFwd(OUT_AC); if(SENSOR_3 <= value) {Off(OUT_C);OnFwd(OUT_A);} else {Off(OUT_A);OnFwd(OUT_C);} if(SENSOR_1 <= value){ if(situation==1){situation = 2;} if(situation==16){situation = 17;} } } //鋭角左旋回 while(situation==2 || situation==17){ PlaySound(SOUND_CLICK);OnFwd(OUT_AC);Wait(70); PlaySound(SOUND_CLICK);Off(OUT_C);OnRev(OUT_A);until(SENSOR_1 <= value); PlaySound(SOUND_CLICK);OnFwd(OUT_C);Wait(35); PlaySound(SOUND_CLICK);OnFwd(OUT_AC);Wait(15);Off(OUT_AC); PlaySound(SOUND_CLICK); if(situation==2){situation = 3;} if(situation==17){situation = 18;} } //2センサートレース while(situation==3 || situation==11 || situation==15 || situation==18){ if(SENSOR_1 < value && SENSOR_3 > value) {OnFwd(OUT_C);Off(OUT_A);} if(SENSOR_3 < value && SENSOR_1 > value) {OnFwd(OUT_A);Off(OUT_C);} if(SENSOR_1 > value && SENSOR_3 > value) {OnFwd(OUT_AC);} if(SENSOR_1 < value && SENSOR_3 < value) { OnFwd(OUT_AC);Wait(30);PlaySound(SOUND_UP); if(cross==2){ Off(OUT_AC); if(situation==3){situation = 4;} if(situation==11){situation = 12;} if(situation==15){situation = 16;} if(situation==18){situation = 100;} } else{cross++;} } } //ロータリー進入。右旋回 while(situation==4 || situation==12){ PlaySound(SOUND_CLICK);OnRev(OUT_AC);Wait(20);Off(OUT_AC); PlaySound(SOUND_CLICK);OnFwd(OUT_A);OnRev(OUT_C);Wait(50); PlaySound(SOUND_CLICK);OnFwd(OUT_AC);until(SENSOR_1 <= value); PlaySound(SOUND_CLICK);Off(OUT_AC); PlaySound(SOUND_CLICK); if(situation==4){situation = 5;} if(situation==12){situation = 13;count = 0;} } //右に注意して進む while(situation==5 || situation==7 || situation==13){ if(SENSOR_1 <= value) {Off(OUT_A);OnFwd(OUT_C);} else {Off(OUT_C);OnFwd(OUT_A);} if(SENSOR_3 <= value){ if(count < 1){ OnFwd(OUT_AC);PlaySound(SOUND_UP);Wait(15);count++; } else{Off(OUT_AC);situation++;} } } //ロータリー脱出。右旋回 while(situation==6 || situation==14){ PlaySound(SOUND_CLICK);OnFwd(OUT_AC);Wait(10);OnRev(OUT_C);Wait(10); PlaySound(SOUND_CLICK);until(SENSOR_1 > Hvalue);until(SENSOR_1 <= value);Off(OUT_AC); if(situation==6){situation = 7;} if(situation==14){situation = 15;cross = 1;} } //点線進入。右旋回 while(situation==8){ PlaySound(SOUND_CLICK);OnFwd(OUT_A);Wait(5); PlaySound(SOUND_CLICK);until(SENSOR_1 > Hvalue);until(SENSOR_1 < value);Off(OUT_AC); PlaySound(SOUND_CLICK);OnFwd(OUT_C);Wait(5);Off(OUT_AC); PlaySound(SOUND_DOWN);situation++; } //点線進行 while(situation==9){ if(SENSOR_1 < Hvalue && SENSOR_3 > value){OnFwd(OUT_C);until(SENSOR_3 < value);Off(OUT_AC);} if(SENSOR_3 < Hvalue && SENSOR_1 > value){OnFwd(OUT_A);until(SENSOR_1 < value);Off(OUT_AC);} if(SENSOR_1 < value && SENSOR_3 < value){PlaySound(SOUND_DOWN);situation++;} } //点線脱出。右旋回 while(situation==10){ PlaySound(SOUND_CLICK);OnFwd(OUT_A);Wait(5); PlaySound(SOUND_CLICK);until(SENSOR_1 > Hvalue);until(SENSOR_1 <= value);Off(OUT_AC); PlaySound(SOUND_CLICK);OnFwd(OUT_AC);until(SENSOR_3 > Hvalue)Off(OUT_AC); PlaySound(SOUND_CLICK);situation=11; } } } *感想 [#q083144f]