黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。 (重複しないように一人一つ以上のプログラムを作成すること。)
1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
懐中電灯の代わりに携帯のライトなどを利用してもよい。
スズキ
ミズイ
ロボットの全体像です。ホイールを投げる部分が重いため補強していったら不格好になってしまいました。
今回は遠心力を使って投げるようにしました。重くなってしまったため取り付けが難しかった。
ホイールを入れるとこんなかんじになります。見えにくいですが奥まで入っています。
光センサーの部分は幅を広めにしてみました。高さが低い気がするがぎりぎり大丈夫だと思う。
1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。
#define turn_time 400 //一回転する時間 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //右に回転する #define turn_left OnFwd(OUT_C);OnRev(OUT_A); //左に回転する #define throw OnFwd(OUT_B);Wait(30);Off(OUT_B); //投げる動作 int l_max1=0; //1番光が強いところ int l_max2=0; //2番目に光が強いところ int t_max1=0; //l_max1までの時間 int t_max2=0; //l_max2までの時間 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーとする SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); //センサー1を好感度モードにする ClearTimer(0); while(FastTimer(0)<turn_time){ //回転している間 if(SENSOR_1>l_max1){ //光の最大値を見つけたら l_max2=l_max1; //今までの最大値を2番目にする t_max2=t_max1; //今までの最大値のタイムを2番目にする l_max1=SENSOR_1; //光の最大値と設定する t_max1=FastTimer(0); //タイマーを入れる } if(SENSOR_1<l_max1&&SENSOR_1>l_max2){ //2番目に強い光を見つけたら l_max2=SENSOR_1; //光の2番目に大きい値と設定する t_max2=FastTimer(0); //タイマーを入れる } turn_right; //回転する } turn_left;Wait(turntime-t_max2);Off(OUT_A+OUT_C); //光源まで回転する throw; //投げる turn_right(turntime-t_max2);Off(OUT_A+OUT_C); //元の位置まで戻る turn_left(turntime-t_max1);Off(OUT_A+OUT_C); //光源まで回転する throw; //投げる }
2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
#define LIGHT 60 //光を追うための閾値 #define LMAX 80 //光に近づいたときの数値 sub throw() {OnFwd(OUT_B);Wait(30);Off(OUT_B);} //投げる task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); while(SENSOR_1<LMAX||SENSOR_3<LMAX) while(SENSOR_1<LMAX||SENSOR_3<LMAX){ if(SENSOR_1>LIGHT&&SENSOR_3>LIGHT){ //両センサが明るいとき前進 OnFwd(OUT_A+OUT_C); }else if(SENSOR_3>LIGHT){ //センサ3だけ明るいとき右回転 OnFwd(OUT_A);OnRev(OUT_C); }else{ //センサ1だけ明るいとき左回転 OnFwd(OUT_C);OnRev(OUT_A); } } Wait(300); //懐中電灯が止まったか確認 } throw(); //投げる }
今回は製作時間が短かったためシンプルなロボットになってしまったので少し残念。
時間がなくて大変だったけど、なんとか動くものができたのでよかった。
コメントをどうぞ