- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009a]]
*光に向かってブロックを投げるロボット [#g16c74c9]
**課題 [#kd5c47bc]
1、止まっている懐中電灯を全方向から探し出してそこにブロックを投げる。(DAN)&br;
2、動く電灯を追いかけてブロックを投げる。(だる)
*ロボット [#bc0e9bfb]
&ref(reverse.jpeg);
*content [#ua1ef121]
&br;モーター1つで左右の回転が出来ます。
右回転と左回転を繰り返すことによて前進可能。
*光に向かってブロックを投げるロボット [#g16c74c9]
&ref(arm.jpeg);
&br;
30cm の所までブロックを投げるために腕は長めに作りました。
&ref(all.jpeg);
&br;二つの光センサーの間には遮光版を付け、電灯の光が左右どちらから来ているのか
判断しやすくしました。
**1、DANのプログラム [#wf1f41e2]
int brightmax ;int runover ;
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_A,7);
brightmax=SENSOR_1;ClearTimer(0+1);OnFwd(OUT_A);
until(Timer(1)==70) //1回転するまで
{if(SENSOR_1>brightmax){brightmax=SENSOR_1;ClearTimer(0);}} //1番明るかった時の時間を記録して、
runover=Timer(0);ClearTimer(1);
until(Timer(1)>=(runover+10)){OnRev(OUT_A);}
Off(OUT_A);Wait(30); //その時間だけ逆回転して、向き直る
until((SENSOR_1>48)&&(SENSOR_3>48))
{if(SENSOR_1>SENSOR_3){OnFwd(OUT_A);Wait(20);}
else{OnRev(OUT_A);Wait(20);}} //近づく
until(SENSOR_1==SENSOR_3){
if(SENSOR_1>SENSOR_3){OnFwd(OUT_A);}
if(SENSOR_3>SENSOR_1){OnRev(OUT_A);}} //狙いを定める
Off(OUT_A);OnRev(OUT_B);Wait(10);Off(OUT_B);} //腕を0.1秒間振ることによってブロックを投げる
**2、だるのプログラム [#mcb91f8f]
#define T 35 //明るさの基準を35に設定
#define rst OnRev(OUT_A);Wait(100);Off(OUT_A); //右に少し回転
#define lst OnFwd(OUT_A);Wait(100);Off(OUT_A); //左に少し回転
task main (){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
while(SENSOR_3<=57){ //明るさが57以下の時に以下の操作を繰り返す
if (SENSOR_1<T){ //左右のセンサーがライトを知覚していないときは、右回転してライトを探す
if (SENSOR_3<T){
lst}
else { //右のセンサーのみがライトを知覚しているときは右回転
rst}}
else { //左右のセンサーがライトを知覚しているときは左回転
if (SENSOR_3<T){
lst}
else { //左のセンサーのみが光を知覚しているときは右回転
lst
}}} //繰り返し終了
OnRev(OUT_B); アームを回転させて懐中電灯にブロックを投げる
Wait(10);
Off(OUT_B);
}
*感想 [#sd263d9c]
(DAN):駆動系はヒントを参考にしながら作ったが、頑丈な構造にすることがなかなか難しかった。ロボットを動かす場所(机の上、床の上など)によって周りの明るさが変化してしまい、プログラムの組み立てではそこが苦労した。また、このプログラムだと、最初に1回転するのに時間が掛かってしまうので、もう少しスマートな動きをさせることが出来ればよかったと思う。(まず左右どちらがより明るいか判断する、など)
(だる):懐中電灯が小さかったので当てるプログラムを作るのに苦労しましたが、ライントレースのプログラムを応用したので比較的簡単にできました。
*コメント [#xa57f986]
感想をよろしくお願いします。
- 一つ目のプログラムに関しては何故runover+10となっているのかと、SENSOR_1とSENSOR_3が等しいとするよりも、その差が5以下くらいとした方が実際的です。2つ目のプログラムに関しては、左右のセンサが光を感じた時には懐中電灯が真正面にあると考え、左右の回転を小刻みに繰り返して前進させた方がより正確に追跡できます。下から7行目のelseの意味がなくなっています。また、できればですが、懐中電灯の動きが止まったことをもっと正確に認識させた方がいいと思います -- [[FI]]{2009-07-28 (火) 08:44:44};
#comment