#contents *課題 [#q40116a3] 懐中電灯に向かってブロックを投げるロボット 黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1,3は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。 (重複しないように一人一つ以上のプログラムを作成すること。2人のチームは1と2、3人のチームは1〜3) +全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。(担当、HIDAKA) +懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。(担当、YU) +全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。 ***構想 [#p91f2cce] **発射方法 [#tf97038f] &ref(P1010042.JPG); &ref(P1010044.JPG); &br; 最初に思いついた発射方法。黄色のブロックの間にたまを装填しモーターの回転運動を上下運動に変えて黄色い棒を画像に映っている手のように引きゴムの力を利用して弾を発射しようと考えたが、モーターの力があまり強くなくゴムを長く引き延ばすことができず遠くまでとばすことができないため断念。 **ロボット [#g494c040] &ref(P1010045.JPG); 弾を発射させる部分。弾装填時。四発まで装填することができるため連射も可能。 ホイールを横にして飛ばすことにより安定して飛ばすことができた。 &ref(P1010046.JPG); 飛ばすときの様子。 モーターにより黄色い棒を回転させ、一回転につき一発発射することができる。 **完成したロボット [#j7aec092] &ref(P1010047.JPG); 横からの画像。前方に発射台を取り付けた。 タイヤの大きさが前後で違い前のほうが少し大きいため車体は前方のほうが高くなっていることを利用して発射台を前方に取り付けることによって発射角度が大きくなり重心は後ろにいくためより安定したロボットになった。 &ref(P1010048.JPG); 正面からの画像。バランスが悪くならないように発射台はほぼ正面中央に取り付けた。 **その他工夫したところ [#f26bb74c] ***土台 [#f1fcb863] &ref(robo 土台.jpg); 前に出っ張っている部分が発射台を取り付ける部分。 左右対称にし大きな発射台がのっても安定するようにした。 コードを台の内部でまとめることによりコードが走行や作業の邪魔にならないようにした。 ***光センサー [#e7d106fd] &ref(P1010049.JPG); はじめは画像のように光センサーの間を広めにとってみたがライトが発光ダイオードであったため光が拡散せず両方のセンサーがうまく反応しなかった。 &ref(robo 光.jpg); 光センサーの間を狭めることによってライトの位置を正確に識別できるようになった。 *プログラム [#me17f1a5] **YUのプログラム(課題2) [#e955dfe2] #define LL 45 //光量の最低値を45に設定 #define LH 60 //最大値を60に設定 光を追う時の回転時間を定義。 これを入れないでライトを追わせようとするとモーターの回転時間が一瞬であるために機体が回転するのにとても時間がかかりライトを見失ってしまう。 #define TURN_TIME 10 弾を発射、3発連射 発射する前にピロピロ〜と高い音で合図をするようにした。 一発発射するごとに短くピッっとなるようにし人にも何発撃ったかわかるようにした。 void ranch (){ PlaySound(SOUND_UP) ; PlaySound(SOUND_UP); Wait(150);// ピロピロ〜と高い音で合図をする。 OnFwd(OUT_B); Wait(19); Off(OUT_B); PlaySound(SOUND_CLICK); OnFwd(OUT_B); Wait(19); Off(OUT_B); PlaySound(SOUND_CLICK); OnFwd(OUT_B); Wait(19); Off(OUT_B); PlaySound(SOUND_CLICK); } 左にライトが動いたとき素早く左に回転。 void turn_left(){ OnRev(OUT_C); OnFwd(OUT_A); Wait(TURN_TIME); Off(OUT_A+OUT_C); } 右にライトが動いたとき素早く左に回転。 void turn_right(){ OnFwd(OUT_C); OnRev(OUT_A); Wait(TURN_TIME); Off(OUT_A+OUT_C); } task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while(true){ if((SENSOR_3>LL)&&(SENSOR_1>LL)){ //ライトが前にあるなら OnFwd(OUT_A+OUT_C);Wait(30); //前進する } else if((SENSOR_1>LL)&&(SENSOR_3<LL)){ //右に移動したら turn_right();} //右折す else if((SENSOR_1<LL)&&(SENSOR_3>LL)){ //左に移動したら turn_left();} //左折する else if((SENSOR_1>LH)&&(SENSOR_3>LH)){ //ある程度近づいたら Off(OUT_A);Wait(400);} //ライトが動かないことを確認 else if((SENSOR_1>LH)&&(SENSOR_3>LH)){ //動いていなければ ranch (); break;} //弾を発射する } Off(OUT_A+OUT_C); } ***工夫したところ [#md59c81a] 室内の光量を計ってみるとだいたい35〜40でした。またライトが40センチ以上遠くにあるときは45〜60で、ライトが40センチ以内のときは60以上であったので球を発射するときの基準の光陵を60以上になった時に設定。近づきすぎるとライトがひかりが拡散しにくいLEDだから両方の光センサーで認識することができないので30センチ以上ライトに近づいた位置から球をはっしゃすることはありませんでした。 **HIDAKAのプログラム (課題1) [#a754246c] #define shot(t) OnFwd(OUT_B);Wait(t);Off(OUT_B); //ホイールを打ち出すマクロ #define sTop(T) Off(OUT_A+OUT_C);Wait(T); //動作を安定させるために少し停止させる sub turn_right() {OnFwd(OUT_A);OnRev(OUT_C);} //ロボを旋回させるサブルーチン task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); // SetSensor(SENSOR_3,SENSOR_LIGHT); // repeat(2){ //以下の動作を二回繰り返す turn_right(); // until(SENSOR_3 > 40); //光が一定の値より大きくなるで旋回。 sTop(100) // turn_right(); //ひとつ前の段階では最も明るい位置をとらえていないので調整するために旋回 until(SENSOR_1 > 40); // sTop(100) //打つ前に停止させる shot(42) //ホイールを二連射する turn_right(); //同じ電灯にホイールを打つのを回避するため少し旋回させる Wait(50); // } } ***問題点[#qb36e301] 光の値の最大値を探すような調整がまだまだ不十分だと思う。もう少し煮詰めてもよかったと思う。 ***工夫したところ [#r88c28b2] 最も明るい位置に向けて投げるように調整させる部分、二つのほぼ等しい値の真ん中なら光の中心、つまり最も明るい部分だと思ったので、そこに投げさせた。とはいえ問題点で記したように、まだ不十分だと思う。 *コメント [#u1600bd5] コメントをどうぞ! - 一人目のプログラムに関しては、ライトが動かなくなってからの場合わけがうまくいっていない気がします。二人目に関しては、二つのほぼ等しい値の真ん中なら光の中心、つまり最も明るい部分というのは面白い考えですが、今回は懐中電灯が2つであること、1つだったとしても懐中電灯のちょうど反対側も同じ条件を満たすので、改良してみてください。 -- [[FI]] &new{2010-07-30 (金) 17:52:27}; #comment