A2Lメンバー 

ぐっさん&タイスケ

今回の課題分担

課題1、3 → ぐっさん

課題2   → タイスケ

ホイールを投げ出すロボット

試作ロボ1

試作ロボ1

○キャタピラを使ったロボット。全体的にゴツゴツしているが、 キャタピラを使うことで全体のバランスをとりやすくしている。投擲の際の安定性もキャタピラで組んだ理由である。

キャタピラロボ

タイヤを軽量でかつ強度を保つため一本でつなげたかったので、連結できるパーツを使い長さをだした。

しかし、重量が重すぎて一つのモーターでは馬力が足りずにこのロボを断念して軽量化することにした。

完成ロボ

○今度はタイヤを使ったロボット。なるべく土台が安定するようにした。

 ロボット全体像(正面)

完成ロボ

全体的にコンパクトにまとめられている。

工夫した点

ロボの進み方

光センサーをわずかに内側へ向けることにより、より広範囲の光源を補足可能となっている。

光センサー全体図

1→センサー1が光を感知すればロボが右回りに進行する。

2→センサー3が光を感知すればロボは左回りに進行する。

具体図1

ギア周辺

ブレーキ

 ↑今回モーター1つで動くための大事な部分のひとつであるブレーキ。

 タイヤの動きを止める事となる。

ギア固定図

ホイールを投げ出す装置1

投石装置1

ホイールを投げ出す装置2

投石装置2

光センサー接続部

○光センサーをロボと平行にするのではなく、自由に方向を選べるようにした。

光センサー

課題のプログラム

課題1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。(改良前)

#define THRESHOLD 40

sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_A);
 Wait(100);
 Off(OUT_A);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
    repeat(10000){                                               
    while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //光センサー1,3共に光を感知せず
    {
     OnFwd(OUT_B);//右回りに進む
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず 
    {
     OnFwd(OUT_B);//右回りに進む
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず
    {
     OnRev(OUT_B);//左回りに進む
     Wait(30);
     Off(OUT_B);       
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知する
    {
     throw();//ホイールを投げる
     Off(OUT_B);
    }
    }
}

課題1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。(改良版)

#define THRESHOLD 45

sub throw()
{
 OnFwd(OUT_A);
 Wait(100);
 Off(OUT_A);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット     
    int  i;                //iの定義付け
    int i_min=1, i_max=10;
    
    int x;                  //xの定義付け
    int x_min=1,x_max=10000;
    
    for(x=x_min;x<=x_max; x++){
    while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3共に光を感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず
    {
     OnRev(OUT_B);
     Wait(30);
     Off(OUT_B);       
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知する
    {
     throw();
     Off(OUT_B);
     x=10000;  //ホイールを投げる動作が終わったので、xに10000を加える
    }
    }
    Off(OUT_B);    //ロボの動きを止める
    OnRev(OUT_A);//ホイールを投げ出す装置を元に戻す
    Wait(50);
    Off(OUT_A);
}

課題2  懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。

#define THRESHOLD 45
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
 while (true)
     {   if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサー1、3共に光を感知していない場合。
          {
            OnFwd(OUT_B); //右回りに進む。
            Wait(30);
          } 
         if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサ−1のみ光を感知した場合。
          {
            OnFwd(OUT_B); //右回りに進む。                        
            Wait(30);
          }
         if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー3のみ光を感知した場合。
          {
            OnRev(OUT_B); //左回りに進む。                       
            Wait(6);
          }
         if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー1、3共に光を感知した場合。
          {
            OnFwd(OUT_B); //左右の車輪を交互に回転させ前進する。
            Wait(30);
            OnRev(OUT_B);
            Wait(6);              
          }
     }  
]

課題3  懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。(改良前)

基本的には課題1と同じようなプログラムとなっている。

#define THRESHOLD 40

sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_A);
 Wait(100);
 Off(OUT_A);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを2にセット
    
    int  i;
    int i_min=1, i_max=10;           //文字iの定義
    
    int x;
    int x_min=1,x_max=10000;    //文字xの定義
    
   for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す
    {
    while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3ともに光を感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず     
    {
     OnRev(OUT_B);
            Wait(30);
     Off(OUT_B);       
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知した場合     
    {
    for (i=i_min; i<=i_max;  i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る
    {
    OnFwd(OUT_B);
    Wait(10);
    OnRev(OUT_B);
    Wait(10);
    }
     throw();
     Off(OUT_B);
 
    }
    }
 
}

課題3  懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。(改良版)

#define THRESHOLD 45

sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_A);
 Wait(100);
 Off(OUT_A);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを2にセット
    
    int  i;
    int i_min=1, i_max=10;           //文字iの定義
    
    int x;
    int x_min=1,x_max=10000;    //文字xの定義
    
   for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す
    {
    while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3ともに光を感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず
    {
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
    }
     while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず     
    {
     OnRev(OUT_B);
     Wait(30);
     Off(OUT_B);       
    }
     while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知した場合     
    {
    for (i=i_min; i<=i_max;  i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る
    {
    OnFwd(OUT_B);
    Wait(10);
    OnRev(OUT_B);
    Wait(10);
    }
     throw();
     Off(OUT_B);
     x=10000;  //ホイールを投げる動作が終わったので、xに10000を加える    
    }
   
  }
    Off(OUT_B);    //ロボの動きを止める
    OnRev(OUT_A);//ホイールを投げ出す装置を元に戻す
    Wait(100);
    Off(OUT_A);
}

今回の苦労した点・工夫した点(ロボット編)

●今回も最初に作ったロボはボツになってしまったが、ロボの欠点を認識したら今までの教訓から学んで、さっさと次のロボットを作成した。

●どちらのロボットも共通して大事にしたのは、ホイールを投げるパーツをロボの上に乗せる予定だったので、土台を安定するようにした。

今回の苦労した点・工夫した点(プログラム編)

課題1

●まず頭の中で考えていたのは、ぐるぐる回って光センサー1,3が共に感知すればホイールを投げるようにする事である。

しかしどれくらい探す動作を繰り返せばいいか場合によって変わってくるので、repeatを使い、

おそらく10000回繰り返せば事足りると思い、repeat(10000)を使った。

そのためホイールを投げ終えた後でも果てしなく動作を繰り返すので、課題はクリアーしているとは思うが、プログラム的には不完全である。

→[改良]課題3のプログラムが完成したので、課題3のプログラムを多少いじることにより、

repeat(10000)を使わないで、forを使いプログラムが完成した。

課題2

●左右の車輪がギアの関係上、時間毎の回転数が異なるために、直進させるプログラムにおいてそれぞれの車輪の回転させる時間の比率を変えることによって、結果直進するように組んだ。

無駄は無いが、面白みのないプログラムとなってしまった。

課題3

●課題1とほとんどプログラムは同じなのだが、光センサー1,3が共に光を感知している時のプログラムを変えた。

for (i=i_min; i<=i_max;  i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る

を使うことにより、光を探し当てた後も、少しずつ光に近づいてホイールを投げるようにした。

●今回はrepeatを用いるのではなく、forを使うことで、10000回繰り返すまで終わらないプログラムを解消しようとした。

予定ではホイールを投げた後に

for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す

のxに10000を加えれば、xが10000を越えてこのfor以下のプログラムを停止するようにできるかな?と思ったのだが、

エラーが出てきてしまったので、やむを得ず課題3のプログラムも10000回繰り返すまで終わらない不完全なプログラムとなってしまった。

→[改良]

x=10000;

をホイールを投げた動作の後で組み込む事で、プログラムが終わるようにした。

";"を入れ忘れていた事に気づいてエラーが発生した理由がわかった。

全体を通しての感想&これからの課題

●今回の課題は一週間しか期限がなかったので、急いでロボを組み立てプログラム作りに着手することができたので、なんとか間に合った。

しかし、プログラムに不完全性が生じているのでそれだけが心残りである。

→[改良]ついにエラーが出ていた謎が解明した。

x=10000;

の”;”が抜けていただけという、しょうもない見落としだった。

でもこれでプログラムが完成して満足だ。

●音楽に手を出す余裕がなかったのが、まだまだ余裕のないところを示しているように思える。

●これからの課題としてはどうにかホイールをなげればプログラムを停止するように、変数の使い方をちゃんと理解して自分の成長につなげたい。

コメントをどうぞ



添付ファイル: file7.jpg 351件 [詳細] file6.jpg 383件 [詳細] file5.jpg 355件 [詳細] file4.jpg 343件 [詳細] file3.jpg 387件 [詳細] file2.jpg 421件 [詳細] file1.jpg 338件 [詳細] file070703_011119_M.jpg 365件 [詳細] file070628_194901_M.jpg 373件 [詳細] file070628_192446_M.jpg 355件 [詳細] file070628_192358_M.jpg 176件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-05 (木) 18:52:33