懐中電灯に向かって、白いホイールを投げる以下のプログラムを作成せよ。BY BOSS松本
(1) 全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる。懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。
(2) 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
(3)懐中電灯を動かしたとき懐中電灯に向かって進み、見失った時には再び全方向から懐中電灯を探しだす。7秒以上追尾できたら懐中電灯に向かってブロックを投げる。
ホイールを投げる形に作るのがとても大変でした。
前輪をつけるとうまく進まなくなりブレーキがかかってしまい、前輪をとると重心が前にいってしまい、ブロックでブレーキがかかってしまった。 試行錯誤の結果、前輪をつけることにし、前輪部分を修正することによってスムーズに進めるようにした。
今回のロボットは見た目が不細工になってしまったが、課題を達成するという目的を優先したので、そこは目をつぶっていただきたい。
#define THROW 50 //ブロックを投げるときの光の値を50に設定 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1をライトセンサーとする SetPower(OUT_C,4); //モーターCのパワーを4に設定 int light_max=0; int t_max=0; SetSensor(SENSOR_1,SENSOR_LIGHT); //一番明るい方向を探し出す ClearTimer(0); OnFwd(OUT_C); while ( Timer(0)<70){ if(SENSOR_1>light_max){ light_max=SENSOR_1; t_max=Timer(0); } } Off(OUT_C); Wait(20); OnFwd(OUT_C); Wait(t_max); Off(OUT_C); while(SENSOR_1<THROW){ //明るくなるまで近づく OnFwd(OUT_C); Wait(10); OnRev(OUT_C); Wait(10); } if(SENSOR_1 >THROW) //定めた値より大きくなったらブロックを投げる { Off(OUT_C); Wait(10); OnFwd(OUT_A); Wait(15); OnRev(OUT_A); Wait(3); Off(OUT_A); break; //ブロックを投げたら止まる Off(OUT_A+OUT_C); } } }
#define THERESHOLD 50 //光を追う動作で用いる闘値 #define THROW 60 //ブロックを投げる動作で用いる闘値 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光学センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光学センサー
while(SENSOR_3<=THRESHOLD){ //ロボットが光源にある程度まで近づくまで繰り返す if (SENSOR_1<THERESHOLD){ if (SENSOR_3<THERESHOLD){ OnRev(OUT_A); } else { OnFwd(OUT_A); } } } //センサー1,3が規定値(THROW)より大きくなったらブロックを投げて止まる// if((SENSOR_1> THROW)&&(SENSOR_3> THROW)){ Off(OUT_C); Wait(10); OnFwd(OUT_A); //投げる Wait(15); OnRev(OUT_A); Wait(3); Off(OUT_A); Wait(3) Off(OUT_A+OUT_C); //終わる } }
#define THRESHOLD 50 //光の値を定義 #define THROW 60 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1,3をライトセンサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_C,4); //モーターCのパワーを4に設定 clear_timer(1) while(Timer(1)<700){ //7秒間繰り返す if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_C); //両方のセンサーの明るさが規定値(THRESHOLD)より大きいとき前進 Wait(20); OnRev(OUT_C); Wait(20); if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //センサー1のみ規定値より大きいとき左回転して明るくなるところを探す OnFwd(OUT_C); Wait(50); } if((SENSOR_1>THROW)&&(SENSOR_3<THROW)){ //両方のセンサーの明るさが規定値(THROW)より大きいとき停止 Off(OUT_C); } else{ //それ以外のとき右回転して明るくなるところを探す OnRev(OUT_C); Wait(50); } } Off(OUT_C); //7秒後ブロックを投げる Wait(10); OnFwd(OUT_A); Wait(15); OnRev(OUT_A); Wait(3); Off(OUT_A); break; //ブロックを投げたら止まる Off(OUT_A+OUT_C); } } }
・ホイールをうまく遠くに飛ばすために、投げる部分を改良し、上の写真にある通りに仕上げました。
・タイヤを動かすためのモーターを1つにしなければならないという規定があったので、ロボット作りがとても大変でした。電池を入れる部分やモーターはとても重いので、一つのモーターのパワーでは負担が大きく、動くようにするのが大変でした。
今回の課題は前回に比べてBoss松本のヒントなどがあり、比較的やりやすかった。 しかしプログラムは、前回に引き続き苦戦を強いられたが、先輩などのプログラムを参考になんとか仕上げることができた。
ご自由にどうぞ^^