課題 †黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。 1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。 3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。 ロボット †完成したロボット †
発射方法 †構想 †前提として、人の手を借りずに連射が可能でなくてはならないため、投擲する方式ではだめだと思った。初めは普通にモーターに直結された棒ではじくのを考えたが、次のホイールの補充やモーターの位置取りで悩んだ。そこで実際の拳銃のようにできないかと考えた。また足は前回の課題で使ったのをそのまま使いたかったので、発射はモーター一つでどうにかしようと思った。 完成形 †
その他工夫したところ †土台 †弾であるホイールがおちてしまわないように、また飛距離を出すためには多少土台を斜めにする必要があった。 光センサー †
問題点 †・少しバランスが悪い 使用した懐中電灯 †プログラム †ANDOのプログラム(課題2) †初めの失敗したプログラム †#define T 400//初めの旋回時間 int m;//光の最大値 int t;//光までの時間 int n;//m-20; sub find()//光の最大値を決めるサブルーチン { m=0; t=0; n=0; ClearTimer(0); while(FastTimer(0)<T)//一周して光の域値を決める { if(SENSOR_1>m)//光が最大値より大きければ { m=SENSOR_1;//光の値を代入 n=m-20; if(n<50){n=50;} t=FastTimer(0);//時間を計る } OnFwd(OUT_A);OnRev(OUT_C);//旋回 } Off(OUT_A+OUT_C); OnRev(OUT_A);OnFwd(OUT_C);Wait(T-t);Off(OUT_A+OUT_C);//光まで逆に旋回 ClearTimer(1); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); find(); while(FastTimer(1)<300)//光が止まって三秒たつまで追いかける { if((SENSOR_1>n)&&(SENSOR_3>n)){OnFwd(OUT_A+OUT_C);} else if((SENSOR_1>n)&&(SENSOR_3<n)){ClearTimer(1);OnFwd(OUT_C);Float(OUT_A);} else if((SENSOR_1<n)&&(SENSOR_3>n)){ClearTimer(1);OnFwd(OUT_A);Float(OUT_C);} else{find();}//光が見つからない時は探す } if(SENSOR_1>m){while(SENSOR_1>m){OnRev(OUT_A+OUT_C);}}//センサーの値が一周して決めた最大値より大きければ後退 else{while(SENSOR_1<=m){OnFwd(OUT_A+OUT_C);}}//それ以外は最大値まで前進 Off(OUT_A+OUT_C); OnRev(OUT_B);Wait(30);Float(OUT_B);OnFwd(OUT_B);Wait(200);Off(OUT_B);//ホイールを射出する } 問題点 †先生の助言を参考にどんな懐中電灯にも対応しようと思って、一周して光の域値を決定しようと考えた。 最終的なプログラム †#define n 50//光の域値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(1); while(FastTimer(1)<200)//2秒前方に光を浴びる→懐中電灯が止まったと判定 { if((SENSOR_1>n)&&(SENSOR_3>n)){OnFwd(OUT_A+OUT_C);} else if((SENSOR_1>n)&&(SENSOR_3<n)){ClearTimer(1);OnFwd(OUT_C);Float(OUT_A);} else if((SENSOR_1<n)&&(SENSOR_3>n)){ClearTimer(1);OnFwd(OUT_A);Float(OUT_C);} else{while((SENSOR_1<n)||(SENSOR_3<n)){ClearTimer(1);OnRev(OUT_A);OnFwd(OUT_C);}}//光が見つからない時は探す } if(SENSOR_1>(n)){while(SENSOR_1>(n)){OnRev(OUT_A+OUT_C);}} else{while(SENSOR_1<=(n)){OnFwd(OUT_A+OUT_C);}} Off(OUT_A+OUT_C); SetPower(OUT_B,7);OnFwd(OUT_B);Wait(500);Off(OUT_B);//ホイールを射出する } 工夫したところ †最初から光の域値をviewモードをみて部屋の明かりではぎりぎり届かない値に変えてしまった。こうすることで感度の悪いセンサーでも一応追うことができた。 割とシンプルになってよかった。 反省点 †30cm以上は近づけないと追ってくれない。はっきりいって致命的だけど、脳がストーミングしすぎた。いか漁に使うような強力なライトをつかえばいけるかもしれない。 UMEのプログラム (課題1) †#define THRESHOLD 60 //閾値 int light_max; //光センサー最大 int time_max; //光センサーの最大値の時間 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3光センサー SetPower(OUT_B,7); //セットパワーを最大の7にする ClearTimer(0); //タイマーセット OnFwd(OUT_A); OnRev(OUT_C); //右回転 while(FastTimer(0)<turn_time) //回転時間 {if(SENSOR_1>light_max); //一番明るい時間 {light_max=SENSOR_1; time_max=FastTimer(0); //現在の時間を光センサの最大値を与える時間に代入 } } Off(OUT_A+OUT_C); Wait(20); OnFwd(OUT_A); OnRev(OUT_C); //右回転 Wait(time_max); //明るい場所まで回転 Off(OUT_A+OUT_C); OnFwd(OUT_B); //ホイールを発射 Wait(20); Off(OUT_B); } 問題点、工夫した所 †・ANDO とても簡単なプログラムになった。簡単なプログラムだけど、簡単に完成に至った訳ではなかった。時にはせっかく組んだものも思い切って初めから見直すことも必要だと感じた。ロボットは時間がないせいかごちゃごちゃと思いつくがままに組み合わせたようなものなので、キメラみたいな、なんだかまとまりがなくなった。でも連射がかっこいい。 ・UME 今回はホイールの発射に苦労しました。 うまく飛ばず、セットパワーを強くしたところ飛距離を伸ばすことができました。 シンプルなプログラムになってよかった。 コメント †コメントをどうぞ!
|