- 追加された行はこの色です。
- 削除された行はこの色です。
[[2010a]]
#contents
*課題3の内容 [#i09a0b1c]
黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1,3は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。
-1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
-2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
-3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。
懐中電灯の代わりに携帯のライトなどを利用してもよい。
*メンバー [#i587806c]
田島 美斎津
*ロボット [#h847e09e]
**構造 [#u8220587]
-全面
#ref(F1000489.JPG)
-発射装置
#ref(F1000490.JPG)
-発射装置の内部
#ref(F1000492.JPG)
**問題点 [#s9297519]
-二発目を打つとき、弾がつまる時があること
-目標を狙う精密さがあまりないこと
-ロボットの画面を見ることが出来ない
**工夫した点 [#a160fc8f]
-弾が旋回していると飛ばないように、斜めのパーツを使った
-なるべくコンパクトにして、バランスをよくした
*プログラム [#o99b1f64]
**田島のプログラム(選択1) [#q0dc9a91]
#define shot OnRev(OUT_B);
Wait(10);
OnFwd(OUT_B);
Wait(30);
Off(OUT_B);
int move_time1
int move_time2
int light1
int light2
task main(){
ClearTimer(0);
light1 = 0;
ClearTimer(0); //タイマーをゼロにする
light1 = 0;
light2 = 0;
move_time1 = 0;
move_time2 = 0;
SetSensor(SENSOR_3,SENSOR_LIGHT);
OnFwd(OUT_A);
OnFwd(OUT_A); //回転する
OnRev(OUT_C);
while(FastTimer(0) < 450) {
if((SENSOR_3 > light2)&&(light2 < light1)){
light2 = SENSOR_3;
move_time2 = FastTimer(0); }
else if(SENSOR_3 > light1) {
light1 = SENSOR_3;
move_time1 = FastTimer1; }
while(FastTimer(0) < 450) { //4、5秒間はwhileの中をする
if((SENSOR_3 > light2)&&(light2 < light1)){ //もしSENSOR_3がlight2より大きくかつlight2がlight1よりも大きいとき
light2 = SENSOR_3; //light2にSENSOR_3を代入する
move_time2 = FastTimer(0); } //move_2にFastTimer(0)を代入する
else if(SENSOR_3 > light1) { //SENSOR_3がlight1より大きいとき
light1 = SENSOR_3; //light1にSENSOR_3を代入する
move_time1 = FastTimer1; } //move_tine1にFastTimer(0)を代入する
}
Off(OUT_A+OUT_C);
Wait(50);
OnFwd(OUT_C);
Off(OUT_A+OUT_C); //回転を止める
Wait(50); //0、5秒待つ
OnFwd(OUT_C); //回転する
OnRev(OUT_A);
Wait(450 - move_time2);
Wait(450 - move_time2); //光源まで回転する
Off(OUT_A+OUT_C);
shot
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(move_time2);
Off(OUT_A+OUT_C);
Wait(50);
OnFwd(OUT_A);
shot //弾を打つ
OnFwd(OUT_A); //回転する
OnRev(OUT_C);
Wait(move_time1);
Wait(move_time1); //光源まで回る
Off(OUT_A+OUT_C);
shot
shot //弾を打つ
}
**工夫した点 [#pda0125b]
-工夫したというより工夫しようとしたの方が正しいかもしれないが、一回の回転の間に二つの光源を発見できるようにしようとした。
-打つまでの回転と光源を発見するための回転を逆にした
**問題点 [#e6f73893]
-まだ未完成でうまく作動しない
-一つの光源を二つの光源と勘違いして、誤作動するときがある
**美斎津のプログラム(選択2) [#k9186c38]
#define light 65 //懐中電灯の光の値
#define go_straight OnFwd(OUT_C+OUT_A);Wait(100);//まっすぐ進む
#define TURN OnFwd(OUT_C);OnRev(OUT_A);//旋回する
#define TURN_RIGHT OnFwd(OUT_C);OnRev(OUT_A);//右に旋回する
#define TURN_LEFT OnFwd(OUT_A);OnRev(OUT_C);//左に旋回する
#define TURN_TIME 100//90度旋回する時間
#define shoot 80//弾を打つときの光の値
#define shot OnRev(OUT_B);Wait(10);OnFwd(OUT_B);Wait(30);Off(OUT_B);//玉を打つ
task main()
{
SetSensor(SENSOR_3, SENSOR_LIGHT);//センサー3を光センサーとする
int count=0;//弾を打った回数
ClearTimer(0);// Timer(0) をリセット
while(count<2)//弾を二回打つまで繰り返す
{
if(SENSOR_3 > shoot)//光センサーが懐中電灯に近づいたとき
{
Off(OUT_C+OUT_A);//1秒止まる
Wait(100);
shot;//弾を打つ
count++;//弾を打った回数を増やす
ClearTimer(0);// Timer(0) をリセット
}
else if(SENSOR_3 > light)//光センサーが懐中電灯に反応したとき
{
ClearTimer(0);// Timer(0) をリセット
go_straight;//まっすぐ進む
}
else//光センサーに反応がないとき
else if((SENSOR_3 < light)&&(Timer(0) > TURN_TIME))//光センサーに反応がないまま1秒たったとき
{
TURN_LEFT;//左に旋回する
}
else if(SENSOR_3 < light)//光センサーに反応がないとき
{
TURN;//旋回する
ClearTimer(0);// Timer(0) をリセット
TURN_RIGHT;//右に旋回する
}
}
Off(OUT_C+OUT_A);//弾を二回打ったときロボットを停止させる
}
**工夫した点 [#yae03914]
-プログラムをマクロを使い、簡単にした。
-二発目を打ったときに止まるようにした。
-右に90度曲がった度ときに1秒反応がなければ、左に曲がるようにした。
**問題点 [#r9a94041]
-懐中電灯が左に行ったときも、右に回るため光を追うのに時間がかかった。
*感想 [#s24a843d]
**田島 [#v470eea9]
今回はテスト前ということもあり、あまり時間が無く、完成させることが出来なかった。なので、プログラムが未完成でうまく作動しない。自分としても、どのようにすればうまく動かすことが出来るのかわからず、とても困った。ロボットの方は、美斎津君にまかせっきりで、手を出していない。最後のロボコンは、精一杯がんばりたいと思う。
**美斎津 [#p176d48c]
-プログラムを作るのは、前回に比べ楽だったが、弾を二連射させるロボットを作るのに時間がかかった。
-光センサーを二個使ってみるとよりロボットが素早く行動してくれるだろうと思いました。
*コメント [#l437fc5d]
- 一人目のプログラムは説明をつけてください。二人目は、懐中電灯が左右に動くことも考慮してみてください。過去のページが参考になります。 -- [[FI]] &new{2010-07-31 (土) 07:48:47};
#comment