#contents *目的 [#t83d66c2] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、~ 以下の動きをするようにプログラムを作成せよ。 ~ (重複しないように一人一つ以上のプログラムを作成すること)~ 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 *マシン [#jcb36dbd] *前に二つのタイヤ、後ろにキャスターを付け、一つのギアで前進&回転するようにした。~ 駆動部分のギアとして、ディファレンシャル・ギアを使った。 全体図:~ 全体的にコンピュータ部分くらいの大きさにまとまった。~ 前後にセンサとキャスターが出ている。~ &ref(090121_223719.jpg); ギア部分:~ ディファレンシャル・ギア~ &ref(090121_223904.jpg); 投擲部分:~ これが向かって反時計回りに回転し、その勢いでホイールを投擲する。~ &ref(090121_223802.jpg); 後ろキャスター:~ 大事な本体の支え。~ &ref(090121_223840.jpg); *プログラム [#ld3bf57b] 動作確認を ***明かりに向かってホイールを投げるプログラム [#e551bf2f] プログラム挿入待ち ***動く明かりを追いかけ、停止したら投げるプログラム [#mfd6631e] #define SHOOT OnFwd(OUT_A);Wait(10);Off(OUT_A); //ホイールを投げる #define THRESHOLD 40 //閾値 int count_up; void GO(int t)//前進用 { OnFwd(OUT_B); Wait(t); Off(OUT_B); } void TURN(int t)//回転用 { OnRev(OUT_B); Wait(t); Off(OUT_B); } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//ライトセンサ:右 SetSensor(SENSOR_3,SENSOR_LIGHT);//ライトセンサ:左 SetPower(OUT_A,1); count_up = 0; while(1){ if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))//右も左も明かりを関知しない場合 { count_up = 0; TURN(5); Wait(20); } //前進する if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)&&(count_up==0))//明かりを関知し、かつカウントをしていない時 { count_up = count_up + 1; Wait(100); }//カウントを入れ、明かりが動くか待つ if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)&&(count_up==1))//明かりを関知し、かつカウントが入っているとき { Off(OUT_B); SHOOT } //止まって投げる } } *感想/反省 [#r7e4579c] ・作業時間があまりとれず、とても難しかった。~ ・マシン本体は当初前後に長かったのだが、それをコンパクト化することでバランスをとれるようにした。~ ・時折ギアが滑り不安だったが、いくらきちんとはめても改善されないため、もしかしたらわずかに摩耗しているのかもしれないと思う。~ 改善策としてはきっちり適切にはめる以外の方法を模索中。~ ・閾値を設定せず、相対的に明るい地点を探し出すようにさせるプログラムがなかなか思いつかず、~ 結局閾値を設定することにしてしまった。~ *コメントをどうぞ [#d12d711f] #comment