目次 #contents *課題 光の向きにブロックを投げるロボット [#v8a10660] **ロボットの構造の工夫 [#p279fad2] アームに工夫をし、ゴムの反撥力を利用してブロックを飛ばします。 モーターの回転動力を余すことなく縦の投擲運動に変えるために、機関車のような機構を採用しました。~ &ref(090710_1838~01.jpg); また、センサーを二つ使うことにより、左右の向きの精度を上げ、真中に光をさえぎるためのついたてをすることで、左右のセンサーの値の違いをより明確に示すことができるようにしました。~ &ref(090710_1836~01.jpg); なんといっても今回の目玉はディメンション・ギア!! 結局取説の一番後ろに載っていたものを採用しましたが、他のものより積載量の大きいうちのロボットを機能させるには一番いい選択だったと思います。~ &ref(090710_1837~01.jpg); **ロボットの基本的なプログラム [#s440d64e] ・モーターを一つだけ使った駆動機構を駆使し、一番明るいところにロボットの向きを向ける。 ・その向きにブロックを投げる。 **それぞれのプログラム [#gfc9e5fc] ***これがハるのプログラムです。 [#l447a076] #define THRESHOLD 50 // #define ROUND 50 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while( (SENSOR_1 < THRESHOLD)||(SENSOR_3 < THRESHOLD) )//両方のセンサーが定義した値を超えた値になるまで { if(SENSOR_3 > SENSOR_1)//このロボットは構造上時計回りにしか動くことができないので、センサー3のほうが明るい値を示しているときは旋回します。 {OnRev(OUT_C);} else {OnFwd(OUT_C);} Off(OUT_C);//向いている向きに投げます。 OnRev(OUT_B); Wait(200); Off(OUT_B); } } 前回の評価を踏まえて、前回のプログラムに修正を加えました。 本体部品は回収されてしまっていますが、おそらくこのプログラムで相対的に明るい 地点に向かって部品を飛ばすことができると思われます。 前回のプログラムでは、defineで光の数値を定義していましたが、今回は、回転して 変数を置き換えてゆくことで相対的に高い数値の場所に方向転換できるように変更し ました。 #define TURN_TIME 300 //一周する時間 task main() { int light_max=0; //光センサの最大値 int t_max=0; //光センサの最大値を与える時刻 SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサー ClearTimer(0); //タイマーセット OnFwd(OUT_A); //右回りに回転 while(FastTimer(0)<TURN_TIME){ if (SENSOR_1>light_max) {light_max=SENSOR_1; t_max=FastTimer(0);} } 上記のプログラムで、光の明るさの最大値の値をlight_maxに代入し、回転時間を記録することで、二周目から明るい方向に向くことができるというわけです。 Off(OUT_A); //一旦停止 Wait(50); OnFwd(OUT_A); //右回りに回転 Wait(t_max); Off(OUT_A); //回転停止 OnRev(OUT_C); //ブロックを投げる Wait(40); Off(OUT_C); //停止 } ***これが松のプログラムです。 [#n87604be] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3は光センサー #define light_max=0; //光の最大値を設定 while(true) { if((SENSOR_1<50)||(SENSOR_3<50)) //1、3センサーが一定値より小さいと { OnRev(OUT_C); //旋回 light_max=SENSOR_1 //光の最大値をセンサー1の値に } else if(SENSOR_3=light_max) //センサ−3の値が最大値と同じなら { Off(OUT_C); //旋回停止、そして OnFwd(OUT_C); //前進! until((SENSOR_1>57)&&(SENSOR_3>57)) //光に近づくと Off(OUT_C); OnRev(OUT_B);Wait(200); //アーム起動! Off(OUT_B); } } } **結果 [#c516a4cb] &ref(090717_1724~01[1].jpg); **感想 [#r02ca29e] ***ハる [#n508b932] 今回は、制限時間が短かったということで、わかる範囲での文法でプログラムを書くことを心がけました。できるだけシンプルにまとめることで、動きをスムーズにすることができたと思います。 また、モーター一個での駆動域は、旋回性能に難はありますが、かなり興味深いもので、次回は両方に旋回できる駆動機構に挑戦したいと思います。 ***松 [#p8f366ea] 今回、時間がなくてプログラムが疎かになってしまいました。でも、ロボ作りはうまくできたと思います。結局、成功と言えるかどうか疑問が残ることになりましたが、特殊なギアに触れて、より、機械を作った実感がありました。 - できました!!コメントお願いします! -- [[ハる]] &new{2009-07-24 (金) 16:27:18}; - •松本先生曰く、今回の課題は絶対的に明るい方向を探すのではなく、変数を用いて相対的に最も明るい方向を探す課題だそうです。過去のページなどを参考にしてください -- [[FI]] &new{2009-08-05 (水) 13:29:08}; - 少し遅れましたが、前回のプログラムに修正を加えました。本体にて動作確認はできていませんが、おそらくこれで正常に動作すると思われます。評価をお願いします。 -- [[ハる]] &new{2009-08-10 (月) 13:06:03}; - 遅くなってすみません。一人目のプログラムの方は大きな問題はないと思います。二人目の方は、懐中電灯が左右に動きながら逃げていくのに対応できているでしょうか?また、breakや条件でwhileから抜け出すようにしましょう。ロボットが止まってもプログラムは止まらないことになります。 -- [[FI]] &new{2009-08-31 (月) 16:41:43}; - 遅くなってすみません。一人目のプログラムの方は大きな問題はないと思います。二人目の方は、懐中電灯が左右に動きながら逃げていくのに対応できているでしょうか?また、breakや条件でwhileから抜け出すようにしましょう。ロボットが止まってもプログラムは止まらないことになります。=は代入を意味してしまうので、else ifの()の中は== の方が適切だと思います。-- [[FI]] &new{2009-08-31 (月) 16:41:43}; #comment