2007b/A3

*なお、この課題ではロボットとプログラムが完成したところで時間切れとなってしまいました。そのため、できたところまでをレポートに発表します。

目次

(1)課題の内容

課題3:懐中電灯に向かってブロックを投げるロボット † インストの「top secret」を参考にして、ブロック(一番太いホイール)を投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)

①全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。

②懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。

③懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。

(2)ロボットの説明

〜澗凌

図1.jpg

この写真を撮ったときには、投てき部のモーターを誤ってセンサの所につないでいました。そのため、投てき部が全く動かずあせりました。正しくは投てき部のモーターはCにつながります。これしか写真が残っておらずすみません。

▲妊ファレンシャル・ギア

今回はモーターを2個までしか使えず、そのうち1個はブロックを投げるのに使うので1個のモーターで左右に曲がらなければいけない。そこでディファレンシャル・ギアを使う。

ディファレンシャル・ギアの原理

(a)下の図のように、モーターが回転すると両側に垂直に取り付けられたギアが回転するようになっている。(図2参照)

(b)ラチェットによって、ギアは一方向(この場合、左右とも同じ方向)にしか回転できない。(図2参照)

図2+.jpg

(c)タイヤに直結しているギアとモーターとの間のギア数の偶奇が左右で違うため、左右でタイヤが回転する向きは逆である。(図3参照)

図3+.jpg

(d)よって、モーターが正回転するときには右のタイヤのみが回転し、逆回転するときには左のタイヤのみが回転する。

(e)なお、直進するときには左右のタイヤを交互に(細かく)回転させればよい。

E蠅討部

図4+.jpg

(a)図5のように、ブロックを棒の先端にひっかけて、棒を動かすことで投げる。

図5+.jpg

(b)タッチセンサがついており、それが反応するまで棒は逆回転する。こうして、元の位置まで戻る。(図6参照)

図6+++.jpg

ぅャスター

3輪車の方が摩擦が軽減され、回転しやすいのでキャスタを用いて三輪車にした。(図7参照)

図7+.jpg

(3)プログラム

①課題3-1

この課題では、ロボットよりもプログラムの方に工夫しがいがあるので、複数のプログラムを考えてみた。プログラムだけではわかりにくい部分は、図やフローチャートを加えてみた。

(a)光センサが1個の場合(センサ3は飾り)

#define throw_time 10
#define run_time 150 //ロボットが回転する時間。このプログラムでは1周以上すれば何周でも良い
int max ;  //光の最大値のための変数
task main()
{SetPower(OUT_B,0) //あまりはやく回転しすぎると、光の最大値の所でとまれない
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1を光センサに指定
SetSensor(SENSOR_2,SENSOR_TOUCH);  //センサ2をタッチセンサに指定
ClearTimer(0); //タイマー0をクリア
while(Timer(0)<run_time) 
{max=0; //とりあえず、光の強さの最大値を0に設定
OnFwd(OUT_B); //時計周りに回転
if(SENSOR_1>max){max=SENSOR_1;} //それまでで最大の強さの光よりも強い光を感知したら、その強さを最大値とする。
}
OnFwd(OUT_B); //再び、時計回り
until(SENSOR_1<=max+7 || SENSOR_1>=max-7) //最大値に近い光を感じたら、その方向を光源と判断
Float(OUT_B);
OnFwd(OUT_C);
Wait(throw_time); //ブロックを投げる
OnRev(OUT_C);
until(SENSOR_2==1); //元の位置に棒を戻し、次も投げられるようにする
Float(OUT_A+OUT_B);
} 

プログラム3-1.jpg

(b)光センサが1個の場合(授業中に原理が紹介されていたプログラム、センサ3は飾り)

#define throw_time 10 //投てき部が動く時間
#define run_time 180  //1周の時間
int max ; //光の強さの最大値のための変数
int a ; //光源までの時間のための変数
task main()
{SetPower(OUT_B,0)  //あまりはやく回転しすぎると、光の最大値の所でとまれない
SetSensor(SENSOR_1,SENSOR_LIGHT);センサ1を光センサに指定
SetSensor(SENSOR_2,SENSOR_TOUCH);センサ3をタッチセンサに指定
ClearTimer(0); //タイマー0をクリア
while(Timer(0)<=run_time)
{max=0; //光の強さの最大値をとりあえず0に
OnFwd(OUT_B); //時計回りに回転
if(SENSOR_2>max){max=SENSOR_2;ClearTimer(1);} //それまでで最大の強さの光よりも強い光を感知したら、その強さを最大値とする。また、タイマー1をクリア
}
a=Timer(1); //光源までどれくらい逆回りすればよいか(詳しくは下の図を参照)
ClearTimer(0);  //タイマー0をクリア
OnRev(OUT_B); 
until(Timer(0)>=a) //a秒間だけ反時計回りに回転
Float(OUT_B);  //回転停止
OnFwd(OUT_C);
Wait(throw_time); //ブロックを投げる
OnRev(OUT_C);
until(SENSOR_2==1); 
Float(OUT_C); //元の位置に棒を戻し、次も投げられるようにする
}

プログラム3-2.jpg

(c)光センサが2個の場合

2つのセンサが感じる光の強さの差が十分に小さく、かつ光の強さが十分に大きい方向に光源がある と判断する。なお、このプログラムは考えてみただけで、実行していない。ヒントにあるように、ついたてを用いないと難しいかもしれない。

#define throw_time 10 //投てき部が動く時間 
#define TH 7  //閾値。これより左右の光センサの値の差が小さいかどうかを判断
#define THREADHOLD 50 //

task main()
{SetPower(OUT_B,0);  ////あまりはやく回転しすぎると、光源の方向でとまれない
SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサ1を光センサに指定
SetSensor(SENSOR_2,SENSOR_TOUCH);  //センサ2をタッチセンサに指定
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3を光センサに指定
OnFwd(OUT_B); //時計回りに回転
until((SENSOR_1-SENSOR_3>TH && SENSOR_3>THREADHOLD) || (SENSOR_3-SENSOR_1>TH && SENSOR_1>THREADHOLD))  //2つのセンサが感じる光の強さの差が十分に小さく、かつ光の強さが十分に大きいと判断できるまで回転
Off(OUT_B);  //回転停止
OnFwd(OUT_C);
Wait(throw_time);OnRev(OUT_C); //ブロックを投げる
until(SENSOR_2==1);
Float(OUT_C); //元の位置に棒を戻し、次も投げられるようにする  
}  

②課題3-2

#define run_time 300 //トレースする最大の時間を指定(この場合は300秒) 
#define TH 50  //閾値を設定 
{task main()
SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサ1を光センサに指定
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3を光センサに指定
ClearTimer(0); //タイマー0をクリア
while(Timer(0)<=run_time)
{
if(SENSOR_1>TH)
{if(SENSOR_3>TH){OnFwd(OUT_B);OnRev(OUT_B);}  
//両方のセンサが閾値より大きい場合、光源はほぼ前方にあると判断して直進する。
else{OnFwd(OUT_B);}}  
//センサ1の値のみが閾値より大きいとき、光源はセンサ1側(この場合、右)にあるとして、右に曲がる。
else
{if(SENSOR_3>TH){OnRev(OUT_B);}  
//センサ3の値のみが閾値より大きいとき、光源はセンサ3側(この場合、左)にあるとして、左に曲がる。
else{OnFwd(OUT_B);until(SENSOR_1>TH || SENSOR_3>TH)}}  
//両方のセンサの値が閾値より小さいときには光を見失ったと判断する。時計回りに回転して、光源を探す。もし、見つからずにスタートから300秒たつと停止。}
}

(4)改善点

.蹈椒奪

回転するとき、RCXが重すぎてギアの噛み合わせが悪かったり、逆に回転速度がはやすぎたりした。使うギアを変えることや軽量化が必要かもしれない。

▲廛蹈哀薀

プログラム3-2で見失った光源を探すときに、プログラム3-1をサブルーチンとして組み込めるかもしれない。

(5)感想

結局、ロボットとプログラムが完成したところで時間切れとなってしまった。もう少し時間をかけてやるべきだったと思う。 フミ

もっと時間が欲しかった。そして光を探すプログラムが難しかった。ほとんどやらせてごめんよ(泣)。 ヨシ

(6)コメントをお願いします



添付ファイル: fileプログラム3-1+.jpg 116件 [詳細] fileプログラム3-1.jpg 205件 [詳細] fileプログラム3-2.jpg 232件 [詳細] file図7+.jpg 192件 [詳細] file図6+++.jpg 186件 [詳細] file図6++.jpg 103件 [詳細] file図6++.ppt 96件 [詳細] file図5+.jpg 197件 [詳細] file図6+.ppt 99件 [詳細] file図4+.jpg 195件 [詳細] file図3+.jpg 199件 [詳細] file図9.jpg 99件 [詳細] file図8.jpg 92件 [詳細] file図7.jpg 108件 [詳細] file図6.jpg 105件 [詳細] file図5.jpg 107件 [詳細] file図4.jpg 115件 [詳細] file図3.jpg 98件 [詳細] file図2+.jpg 193件 [詳細] file図1.jpg 190件 [詳細] file図2.jpg 96件 [詳細] fileデファ.jpg 99件 [詳細] file080208_2048~01.jpg 105件 [詳細] file080207_2041~01.jpg 107件 [詳細] file080206_2050~01.jpg 108件 [詳細] file080206_2049~03.jpg 123件 [詳細] file080206_2049~02.jpg 107件 [詳細] file080206_2049~01.jpg 110件 [詳細] file080206_2048~01.jpg 100件 [詳細] file080206_2041~01.jpg 108件 [詳細] file080206_1810~01.jpg 107件 [詳細] file080206_1748~02.jpg 105件 [詳細] file080206_1747~02.jpg 145件 [詳細] file080206_1747~01.jpg 114件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-09 (土) 09:19:48 (4207d)