[[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 350 //一回転する時間 #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); //投げる動作 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーとする SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); //センサー1を好感度モードにする int l_max1=0; //1番光が強いところ int l_max2=0; //2番目に光が強いところ int t_max1=0; //l_max1までの時間 int t_max2=0; //l_max2までの時間 ClearTimer(0); turn_right;Wait(turn_time); //一回転する while(FastTimer(0)<turn_time){ //回転している間 if(SENSOR_1>l_max) //光の最大値を見つけたら { l_max2=l_max; //l_max2をl_maxと入れ替える t_max2=t_max; //t_max2をt_maxと入れ替える l_max1=SENSOR_1; //光の最大値と設定する t_max1=FastTimer(0); //タイマーを入れる } else if ((SENSOR_1>=l_max2) && (SENSOR_1<=t_max1)); //センサーがt_max2以上t_max1以下の光を感知したとき { l_max2=SENSOR_1; //2番目に光の大きい値とする t_max2=FastTimer(0); //タイマーを入れる } turn_right;(t_max1);Off(OUT_A+OUT_C); //光の最大値のところまで回転する throw;Off(OUT_B); //投げる turn_right(t_max2-t_max1); //もう2番目に光の大きいところまで回転する throw;Off(OUT_B); //投げる } **ミズイのプログラム [#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(true){ start follow_light; //光を追い始めて until(SENSOR_1>LMAX&&SENSOR_3>LMAX); //ライトに近づいたら stop follow_light; //光を追うのを止めて throw(); //投げる Wait(300); //すぐに連射しないために時間を置く } } task follow_light(){ //光を追うためのタスク while(true){ 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{ OnFwd(OUT_C);OnRev(OUT_A); //センサ1だけ明るい、両センサ暗いとき左回転 } } } -できるだけシンプルなプログラムになるようにした。 *感想 [#i3c96330] **スズキ [#c115781b] 今回は製作時間が短かったためシンプルなロボットになってしまったので少し残念。 **ミズイ [#jeb9bc93] 時間がなくて大変だったけど、なんとか動くものができたのでよかった。 *コメント [#zb6dd288] コメントをどうぞ - 一人目のプログラムの下から2行目がよくわかりません。最大光量を記録する変数は一つしかありませんし、もう一度最大値を見つける操作を繰り返すということでしょうか?だとしても、その動作が書いてないですし、一回目に見つけた方向を除外する必要があります。二人目のプログラムはシンプルでよいですが、投げる前に懐中電灯が停止したことを確認するために何秒か待ったあと確認したほうがより正確かもしれません。また、投げるのは一回だけなので、while(true)とするよりも、while(SENSOR_1<=LMAX || SENSOR_3<=LMAX)としてfollow_lightの中身を書いた方が、プログラムもきちんと止まりますし、すっきりするかもしれません -- [[FI]] &new{2010-07-31 (土) 09:34:47}; #comment