[[2007a/A2/課題3右]] **課題3の3 [#ba12925d] 担当:いっせー 『懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。』という課題をこなすためのプログラム。 課題3の3では、光センサーを内側に向ける。簡単にセンサーの向きの調節可能にした利点を生かした。 &ref(2007a/A2/課題3右/200707051908000.jpg,40%,センサー向き変更後); ***実際のプログラム [#z1b5818a] #define THRESHOLD 65 //光の強さの境界を65に設定 #define RUN_TIME 500 //タイマー用の設定 sub straight() //前進用のプログラム { OnFwd(OUT_A); Wait(23); Off(OUT_A); OnRev(OUT_A); Wait(12); Off(OUT_A); //くねくねと進んでいく感じ } sub throw() //モノを投げるプログラム { Off(OUT_A); OnRev(OUT_C); Wait(15); Off(OUT_C); } task main() //課題3をこなすためのプログラム { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに設定 while((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //両方のセンサーが反応していないとき OnFwd(OUT_A);} //旋回し光を探す while(SENSOR_1>=THRESHOLD){ //センサー1が反応したとき OnRev(OUT_A);} //光に向かって進む while(SENSOR_3>=THRESHOLD){ //センサー3が反応したとき OnRev(OUT_A);} //光に向かって進む while((SENSOR_1<THRESHOLD)&&(SENSOR_3<=THRESHOLD));{ //両方のセンサーが反応したとき ClearTimer(0); //タイマーカウント開始 straight(); //直進 until(FastTimer(0)>RUN_TIME){ //タイマーが5秒以上になったとき throw();}} //投げる } センサーの向きが1.2とは変わっているので、左右のセンサーへの対応が1.2とは逆になっている。 ***工夫点 [#mcc115cb] ●untilとタイマーという、既に持っている知識でを組み合わせたプログラムを組んだ。 ●シンプルにおさまった。修正も簡単。 ●センサーの向きを課題をこなしやすい向きに変えた。 ***苦労した点 [#wd1d0b70] ●特になし。既存の知識のみを利用したので簡単に組めた。 ***改善点 [#q57fe897] ●他の班の利用していた関数や変数もい使ったプログラムも組んでみたい。 ●センサーの向きを変えずに課題をこなすプログラムも時間があったら組んでみたい。 ***感想 [#y44d9f45] ●センサーを向きを調節可能にしたことを生かしてみた。そうしたことで、プログラムをかなり簡略化することができた。この点に関しては予想通りにいってよかった。 ●おなかが空いて早く帰りたい一心で組んだプログラムにしてはうまくできたと思う(笑) ***課題3の3改 [#z0ecaf38] (後日)くやしかったから変数使ってみた #define THRESHOLD 65 //光の強さの境界を設定 sub straight() //直進用のプログラム { OnFwd(OUT_A); Wait(23); Off(OUT_A); OnRev(OUT_A); Wait(12); Off(OUT_A); } sub throw() //モノを投げるプログラム { Off(OUT_A); OnRev(OUT_C); Wait(15); Off(OUT_C); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに設定 int x; //変数の設定 int x_min=1,x_max=10; //変数Xの設定 while((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //両方のセンサーが反応していないとき OnFwd(OUT_A);} //旋回して光を探す while(SENSOR_1>=THRESHOLD){ //センサー1(右)が反応したとき OnRev(OUT_A);} //光に向かって進む while(SENSOR_3>=THRESHOLD){ //センサー3(左)が反応したとき OnRev(OUT_A);} //光に向かって進む while((SENSOR_1<THRESHOLD)&&(SENSOR_3<=THRESHOLD));{ //両方のセンサーが反応したとき for (x=x_min; x<=x_max; x++){ //変数の設定。値が1から10のとき straight();} //直進する throw();} //モノを投げる } タイマーを使っていたところを変数に置き換えただけなので、基本的にあまり変わらないが…