[[2009b]]
#contents

*課題3  [#vc5171e0]
~
懐中電灯に向かってブロックを投げるロボットを作ろう!

*チーム [#jcf2f834]
チーム名「自由気ままにB級人生(仮) 」~
*ロボット [#k8d080ba]
before
&ref(./GetAttachmentb.jpg,サイズ,画像の説明);
&ref(./20100204140223.jpg,サイズ,画像の説明);
&ref(./GetAttachmenta.jpg,サイズ,画像の説明);
&ref(./c.jpg,サイズ,画像の説明);
*完成形態 [#q98cf28e]

&ref(./20100122164347.jpg,サイズ,画像の説明);

*連射をさせるために [#i19c29b4]
 連射をさせるという決まりだったので、弾を撃ったあとリロードさせる必要がありました。撃ったあと、弾が落ちてきて装填される、マガジン方式は他のチームがやっていたので、僕たちはリボルバー方式でつくることにしました。
弾を撃つと、弾を乗せた板が回転し、装填されます。
after
&ref(./d.jpg,サイズ,画像の説明);
&ref(./20100122164415.jpg,サイズ,連射装置、通称リボルバー);

*ひとつのモーターで走らせるために [#kac9e52c]
ディファレンシャルギアの角速度をωAとし両側の回転軸の角速度をωB、ωCとすると
ωA=(ωB+ωC)/2という関係があります。これを利用してモーターひとつだけで走ることのできるロボットを作りました。それぞれの回転軸をストッパーで留めてひとつの方向にしか回らないようにする。そうするとモーターを回した時、ディファレンシャルギアの回転は片方にしか伝わらず、その留め方をうまくすると、モーターを正回転させると左側だけが回転し、モーターを逆回転させると右側だけが回転する、などひとつのモーターで前進させることができます。その結果下図のようになりました。
真ん中の図より、それぞれの回転軸は矢印の方向にしか回りません。このおかげでモーターを正回転、逆回転させるだけで進むことができます。(ただし、片方ずつしかタイヤを回せないので前進するときはジグザグ走行になります。)

&ref(./無題31.jpg,サイズ,画像の説明);
&ref(./無題32.jpg,サイズ,画像の説明);
&ref(./無題30.jpg,サイズ,画像の説明);
*プログラム [#hb34a8d7]
*A改めシンゴのプログラム [#p76bd8b2]〜 [#b863026f]


 #define THRESHOLD 35
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 while( (SENSOR_1 < THRESHOLD)||(SENSOR_3 < THRESHOLD) )
 {
 OnFwd(OUT_B);	
 Off(OUT_A);
 }
 repeat(3)
 {             
 OnRev(OUT_A);
 Wait(30);
 OnFwd(OUT_A);
 Wait(30);
 }
 Off(OUT_A);
 OnFwd(OUT_B);Wait;(20);
 Off(OUT_B);
 OnFwd(OUT_C);Wait(20);
 Off(OUT_C);
 }

*B改めまさやのプログラム [#v239ebf9]
「7秒以上追尾できたら懐中電灯に向かってブロックを投げる。」を担当
 #define hit OnFwd(OUT_A);Wait(38);Off(OUT_A);      //ブロックを打つ動作
 #define revolver OnFwd(OUT_C);Wait(184);Off(OUT_C);//リボルバーを90度回す
 #define turn_r OnFwd(OUT_B); //右折
 #define turn_l OnRev(OUT_B); //左折
 #define shine 60             //光の明るさ
 #define run_time 700         //光を追う時間
 #define keep Off(OUT_B);     //停止
 
 task main()
 {
      SetSensor(SENSOR_1, SENSOR_LIGHT);   //光センサー1を決める
      SetSensor(SENSOR_3, SENSOR_LIGHT);   //光センサー3を決める
      while(true){
        if((SENSOR_1 < shine)&&(SENSOR_3 < shine)){        //両方の光センサーが暗いとき
           turn_l;                                         //左に回って光を探す
           until((SENSOR_1 > shine)||(SENSOR_3 > shine));  //どちらかの光センサーが光を見つけるまで
           keep;Wait(10);                                  //見つけたら停止
          }
        ClearTimer(0);                                     //タイマーをクリア
        while(((SENSOR_1 > shine)||(SENSOR_3 >shine))&&(FastTimer(0) < 700)){
           if((SENSOR_1 > shine)&&(SENSOR_3 < shine)){     //左側に光がある時
             turn_l;                                       //左に曲がって光を追う
             until((SENSOR_1 > shine)&&(SENSOR_3 > shine));//正面に光が来るまで
             keep;Wait(10);                                //正面に来たら停止
             }
           if((SENSOR_1 < shine)&&(SENSOR_3 > shine)){     //右側に光がある時
             turn_r;                                       //右に曲がって光を追う
             until((SENSOR_1 > shine)&&(SENSOR_3 > shine));//正面に光が来るまで
             keep;Wait(10);                                //正面に来たら停止
             }
           if((SENSOR_1 > shine)&&(SENSOR_3 > shine)){     //正面に光がある時
             keep;                                         //停止
             }
          }
        PlaySound(SOUND_UP);    //7秒光を追えたら音を鳴らす
        revolver;Wait(10);      //リボルバーを回転
        hit;Wait(10);           //ブロックを打つ
        keep;                   //停止
      }
 }
なぜか懐中電灯の光を無視してしまうことがあり、7秒間光を追わせることが難しかったです。

*C改めゆあのプログラム [#w08103cd]
 #define left(t) OnFwd(OUT_B); Wait(t);
 #define right(t) OnRev(OUT_B); Wait(t);
 #define offb Off(OUT_B); 
 #define revolver(t) OnFwd(OUT_C); Wait(t);
 #define hit(t) OnFwd(OUT_A); Wait(t);
 
 task main(){
    int hikari_1=60; //hikari_1に60を入れる
    int hikari_2=65; //hikari_2に65を入れる
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    while((SENSOR_1 <hikari_1)&&(SENSOR_3 <hikari_1)){
      /*光が両方のセンサーに入るまで回りつづける*/
 	left(30); 
     }
     offb;	     
 	    
    while((SENSOR_1 <hikari_2)&&(SENSOR_3 <hikari_2)){
 	right(60);
 	offb;
 	left(70);
 	}
 /*光が強くなるまで近づく*/
 
 	offb;//止まる
 	revolver(175); //リボルバーを回す
 	Off(OUT_C);    //止める
 	hit(37);       //弾を打つ
 	Off(OUT_A);	
 }
光センサーの精度が高くないので、近づきすぎてしまったりと、調整が難しかったです

*コメントのコーナー [#nd5b8867]
コメントをどうぞ。
- 一人目のプログラムに説明を入れてください。また、変数を使って最大値を探す課題でもあります。 -- [[FI]] &new{2010-02-18 (木) 15:49:56};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS