2007a/MemberOnly/進行状況A

 

メンバー紹介

 今回は、「チノ」と「KY王子」の2人で課題をやっていくことになった。

概略

今回の課題

 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げるロボットを作る。懐中電灯は動かさない。

 また、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

今回の条件

 モータ、光センサ、タッチセンサはそれぞれ2個までしか使ってはいけない。

今回の目標

 素早く光を発見し、懐中電灯が動いているならそれにあわせて追いかけるようにする。さらに、続けてブロックを投げれるようにする。

作戦

 今回の課題では、モータは2個しか使えない、ということは1つのモータで起動部分を作り、もう1つのモータでブロックを投げる部分を作らなければならない。

ブロックを投げるには

 ブロックを投げる部分については、2つの方法を思いついた。モータの遠心力を利用して投げる方法と、タイヤ2つでブロックを挟み、タイヤの回転を利用して投げる方法である。

 このどちらの方法が目標や自分たちに合っているのだろうか。

モータの遠心力で投げる方法

 タイヤの回転を利用する方法よりも、比較的簡単にできると思う。ややこしいギヤを使う必要もなく、パーツも少なくてすみそうだ。また、ピッチングマシーンのようなものができれば、ブロックを続けて投げることも可能だろう。

 しかし、ブロックを投げるために腕の部分が必要となり、その腕の振りの直径の大きさによってロボット本体の大きさもかえなくてはならない。

タイヤの回転を利用して投げる方法

 投げるブロックを2つのタイヤで挟み込み、タイヤをお互いに逆回転させ、その回転を利用してブロックを投げる、というより飛ばすという方法。こちらの方法でもブロックをタイヤに次々に送り込むことができれば、続けて投げることが可能である。

回転法回転法イメージ

 遠心力を利用する方法よりコンパクトに作ることができるはず。しかし、1つのモータで2つのタイヤを逆回転させなければならないので、ギヤの組み合わせ方が複雑になる。

モータ1つで2つのタイヤを動かすには

 残り一つしか、モータを使うことができない。1つのモータで2つのタイヤを同じ方向に動かすだけなら、簡単だが今回の課題では、1つのモータで2つのタイヤをお互いに逆回転させることができなくてはならない。

ヒントに載っていた方法

 1つのモータで2つのタイヤを動かすのは難しいらしく、先生がヒントをくれた。ギアの中にというギアを3つ入れ、タイヤがお互いに逆回転する装置を作り、さらにストッパーを使い片方のタイヤの回転を止める方法を使うといいと教えてくれた。

ギヤの中にギヤストッパー

 ほかにも考えてはみたが、何も思いつかなかった。

光を追うには

 今回の課題のメインは、光を感知して追いかけること。当然光センサーを使うことになる。では、どのようにして光センサーを使っていけばいいのか。

光センサー1つで行う方法

 光センサーを1つしか使わないのならば、ロボットの前方に設置し、光を見失ったら頭を左右に振り光を探すようにする。この方法を使うと光を探す時間のタイムロスが光センサーを2つ使う場合よりも大きくなってしまう。

光センサーを2つ使う方法

 基本的に今回の課題を考えると、光センサーを1つしか使わないよりも、光センサーを2つ使う方が効果的である。どのように使うのが1番なのだろうか。

 光センサーを左右に設置する

      ↓

 光センサーを左右につける方法では、光が左右どちらに動いた場合、1つのセンサーは反応し、もう1つは反応しないから、光がどちらに動いたのかがわかり、素早く対応することができる。

 光センサーを前後に設置する

      ↓

 光センサーを前後につけることで、光源との距離をある程度、測ることができる。光源がストップすると後ろにつけたセンサーが反応し、止まるようになる。

製作過程

 今回作ったロボットの製作過程の記録。苦労した点、工夫した点など、写真を加えて説明している。

ベースの製作

 ベースはロボットの機動力を生み出す大切な部分。ロボットが前進するにも、後退するにも必ず必要な部分である。

今回の課題では、前述したように1つのモータで2つのタイヤを動かさなくてはならない。そこで、ヒントに載っていたのを参考にして作ってみた。

 ヒントに載っていた方法を使うと左右の切り返しが多くなり、小回りの利くロボットがいいと考えた。前回の課題で初めてタイヤを使ってみたが、曲がり方も的確で変なズレはなかったので今回もタイヤを使うことにした。

ベース

 やはり、1つのモータで2つのタイヤを動かすにはギヤをたくさん使わなければならない。しかもこの作り方だと、タイヤが回転する方向としない方向があり、とてもややこしく頭が混乱してしまった。

光センサーの製作

 光センサーは、2つ使用し、ロボットの前方左右に設置する作戦で試すことにした。

光センサー

 前回も使用したからか、すぐにできた。

ブロックを投げる部分の製作

 ブロックを投げる方法は、さんざん迷ったあげく、遠心力を利用した方法をとることになった。理由としては、ギヤがごちゃごちゃするとややこしいし、複雑になるとわかりづらくなるからである。ロボット本体は大きくなるが、遠心力を利用する作戦を試すことにした。

モータ部持つ部分投げる部分

 遠心力を最大限に生かすために、モータとブロックを持つ腕を直結させた。また、投げるブロックは1つではなく、何度も投げられるようにいくつもブロックを持てるようにした。その際、ブロックが落ちないような工夫をこらした。

工夫ブロック持っている

試作品1号機の完成

1号機完成

 遠心力を利用したブロックを投げる部分を採用したせいかロボット本体がでかくなってしまった。また、ベースにブロックを投げる部分などを合体させるときにも、コードをよけるような組み立てをした。

組み方工夫

 だが、本体が大きいせいで重みが増し、タイヤがうまく回らなくなってしまった。べ−スの前後をかえるなどしてみたが効果はでなかった。

ブロックを投げる部分の改良

 1号機の重さを増やしているのはブロックを投げる部分だと考え、軽量化を図ることにした。また、片方に主さが偏るといけないので、ブロックを投げる部分は本体の後方に設置することにした。

投げる部分改良版

 今回も遠心力を利用した方法をとることにした、1号機のブロックを投げる部分は大きめのブロック主体だったが、改良版は軽そうなブロックでシンプルに作ってみた。さらに、改良版ではギヤを使ったが、ギヤも1つだけでモータの力を伝えられるようにした。

大きめのブロック

           ↓

軽めのブロック

ベースの改善

 1号機の動きが悪いのは、重み以外にもあるのではないかと思い調べたところ、タイヤを着ける位置を間違えている部分が発見された。改善前の状態ではタイヤが逆方向に回転してしまい、右にしか曲がることができなかった。タイヤの位置を変更することでちゃんと左右どちらにも曲がれるようにした。

直す前

           ↓

直した後

試作品2号機の完成

 試作品1号機改良の最大の目的である軽量化は成功した。実際にプログラミングをダウンロードして走らせたところロボットの重みで、タイヤが回らなくなることはなくなった。

2号機完成

 しかし、新たな問題が発生した。ブロックを投げる段階になって、実際に投げてみたところ勢いがなくて、ブロックが前に飛ばなかった。ギヤを使ったことでモータの力が今までより伝わらなかったようだ。

モータの力を伝えるように改造

 2号機はモータとブロックを投げる部分をギヤでつなげていた。やはり、モータとブロックを投げる部分を直接つなげることにした。

モータ直結投げる部分改造

 ブロックを投げる部分自体はすぐにできたが、本体にのせてみるととても不安定で、少しの振動でとれてしまいそうだった。そこでベースの邪魔にならないようにしっかりと補強した。

危ないベースをよける強化パーツ強化後

 さらに、連射できるように改造した。

連射

試作品3号機の完成

 プログラミングもブロックを投げる部分も実際に走らせて、調整をして、今までの問題を解決できた。さらに、組み替えていく中で光センサーもしっかりと設置した。

光センサー

 問題点としては、光センサーがどちらから照らされているか判別しにくい、補助タイヤのノイズ、ベースのパワー不足が残った、それを解決すれば、完成である。

問題の解決

 まず補助タイヤがこすれるたびにキーキー鳴っていたので地面との接地面が丸いタイヤと変更した。

補助タイヤ変更前

          ↓

補助タイヤ変更後

 次に、タイヤのパワーを出すために、ギヤを少し大きくした。

ギヤ変更

 光センサーがどちらから照らされているか判別しやすくするために、光センサーの間についたてを付け加えた。

ついたて

完成

 幾度かの改造を終えてついに完成した。

完成

プログラミング

 今回の課題では、1人1つプログラミングを作らなくてはならない。A8Lは2人で3つのプログラミングを制作する。「KY王子」が1つ、「チノ」が2つ担当した。

「KY王子」のプログラミング

懐中電灯が動かない時のプログラミング

#define THRESHOLD 65       //閾値
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ−1を光センサーに定義する
   SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサ−3を光センサーに定義する
   SetPower(OUT_A+OUT_C,7);        //AとCのモーターの出力を7にする
   while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) {  //センサー1か3が受ける光が閾値より弱ければ実行
       OnFwd(OUT_C);         //時計回りに回転
       Off(OUT_A);
       }
       Off(OUT_C); 
       OnFwd(OUT_A); Wait(50);    //両方とも受ける光が閾値より強くなったらブロックを投げる
       OnRev(OUT_A); Wait(50);
       Off(OUT_A);
}

「チノ」のプログラミング

懐中電灯をゆっくり動かす時のプログラミング

#define THRESHOLD 65       //閾値    
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ−1を光センサーに定義する
   SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサ−3を光センサーに定義する
   SetPower(OUT_A+OUT_C,7);        //AとCのモーターの出力を7にする
   while(true) {
       if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサー1と3が受ける光が閾値より強ければ前進
       OnRev(OUT_C); Wait(15);
       OnFwd(OUT_C); Wait(15);
       }
       if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //センサ−3が受ける光が暗くなったら左折
       OnRev(OUT_C);
       Off(OUT_A); 
       }
       if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサ−1が受ける光が暗くなったら右折
       OnFwd(OUT_C);
       Off(OUT_A);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       }
       if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //光がなければ時計回りに回転
       OnFwd(OUT_C);
       Off(OUT_A); 
       }
       }
Off(OUT_A+OUT_C);
}

懐中電灯を追いかけ懐中電灯の動きが止まればブロックを投げるプログラミング

#define THRESHOLD 65       //閾値
#define RUN_TIME 25        //RUN_TIMEを2,5秒に定義する
task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ−1を光センサーに定義する
  SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサ−3を光センサーに定義する
  SetPower(OUT_A+OUT_C,7);        //AとCのモーターの出力を7にする
  ClearTimer(0);               //タイマーをクリアする
  while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD) || (Timer(0) <= RUN_TIME)) {//光が閾値より弱くタイマーが2,5秒以下ならば実行
       if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサー1と3が受ける光が閾値より強ければ前進
       OnRev(OUT_C); Wait(15);
       OnFwd(OUT_C); Wait(15);
       }
       if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //センサ−3が受ける光が暗くなったら左折
       ClearTimer(0);               //タイマーをクリアする
       OnRev(OUT_C);
       Off(OUT_A); 
       }
       if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) {  //センサ−1が受ける光が暗くなったら右折
       ClearTimer(0);               //タイマーをクリアする
       OnFwd(OUT_C);
       Off(OUT_A);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       }
       if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {  //光がなければ時計回りに回転
       ClearTimer(0);               //タイマーをクリアする
       OnFwd(OUT_C);
       Off(OUT_A); 
       }
       }
Off(OUT_C); 
OnRev(OUT_A); Wait(50);           //前進を2,5秒以上続けたらブロックを投げる
OnFwd(OUT_A); Wait(50);
Off(OUT_A);
}

プログラミングの解説

 今回のプログラミングではwhileをより効率的に使えるように努力した。また、モーターの出力を7にすることでスムーズに動けるようにした。最後のプログラミングではタイマーを使って懐中電灯が止まったかどうか判断するようにした。

感想

 今回の課題では本体を動かすモータが一つしか使えず、どのように光を追えばいいかロボットの製作、プログラミングともに苦労した。また、ブロックを投げるアーム部分も最初はうまくいかず何度も改良をして大変だった。この課題を通して学べたことをこれから行うロボコンに活かしていきたい。

コメントをどうぞ

  • 「ベースの改善」という項目の画像ですが、確かにギアの位置が変わったのは確認できますが、なぜ以前の位置だと動きが悪く、位置変更後だとうまく動くのかの解説がほしいですね。写真を見る限りでは、どちらもうまくいきそうな…? -- まいける(TA) 2007-07-05 (木) 00:55:36
  • 製作過程が時系列で説明されており、とてもよいと思います。 -- ヒロヤ? 2007-07-05 (木) 09:32:58


添付ファイル: fileDSC00437.JPG 318件 [詳細] fileDSC00471.JPG 298件 [詳細] fileDSC00470.JPG 307件 [詳細] fileDSC00469.JPG 303件 [詳細] fileDSC00468.JPG 89件 [詳細] fileDSC00334.JPG 273件 [詳細] fileDSC00338.JPG 212件 [詳細] fileDSC00337.JPG 289件 [詳細] fileDSC00333.JPG 195件 [詳細] fileDSC00332.JPG 236件 [詳細] fileDSC00330.JPG 250件 [詳細] fileDSC00329.JPG 87件 [詳細] fileDSC00328.JPG 226件 [詳細] fileDSC00327.JPG 214件 [詳細] fileDSC00325.JPG 210件 [詳細] fileDSC00324.JPG 328件 [詳細] fileDSC00323.JPG 293件 [詳細] fileDSC00465.JPG 201件 [詳細] fileDSC00464.JPG 286件 [詳細] fileDSC00463.JPG 194件 [詳細] fileDSC00462.JPG 192件 [詳細] fileDSC00460.JPG 191件 [詳細] fileDSC00459.JPG 200件 [詳細] fileDSC00457.JPG 309件 [詳細] fileDSC00455.JPG 87件 [詳細] fileDSC00453.JPG 296件 [詳細] fileDSC00452.JPG 184件 [詳細] fileDSC00451.JPG 200件 [詳細] fileDSC00450.JPG 305件 [詳細] fileDSC00446.JPG 206件 [詳細] fileDSC00445.JPG 219件 [詳細] fileDSC00444.JPG 93件 [詳細] fileDSC00438.JPG 270件 [詳細] fileDSC00436.JPG 209件 [詳細] fileDSC00434.JPG 213件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-05 (木) 18:50:09 (4432d)