2010a

目次

1、[課題3]の内容

黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1,3は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。 (重複しないように一人一つ以上のプログラムを作成すること。2人のチームは1と2、3人のチームは1〜3)

  1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
  2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
  3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。

懐中電灯の代わりに携帯のライトなどを利用してもよい。

ホイール

使用するホイールの写真。

2、メンバー紹介

  カワシマ、マコト、カズの3人でやっています。

3、ロボット紹介

 三人で一台のロボットを製作しました。

重要なお知らせ(添付した写真の訂正)

 以下に紹介されているロボットの写真において訂正点があったので記述しておきます。後輪部におけるつっかえ棒の付いたギアのつっかえ棒の位置が改善前(赤い部分)のものであり、実際はギアをまたいで反対側(緑の部分)でした(下図参照)。もし写真のままだと前進した際に右折し、左折する際に後進してします・・・。ご迷惑おかけしました。

全貌

分解する前に写真を撮り忘れました(>O<)。

ロボット

 写真が示している部分がロボットのどの部分かわからない場合は写真をマウスで触れてみて下さい。
   《全貌》

全貌

モーターを3つと、光・センサを用いて作成しました。(龍をモチーフにしました。)

   《正面》

正面

ピンクの四角で囲った部分に光・センサが搭載されています。

   《真上》

真上

黄色の四角で囲った部分は、発射台です。

   《発射部(真上)》

発射部右真上から

赤○の部分にある部品(ストッパー)が写真手前から奥に移動することで、黄色い部品がオレンジの矢印の方向に発射される仕組みとなっている。

   《発射部(正面)》

発射部右正面から

大きい赤色の矢印の方向に灰色の部品がモータによって動くことで、小さい赤い矢印の方向に黒い棒上の部品が連動して動き黄色い部品が発射される。

  ≪かなりのスピードで発射します。しかも発射方向はかなり正確です。≫

装填時

写真のように発射装置を左右に装着することによって2連射を可能にしました。

ロボット制作においての工夫

裏側を拡大

 ・先輩方のページを参考にして、ディファレンシャルギア(黄色の矢印部)を活用することで、ロボットが移動するのに必要なモーターの数を1つに抑えることができました。

 ・持ち運びが分解しなくても比較的簡単になるようにロボットの強度を上げました。

ロボット制作においての問題点

 ・モーターを3つ使用したために、ロボットの機体が重くなりディファレンシャルギアでは、移動できない状態に陥った点。
 ・上記のことと重なるかもしれませんが、ロボットの機体における前後のバランスが前に偏ってしまった点。

その問題点の改善策

裏側

 ・ピンクの輪で示した部分にあるように、しっぽをモチーフにした重りを取り付けたり、前方に取り付けた光・センサを1つにすることで前後のバランスを改善しました。
 ・赤い輪で示したように前方のタイヤのゴムをあえて取り付けないことで、摩擦による抵抗を軽減しました。

4、それぞれのプログラム

 ここからは、メンバーそれぞれが[課題3]の中から課題を一つ選んで作成したプログラムを、個人的な反省と感想を交えて、機銑靴望匆陲靴討いたいと思います。

機▲ワシマのプログラム

 私は、「2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。」という課題を選択しました。

プログラムの構想

まず一周目に光の最大値を記録します。 

二周目に懐中電灯の光が最大の場所を光を光・センサで感知することによって発見し滑らかに停止して・・・

さらに光を追跡し、30僂竜離まで近づきブロックを発射する予定です。

 以下は 銑を二回実践するためのプログラムです。(ただし、自分の時間配分ミスでちゃんと動くか十分に確認できていません。)

プログラム

#define GO OnFwd(OUT_A);                    // 前進する
#define CIR OnRev(OUT_A);                         // 左折する
#define DOWNF OnFwd(OUT_B);Wait(35);Off(OUT_B);   // 左側に装填されたブロックを発射する
#define DOWNS OnRev(OUT_C);Wait(35);Off(OUT_C);   // 右側に装填されたブロックを発射する
#define pika SENSOR_2                             // センサー2を『pika』と名付ける
#define time 180                                  //  ロボットが一周円を描く(右回り)時間を定義
#define FSTOP  Float(OUT_A);            //  滑らかに停止する 

  上で定義した値を用いてプログラムを書きました。

task main(){   
              int l_o = 0;                       //  光の最大値を記録する変数

              SetSensor(pika,SENSOR_LIGHT);       //  センサ『pika』を光・センサに

              ClearTimer(0);                      //  Timer(0)をリセットする
              while(FastTimer(0) <= time){
              CIR;                 //  ロボットが一周円を描くまで左回り
              if(pika > l_o){            //  『pika』の値が光の最大値より明るい場合
              l_o = pika;             //  その時の値を光の最大値に更新する
                              }
                                         }
              CIR;
              until (pika == l_o);         //  再度左回りに回転する(先ほど記録した値l_oを光・センサが感知するまで)
              FSTOP;                //  滑らかに停止する
              if(pika < 93 ){           //  もし懐中電灯からの距離が30cm以上はなれているなら
              GO;                                 //  追跡するために前進する
                            } else {        //  もし懐中電灯からの距離が30僂任△襪覆
              FSTOP;                //  滑らかに停止する
              DOWNS;                //  右側に装填されたブロックを発射する
                                   }
              FSTOP;                              // 滑らかに停止する

              while(FastTimer(0) <= time){
              CIR;                 //  ロボットが一周円を描くまで左回り
              if(pika > l_o){           //  『pika』の値が光の最大値より明るい場合
              l_o = pika;             //  その時の値を光の最大値に更新する
                              }
                                         }
              CIR;
              until (pika == l_o);         //  再度左回りに回転する(先ほど記録した値l_oを光・センサが感知するまで)
              FSTOP;                //  滑らかに停止する
              if(pika < 93 ){           //  もし懐中電灯からの距離が30cm以上はなれているなら
              GO;                                 //  追跡するために前進する
                            } else {        //  もし懐中電灯からの距離が30僂任△襪覆
              FSTOP;                //  滑らかに停止する
              DOWNF;                //  左側に装填されたブロックを発射する
                             }
              FSTOP;                              //  滑らかに停止する
         }

プログラムの工夫

 ・「int」を用いました。
 ・2回まで追いかけて(というより探知して)装填されたブロックを発射することができます。
 ・定義を用いることで、簡略化を図りました。
 ・#define FSTOP Float(OUT_A);と定義しこれを用いることで、停止する際の揺れを低減できます。そのことによってブロックの不発を防いでいます。
 ・「光の最大値を更新したときには、同時にその時刻を記憶しておく」という方法もあったのですが、時間指定にするとどうしても少しずれると思ったので(前の課題から)、あえて光の明るさのみに頼ったプログラムにしました。

プログラムの問題点、改善策

 ・プログラムが最大限にその内容を遂行できる条件がかなり限られる。(懐中電灯の動き方次第・・・。)
 ・until (pika == l_o);を用いたために、光の最大値を発見できなかった場合回り続けます。
 ・懐中電灯についていくときと、いかずに発射することがある。
 ・ついて行くというよりは、探すといったほうが適切なような動きをする。
 ・上記の改善策として、比較的明るさの強い懐中電灯を使用した方が良いと思います。
 ・追跡する際に、直進することしかできないために、その方向に懐中電灯がなかった場合には直進し続けます。

反省、感想

 ・先輩達のプログラムを参考にさせてもらいました。
 ・プログラム上、課題3の2の「懐中電灯に向かって進み」という部分を何とか克服できました。
 ・「int」を用いることで明るさの最大値を測ることができるのには驚きました。
 ・一応、2連射することができて良かったです。
 ・光・センサを一つしか搭載していないので、かなり苦戦しました。光・センサを二つ搭載すればよかったと思います。
 ・ディファレンシャルギアをロボットに使用したために、左右への動きが制限されてしまったために追跡する際にに問題を生じてしまった。もしモータが4つあれば課題3の完成度をさらに上げることができたと思う。

結果

 ・ロボットがちゃんと 銑の一連の動作をすることができるか十分に確認できていませんが、ブロックを二連射することはできました。

供▲泪灰箸離廛蹈哀薀

 私は、「1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。」を選びました。

#define TURN_TIME 400        //一周する時間

task main(){
SetSensor(SENSOR_2, SENSOR_LIGHT); //センサー2を光センサ
int light_max=0;//光の最大値
int t_max=0;//光の最大値の時間
ClearTimer(0);
OnRev(OUT_A);Wait(TURN_TIME);       //一周する

while(FastTimer(0)<TURN_TIME){      //回っている間
if(SENSOR_1>light_max)              //最大値の光を見つけたら
{
light_max=SENSOR_1;                 //最大値の光と設定
t_max=FastTimer(0);                 //タイマーを入れる
}
}

OnRev(OUT_A);                       //光の最大値のところまで回る
Wait(t_max);                        //
Off(OUT_A);                         //
OnFwd(OUT_B);                       //左のブロックを射出
Wait(10);                           //
Off(OUT_B);                         //
Wait(50);                           //
OnRev(OUT_C);                       //右のブロックを射出
Wait(10);                           //
Off(OUT_C);                         //終了
}

プログラムの工夫

 タイマーを設定して割と正確な位置に行けるようにした。

プログラムの問題点、改善策

 最大値とかの設定がどうすればうまくいくのかわからなかった。

反省、感想

 時間がなくて大変だった。

掘▲ズのプログラム

 私は、「3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。」を選びました。

#define turn_time 400                    //ロボットが1周する時間
#define THRESHOLD 85
task main()
{
  int light_max=0;                       //最大値
  int t_max=0;                           //最大値を実現する時刻
  SetSensor(SENSOR_2,SENSOR_LIGHT);      //センサー1は光センサー
  ClearTimer(0);                         //時間を0とする
  OnRev(OUT_A);                          //一周する
  while(Timer(0)<turn_time){
  if(SENSOR_2>light_max){                //回っている間
  light_max=SENSOR_2;                    //最大値をセンサー2とする
  t_max=Timer(0);                        //タイマーを入れる
}
}
  Off(OUT_A);                            //一旦止めて
  Wait(100);
  OnFwd(OUT_A);                          //最大値のところまで回る
  Wait(t_max)
  Off(OUT_A);                            //止まる
  Wait(50);
  while (SENSOR_1 <= THRESHOLD){OnFwd(OUT_A);} //40cmの所まで進む             
  Off(OUT_A);                            //止まる
  OnFwd(OUT_B);                          //左のブロックを投げる
  Wait(20);
  Off(OUT_B);
  OnRev(OUT_C);                          //右のブロックを投げる
  Wait(20);
  Off(OUT_C);                            //完了
}

プログラムの工夫

 先輩のを参考にしました。正確になるようになるべく動く時間を考えました。

プログラムの問題点、改善策

 光に向かって進まなくてはならないところのプログラムと懐中電灯に当てるプログラムがあまりうまくいきませんでした。

反省、感想

 時間がなく、あまり正確にできなくて残念でした。

5、全体の反省

 ・ロボットの作成に関しては、みんなでできる限り集まって作成したので比較的容易に作成することができました。
 ・プログラムに関しては、なかなか時間を確保することができなかったので、少し反省しています。
 ・ロボットの発射部に関しては、かなりクオリティーの高いものになりました。

6、コメント欄

 私たちのページを見て、感じたことを自由に投稿して下さい。

  • プログラムにいくつか問題があるので改善してください。一人目に関しては、まず途中から説明がないでし、懐中電灯が動いてるまたは止まっているを光センサやタイマーを用いてどう定義するかがポイントだと思います。二人目に関しては、最大値を見つけることに成功していますが、今回の課題では2番目に大きい値も見つける必要があります。例えば、光量に関して2つの変数を用いて、観測した光量の大きさは3つの場合に分けられるので、それぞれの場合に対処するという方法があります。3人目に関しては懐中電灯まで40cmというのがどうロボットに判断させるのかがないかと思います。 -- FI? 2010-07-30 (金) 17:24:07
  • ロボットの紹介はできています。プログラムの修正をお願いします -- TAKA? 2010-07-30 (金) 17:36:35
  • 光の最大値を更新したときには、同時にその時刻を記憶しておくと後からその明るさの方向を探す必要はありません。>カワシマさん -- 松本 2010-08-10 (火) 06:10:18
  • 二人目と三人目のプログラムはどの課題を選択したのでしょうか?課題の条件を全て達成できていない気がします。特に2人目は、2つの懐中電灯ではなく、一つの懐中電灯の方向に2つのブロックを投げています -- FI? 2010-08-10 (火) 07:56:37
  • 前半部分はよいので、ぜひ直してください -- FI? 2010-08-30 (月) 16:17:08


添付ファイル: file555.JPG 158件 [詳細] file999.png 149件 [詳細] file777.png 158件 [詳細] file.png 178件 [詳細] file.png 78件 [詳細] file.png 75件 [詳細] file088.JPG 140件 [詳細] file004.JPG 164件 [詳細] file003.JPG 81件 [詳細] file002.JPG 153件 [詳細] file001.JPG 214件 [詳細] file016.JPG 223件 [詳細] file013.JPG 224件 [詳細] file018.JPG 214件 [詳細] file019.JPG 216件 [詳細] file022.JPG 221件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-08-30 (月) 16:17:08 (3279d)