*光センサー1つを可動式にし、最も強い光の方を向くプログラム progrm editer Hideshi [#e7ed5374]
**機体概略 [#p5a2b7b1]
-[[機体概略>2005/A3/自由課題2/機体概略]]
***メリット 最も強い光を確実に感知できる [#n0abe398]
***デメリット 光の感知にかかる時間が長い [#ff644e1d]
**基本プログラム [#x53f8f16]
void Right_Turn(int t) {SetPower(OUT_C,10);SetPower(OUT_A,2);OnFwd(OUT_A+OUT_C);Wait(t);}
//配線が入り組んで分かりにくくなったので、基本的な動きは全て定義した
//機体の旋回時間は、最も強い光を向くために微調整の必要があるので、voidを使用した
void Left_Turn(int t){SetPower(OUT_A,10);SetPower(OUT_C,2);OnRev(OUT_A+OUT_C);Wait(t);}
//同上
sub Stop(){Off(OUT_A+OUT_C);}
//同上
int Light_Max=0; //光センサーが、最も強い光を覚えるための文字を定義
int Action_Time=0; //機体が旋回するための時間を定義
int The_T=0; //最も強い光を感知するのにかかった時間を覚えるために定義
**実際に動かす [#s9851f85]
task main(){
SetPower(OUT_B,6);
//モータBは機体上部の可変型光センサー
//モータの力が強いと、動いた拍子に機体がぶれてしまうので、若干弱めるように設定した
for(The_T=0;The_T<=75;The_T=The_T+5)
//機体上部の可変型光センサーが動く時間を定義
//可変型光センサーは丁度時計の秒針のように、少し進んで止まるように設定
//この動作を計15回繰り返す
{OnFwd(OUT_B);Wait(5);Off(OUT_B);
//時計の秒針のように可変型光センサーを動かすプログラム(下のWait(30)も含めて)
if(SENSOR_2>Light_Max{Light_Max=SENSOR_2;Action_Time=The_T;PlaySound(SOUND_UP);};
//光センサーが動いている最中に、以前記憶した光よりも強い光を感知した場合、改めてその値を光の明るさを定義し、確認音を鳴らす
Wait (30);};
//秒針の動きをなすプログラムの1つ
OnRev(OUT_B);Wait(55);Off(OUT_B);
//光センサーを元の位置に戻すプログラム
//光センサーに繋がっているコードが絡まるため、半回転させて元の位置に戻す必要がある
//ここまでが機体上部の光センサーだけのためのプログラムで、以下は機体自体を動かすプログラム
if(Action_Time<45){Left_Turn((45-Action_Time)*2);}
//光センサーが機体の左側で光の最大を感知した場合、機体は左旋回で光の方を向く
else{Right_Turn((Action_Time-45)*2);}
//光センサーが機体の右側で光の最大を感知した場合、機体は右旋回で光の方を向く
Stop();
}
**感想 [#e60c3a37]
-本当はもっとスムーズな動きをさせたかったが、光センサーがリアルタイムで光を感知している訳ではないことが分かったので、時計の秒針のような動きをさせざるを得なかったことが残念だった。
-少しでも機体の無駄を省くため、機体の旋回方向を変えたのは、一番の工夫点である(と思う)
**コメントをお願いします [#s61583ff]
#comment