2008b/A7/課題3右
目次
インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、 以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで 懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを 止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、 タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく 懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。
マシン製作はほとんどY田が担当。タキさは光センサ位置等の調整くらいしかやってない。
下にある画像が完成したマシンです。 このマシンの製作行程は以下の通り。
まずインストの「top secret」を参考にしてドライブベース部を作った。 このとき、モーターを回転させると、ストッパーがなければ両方のタイヤがそれぞれ逆方向に回転するが、このストッパーのおかげで後方に回転できないため、一方のタイヤだけが前進する。また、モーターを逆回転させれば、もう一方のタイヤだけが前進するようになっている。
ストッパー ギアの組み合わせ ドライブベース
次に、ブロックを投げるアームを製作
少し長いアームになったが、これは「苦労・工夫した点」に記述する。
ブロックを投げるアーム
ドライブベースとアーム、RCX、光センサを組む。 そして光センサの位置等を調節して、下図のようになり、マシン完成。
マシン全体図
モータ、センサについては以下の端子に接続してあります。
A端子 → モータ:タイヤ(正回転:右回転,逆回転:左回転) B端子 → 使用せず C端子 → モータ:アーム(正回転:使用せず,逆回転:投げる)
1端子 → 光センサ(右) 2端子 → 使用せず 3端子 → 光センサ(左)
Y田製作プログラム(課題1)
1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで 懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
task main(){ int s1, s3; //s1:センサ1の判定値、s3:センサ3の判定値 s1 = 0; s3 = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); //左回転 ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > s1)s1 = SENSOR_1; //センサ1のmax値を測定 if(SENSOR_3 > s3)s3 = SENSOR_3; //センサ3のmax値を測定 } s1 = s1 - 5; //センサ1の判定値を決定 s3 = s3 - 5; //センサ3の判定値を決定 while(1){ if((SENSOR_1 > 75) || (SENSOR_3 > 75)){ //75:おおよそ50cm離れてるときの値 Off(OUT_A); OnRev(OUT_C); //ブロックを投げる Wait(17); Off(OUT_C); break; } if(SENSOR_1 < s1 && SENSOR_3 >= s3){ //センサ3のみが判定値を超えていたら while(SENSOR_1 < s1)OnFwd(OUT_A); //センサ1が判定値を超えるまで右回転 } if(SENSOR_1 >= s1 && SENSOR_3 < s3){ //センサ1のみが判定値を超えていたら while(SENSOR_3 < s3)OnRev(OUT_A); //センサ3が判定値を超えるまで右回転 } } }
タキさ製作プログラム(課題2)
2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを 止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
/* 光追跡ロボット */ /* 定数を定義 */ #define SHI_J 75 //75:おおよそ50cm離れてるときの光センサ値 /* 前進関数 */ void move_fwd(void){ OnFwd(OUT_A); Wait(27); OnRev(OUT_A); Wait(20); Off(OUT_A); } /* メイン関数 */ task main(){ int rigth_max, left_max; //右センサ、左センサの懐中電灯判断値 rigth_max = 0; left_max = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > rigth_max)rigth_max = SENSOR_1; //右センサのmax値を測定 if(SENSOR_3 > left_max)left_max = SENSOR_3; //左センサのmax値を測定 } ligth_max = rigth_max - 5; //右センサの判断値決定 left_max = left_max - 5; //左センサの判断値決定 while(1){ if((SENSOR_1 > SHI_J) || (SENSOR_3 > SHI_J)){ //懐中電灯まで50cmになったら Off(OUT_A); //停止 OnRev(OUT_C); //ブロックを投げる Wait(17); Off(OUT_C); break; //ループを抜ける } if(SENSOR_1 >= rigth_max && SENSOR_3 >= left_max){ //両センサ値とも判断値以上なら while((SENSOR_1 >= rigth_max) || (SENSOR_3 >= left_max))move_fwd(); //その間前進 } else if(SENSOR_1 < rigth_max && SENSOR_3 >= left_max){ //左センサ値だけ判断値以上なら while(SENSOR_1 < rigth_max)OnRev(OUT_A); //右センサ値が判断値以上になるまで左回転 } else if(SENSOR_1 >= rigth_max && SENSOR_3 < left_max){ //右センサ値だけ判断値以上なら while(SENSOR_3 < left_max)OnFwd(OUT_A); //左センサ値が判断値以上になるまで右回転 } else if(SENSOR_1 < rigth_max && SENSOR_3 < left_max){ //両センサ値とも判断値未満なら while((SENSOR_1 < rigth_max) || (SENSOR_3 < left_max))OnRev(OUT_A); //どちらかのセンサ値が判断値以上になるまで左回転 } } }
苦労した点
工夫した点
よろしければコメントをどうぞ