インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、
以下の動きをするようにプログラムを作成せよ。
(重複しないように一人一つ以上のプログラムを作成すること)
1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
*前に二つのタイヤ、後ろにキャスターを付け、一つのギアで前進&回転するようにした。
駆動部分のギアとして、ディファレンシャル・ギアを使った。
全体図:
全体的にコンピュータ部分くらいの大きさにまとまった。
前後にセンサとキャスターが出ている。
投擲部分:
これが向かって反時計回りに回転し、その勢いでホイールを投擲する。
(担当:メガネ3号)
void go_straight(int t) { OnFwd(OUT_B); Wait(t); Off(OUT_B); } void go_turn(int_t) { OnRev(OUT_B); Wait(t); Off(OUT_B); } #define HIKARI 50 //光がある方向の閾値を50に設定 #define ATARI 85 //懐中電灯に到達したときの閾値を85に設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while(SENSOR_1<HIKARI) //SENSOR_1が懐中電灯を発見するまで回転 { go_turn(3); //モーターを通常通り回すと回転がはやすぎるので Wait(15); //回転:無回転=1:5の割合でモーターを回す } while(SENSOR_1<ATARI) //センサーが懐中電灯に達したと判断するまで { if(SENSOR_1<SENSOR_3) { go_turn(15); go_straight(40); } else { go_turn(45); go_straight(40); } go_turn(30); //後ろを向いて go_straight(100); //約50cm進み go_turn(30); //更に後ろを向いて OnFwd(OUT_A); //ホイールを投げる Wait(10); Off(OUT_A); }
(担当:メガネ1)
#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 } //止まって投げる } }
・作業時間があまりとれず、とても難しかった。
・マシン本体は当初前後に長かったのだが、それをコンパクト化することでバランスをとれるようにした。
・時折ギアが滑り不安だったが、いくらきちんとはめても改善されないため、もしかしたらわずかに摩耗しているのかもしれないと思う。
改善策としてはきっちり適切にはめる以外の方法を模索中。
・閾値を設定せず、相対的に明るい地点を探し出すようにさせるプログラムがなかなか思いつかず、
結局閾値を設定することにしてしまった。