*4.光を追うロボット [#v8ee75a7] &ref(2005/C1/練習問題4/2006_0113画像0035.JPG,50%,がるーだDX);&ref(2005/C1/練習問題4/2006_0113画像0038.JPG,50%); -センサーがまっすぐ前を向いていると光を感知しにくいため,斜め上をむかせた。 また、小回りが利くように車体をコンパクトにした。 **プログラム1 [#tf0ad3af] #define straight OnFwd(OUT_A+OUT_C); #define left OnFwd(OUT_A);OnRev(OUT_C); #define right OnFwd(OUT_C);OnRev(OUT_A); #define minous 15 int light_max=0; int i=0,i_max; task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); for(i=0;i<35;i++){ right //右に1秒旋回して0.5秒止まる動作をする度に、iに1プラスしてiが35になるまで繰り返す。 Wait(10);Off(OUT_C+OUT_A);Wait(5); if(SENSOR_1>light_max){ light_max=SENSOR_1; //センサー1の値を明るさの最大値にする。 i_max=i; //その時のiの値を最大値にする。 PlaySound(0); //確認のため音を出させる。 } } while(SENSOR_1<light_max){left} 明かりのあるところまで左旋回する。 while(true) { if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous)) { straight //光が両方のセンサーに当たっていれば、直進。 } if(SENSOR_1<(light_max-minous)) { left //右のセンサーに当たる光が弱くなると光が当たるところまで左に回る。 until(SENSOR_1>=(light_max-minous)); } if(SENSOR_3<(light_max-minous)) { right //左のセンサーに当たる光が弱くなると光が当たるところまで右に回る。 until(SENSOR_3>=(light_max-minous)); } } } -はじめの方のプログラムは前に作った「1周して1番明るかった所に戻って止まるロボット」のプログラムをそのまま使った。light_maxをそのまま使うと少しでも暗くなると すぐ左右に動くので、minousの値分引いて少し条件を緩めるとうまくいった。 **プログラム2 [#fa5a3720] #define straight OnFwd(OUT_A+OUT_C); #define left OnFwd(OUT_A);OnRev(OUT_C); #define right OnFwd(OUT_C);OnRev(OUT_A); #define minous 20 int light_max=0; int i=0,i_max; task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); for(i=0;i<35;i++){ right Wait(10);Off(OUT_C+OUT_A);Wait(5); if(SENSOR_2>light_max){ light_max=SENSOR_2; i_max=i; PlaySound(0); } } left start go_straight; start turn_right; start turn_left; } task go_straight() { while(true) { if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous)) { straight } } } task turn_left() { while(true) { if(SENSOR_1<(light_max-minous)) { left until(SENSOR_1>=(light_max-minous)); } } } task turn_right() { while(true) { if(SENSOR_3<(light_max-minous)) { right until(SENSOR_3>=(light_max-minous)); } } } -プログラム1はうまくいったはずだが、プログラム2は使ってやった記憶もない。ただ、直進、左旋回、右旋回を別のタスクに分けただけでほぼプログラム1と同じです。 コメントどうぞ #comment