- 追加された行はこの色です。
- 削除された行はこの色です。
[[2008b/MemberOnly/進行状況A]]
#contents
*懐中電灯に向かってブロックを投げロボット [#d2e9994f]
**課題内容 [#t319930a]
~インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)
~1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
~2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
~懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。
**制作過程 [#ecf477b3]
***土台 [#ic549768]
#ref(CIMG0253.JPG);&br;
~しっぽが可愛い&color(red,clear){vV};&br;
#ref(CIMG0254.JPG);&br;
~[[参考ページ:http://yakushi.shinshu-u.ac.jp/robotics/?2005%2F%CE%FD%BD%AC%CC%E4%C2%EA%2F%A5%D2%A5%F3%A5%C8]]を見ながら作成しました。
#ref(CIMG0256.JPG);&br;
~タイヤは黄色×黒で決定!
#ref(CIMG0255.JPG);&br;
~安定のために黄色い足を付けてみました。
~&color(red,clear){問題点};:黄色い足が絨毯に引っかかる。。。&br;
↓&br;
#ref(CIMG0258.JPG);&br;
~足を取り外し、摩擦を減らすために黒くて丸いものを装着!
***光センサー [#ka1f6367]
#ref(CIMG0259.JPG);&br;
~光センサーは一つだけ使うことに決定!
***投げるとこ [#gf8d0eca]
#ref(CIMG0265.JPG);&br;
今回はこれ↑を投げることに決定!
#ref(CIMG0263.JPG);&br;
黄色い足を進化させて投げる手にしました!!
***工夫・苦労した点 [#t1bcc99a]
**完成体 [#paf87106]
#ref(CIMG0261.JPG);&br;
~ちょっとがたがた言うのが欠点、、、
**投げる様子 [#h81de570]
~投げる前
#ref(CIMG0260.JPG);&br;
&br;↓&br;
~投げた後
#ref(CIMG0264.JPG);&br;
**プログラム1 [#zaa72636]
#define THRESHOLD 42 //光の明るさを定義
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサーを定義
while(true)
{
if(SENSOR_1 < THRESHOLD) //定義した光よりも暗い場合
{
OnFwd(OUT_A); //時計周りに回転する
}
else
if(SENSOR_1 < THRESHOLD && SENSOR_1 < 45)
{
OnFwd(OUT_A); //光の方向に進む
Wait(10);
OnRev(OUT_A);
Wait(10);
}
else
{
if(SENSOR_1 > 45) //定義した光よりも明るい場合
{ //止まってブロックを投げる
OnFwd(OUT_C);
Wait(5);
Off(OUT_A+OUT_C);
}
}
}
}
~(制作者:A子)
***動く様子 [#p042414e]
#ref(CIMG0266.JPG);&br;
~光を探して・・・
&br;↓&br;
#ref(CIMG0267.JPG);&br;
~投げたァー!!
***工夫・苦労した点 [#aab69fd5]
~光の閾値を決めるのが大変でした。懐中電灯から50cmという規定が特に難しかったです。
**プログラム2 [#x6254f1e]
//2つのしきい値を決定
#define BORDER_1 40 //光を検知するしきい値
#define BORDER_2 50 //50cmまで近づいたことを検知するしきい値
// ループから抜け出すためのフラグ用変数
int flag = 0;
task main (){
SetSensor ( SENSOR_1, SENSOR_LIGHT ); //センサー1は光センサーですよ
while ( flag == 0 ){ //投げるまで(合図があるまで)ループする
if ( SENSOR_1 < BORDER_1 ){ //正面が暗かったら、
OnFwd(OUT_A); //モーターを正回転
}else{ //正面が明るければ、
OnRev(OUT_A); //モーターを逆回転
} //end if
if ( SENSOR_1 > BORDER_2 ){ //じゅうぶん近づいたら、
Off(OUT_A); //前進するのを止めて、
OnFwd(OUT_C); //投げつける。
Wait(15);
OnRev(OUT_C); //腕を元の位置にもどす。
Wait(10);
Off(OUT_C);
flag++; //ループ終了の合図。
} //end if
} //end while
} //end task main
~(制作者:スアマ)
***動く様子 [#m48e78f0]
#ref(CIMG0269.JPG);&br;
~光を探し中
&br;↓&br;
#ref(CIMG0270.JPG);&br;
投げたッ!!
***工夫・苦労した点 [#l556c868]
~タイヤを回すための特殊な機構をうまく動かすのはとても難しかった。
**コメントをどうぞ [#r34d19e2]
- ロボットの説明は大体書けています。~
後は、プログラムを完成させましょう。2の方はまだ貼られていませんし、~
1の方も前進せずに投げることになっています。~
また、if(SENSOR_1 > 45)の中にOff(OUT_A);はいらないと思います。 -- [[FI]]
- わかりました。Off(OUT_A);をなくし、前進するプログラムを書き足しました。書き直しました。 -- [[A子]] &new{2009-01-15 (木) 17:49:22};
-プログラム、特に2つ目にいくつか疑問があります。(1つ目の方も、全てがwhile(true)の中に入っているので常に動き続けたり、懐中電灯のある方向=光が一番強い方向ではなく、回転したとき初めて出会う光がそれなりに強い方向に投げることになっている等、いくつか問題があります。しかし、大枠は良いと思います。)~
ディファレンシャル・ギアを使う場合、直進するにはOnFwdとRevを小刻みに繰り返し(repeatが役に立つ)、片方に曲がる場合は片方向だけに回転する~
ifやwhileをもう一度理解しなおす~
2つ光センサをつけて、どちらのセンサが強い光を感じるかで、光が右、左どちらにあるか判断できる(2つめの課題はもちろん、両方の課題に使える。)~
等に気をつけてもう一度プログラムを作ってみてください
-- [[FI]] &new{2009-01-31 (土) 13:32:32};
#comment