[[2008b/MemberOnly/進行状況A]] *目次 [#p14a0371] #contents *課題3:懐中電灯に向かってブロックを投げるロボット †[#l9f49ea1] **1課題の概要 [#laef7acc] ~インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) ~1:全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 ~2:懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 **2ロボット本体の制作過程 [#rcc5b998] ***光センサー部分について [#dd15e398] ~【工夫した点】 ~懐中電灯の光を感知できるように、機体の前方につけた。 ~光センサーを一つだけ使い、機体がきちんと動くようなプログラムを作った。(1のプログラム) ~【苦労した点】 ~機体の前方につけたため、バランスをとるのが難しかった。 **3ロボット本体の完成 [#wd6ff4c6] 完成したロボット ~正面~ #ref(090108_1721~01.jpg) ~真上から~ #ref(090108_1719~01.jpg) ~真下から~ #ref(090108_1720~01.jpg) ***ロボットの感想 [#x6a8730d] ~【工夫した点】 ~機体をコンパクトにしたところ。 ~【苦労した点】 ~ディファレンシャル・ギアを使うことで、車輪を駆動させるモーターを一つにすることができたが、接触不良で機体が思うように動いてくれなかった。 ~【今後の課題】 ~機体を1周させるとき、どうしても楕円形の軌跡を描いた動き方になってしまったので、きれいな円を描くような機体を作りたい。 **4ロボットのプログラム [#ya63dbaf] ***1のプログラム [#r8891161] 制作者(しゅう) #define a OUT_A #define b OUT_B task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetPower(a+b,7); int defaultSensorLevel = SENSOR_1; int maxSensorLevel; // MaxLevel のセットスタート↓↓↓↓ while(true){ OnFwd(a); if(SENSOR_1>maxSensorLevel){ maxSensorLevel = SENSOR_1; } if(SENSOR_1 == defaultSensorLevel ){ break; } } Off(a); // MaxLevel のセット終了↑↑↑↑ // 懐中電灯を認知すると止まる。 while(true){ OnFwd(a); if(SENSOR_1 == maxSensorLevel){ break; } } Off(a); //懐中電灯に近づく repeat(5){ OnFwd(a);Wait(15); OnRev(a);Wait(15); } Off(a); //ブロックを投げる OnFwd(b);Wait(12); Off(b); } ***キヨのプログラム [#z70c203c] ***2のプログラム [#z70c203c] ~制作者(キヨ) #define THRESHOLD 65 //閾値の設定 #define RUN_TIME 20 //RUNTIMEの設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサーと定義付け SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3も光センサーと定義付け SetPower(OUT_A+OUT_B,7); //モーターの出力の設定 ClearTimer(0); while(Timer(0)<=RUN_TIME){ //タイマーが2秒以下の時に実行 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサー両方が閾値未満の時 {ClearTimer(0); //タイマーをリセット OnRev(OUT_A);} //左回りで光源を探す if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサー1のみ閾値を越えた時 {ClearTimer(0); //タイマーをリセット! OnRev(OUT_A);} //左回りで光源を追いかける if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) //センサー3だけ閾値を越えた時 {ClearTimer(0); //タイマーをリセットします OnFwd(OUT_A);} //右回りで光源を追いかける if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) //センサー両方閾値を越えた時 {OnRev(OUT_A); //前進していく OnFwd(OUT_A);}} Off(OUT_B); //タイマーが2秒を越えた時 Repeat(4) {OnRev(OUT_A); Wait(15); //懐中電灯に接近 OnFwd(OUT_A); Wait(15);} Off(OUT_A); OnFwd(OUT_B); Wait(15); //ブロックを投げる Off(OUT_B); //終了 ***プログラムの感想 [#x6a8730d] ~制作者(しゅう)のコメント ~【工夫した点】 ~懐中電灯の光に向かってブロックを投げるのではなく、光が一番強いところに向かってブロックを投げるプログラムを目指した。なぜなら、それが結果的に懐中電灯の光になると思ったからです。そこで、int関数を使い、defaultSensorLevelとmaxSensorLevelという形で表した。これにより、どの懐中電灯でも闘値を調べたりしなくても、懐中電灯に向かってブロックを投げるプログラムになりました。 ~【苦労した点】 ~int関数を使ったので、関数で今何をやっているのかを自分で理解するのが大変でした。 ~【今後の課題】 ~光センサー2つのプログラムを上の考え方で作ること。 ~制作者(キヨ)のコメント ~【工夫した点】 とてもシンプルなプログラムに出来た。 ~【苦労した点】 複雑なプログラムじゃないのに混乱した。シンプルな分、色々な状況を想定した時にこれでいいのか、大丈夫かと悩んだ。 ~【今後の課題】 このプログラムでは、色々な状況に対応出来ないと思う。柔軟なプログラムを目指したい。また、懐中電灯に近づく際のプログラムに改善の余地あり。 #comment プログラムが工夫している、かつシンプルでとても良いです。~ 2つめの課題にタイマーを使ったのは良いアイディアだと思いますが、懐中電灯がずっと直進してとまった場合、対応できないかもしれません。FI