- 追加された行はこの色です。
- 削除された行はこの色です。
[[2010a]]
*目次 [#nc1f890b]
#contents
*課題3 [#z27b7d02]
黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。 (重複しないように一人一つ以上のプログラムを作成すること。)
1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
懐中電灯の代わりに携帯のライトなどを利用してもよい。
*メンバー [#n7467606]
スズキ~
ミズイ
*ロボットについて [#e0e3b095]
#ref(./a4.jpg,150%,ロボット本体);
ロボットの全体像です。ホイールを投げる部分が重いため補強していったら不格好になってしまいました。
#ref(./a3.jpg,150%,投げる部分);
今回は遠心力を使って投げるようにしました。重くなってしまったため取り付けが難しかった。
#ref(./a.jpg,150%,投げる部分(ホイール有り));
ホイールを入れるとこんなかんじになります。見えにくいですが奥まで入っています。
#ref(./a1.jpg,150%,光センサー);
光センサーの部分は幅を広めにしてみました。高さが低い気がするがぎりぎり大丈夫だと思う。
*工夫したこと [#i4b1f586]
-ホイールを投げるときに遠心力を用いたこと。
-モータと直結させることで動かす力が強くなり遠くに飛ぶようにした。
-前タイヤを大きくし、後ろタイヤを小さくすることで腕が確実にタイヤに当たらないようにした。
*今後改善すべき点 [#nae37376]
-重心が後ろのほうにあるためバランスよくなるようにする。
-不格好なのでもう少し見栄えを良くする。
*プログラム [#kc056f3d]
**スズキのプログラム [#t2bfa531]
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_max1=SENSOR_1; //光の最大値と設定する
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; //投げる
}
**ミズイのプログラム [#s483d6b2]
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(); //投げる
}
-できるだけシンプルなプログラムになるようにした。
*感想 [#i3c96330]
**スズキ [#c115781b]
今回は製作時間が短かったためシンプルなロボットになってしまったので少し残念。
**ミズイ [#jeb9bc93]
時間がなくて大変だったけど、なんとか動くものができたのでよかった。
*コメント [#zb6dd288]
コメントをどうぞ
- 一人目のプログラムの下から2行目がよくわかりません。最大光量を記録する変数は一つしかありませんし、もう一度最大値を見つける操作を繰り返すということでしょうか?だとしても、その動作が書いてないですし、一回目に見つけた方向を除外する必要があります。二人目のプログラムはシンプルでよいですが、投げる前に懐中電灯が停止したことを確認するために何秒か待ったあと確認したほうがより正確かもしれません。また、投げるのは一回だけなので、while(true)とするよりも、while(SENSOR_1<=LMAX || SENSOR_3<=LMAX)としてfollow_lightの中身を書いた方が、プログラムもきちんと止まりますし、すっきりするかもしれません -- [[FI]] &new{2010-07-31 (土) 09:34:47};
- プログラムについての改善をお願いします -- [[TAKA]] &new{2010-08-08 (日) 12:37:14};
- 一人目のプログラムに関して、今までの最大値より明るい方向が見つかったならば、2番に大きい光量を今までの最大光量に変更する操作も必要です。 -- [[FI]] &new{2010-08-10 (火) 07:43:40};
- 書くべきことは書いているので、大丈夫です。一人目のプログラムに関しては、同じ懐中電灯に対して最大値と次点と認識しないような工夫があるとなおよいです。(例えば、懐中電灯の明るさが80と60のとき、80の懐中電灯と少しずれた方向を2番目に明るいとする可能性があります。)-- [[FI]] &new{2010-08-15 (日) 20:39:44};
#comment