[[2007a/MemberOnly/進行状況A]

 

概略

今回の課題

 ライントレースを製作すること。また、コースには2カ所交差点を入れること。

今回の目標

 素早く、正確に動くように作成する。また、交差点では、一時停止をする。(優先道路でない場合のみ)

ライントレースが出来るまで

過程1(コースの作成)

 まず最初に、画用紙に2カ所交差点を入れたコースを作成しました。あまり難しいコースでなく、シンプルなコースにしました。

失敗失敗2

 しかし、道と道の間隔が狭く、途中で二台のロボットが通るとぶつかってしまうことに気づき、下のように書き直しました。

成功

過程2(前回からの改良)

 前回の課題1で使用したキャタピラ型のロボットは、摩擦によって毎回曲がる角度が変わり、今回のような曲線を描くような動きには合わないと考え、タイヤをつけて走らせることにした。しかし、タイヤが大きすぎ、走行できなくなってしまったため、小さいタイヤと使用することにした。

タイヤ化  

過程3(光センサー部分の製作)

 まず、走行を正確なものにするため、2つの光センサーを使用することにした。ラインを挟む形ではなく、2つとも黒いラインを走らせるように組み立てた。とりあえず作成してみたところ、反応が悪かったため、最初はセンサーが近すぎると思い、2つのセンサーを離してみたが、実際は閾値が違っていただけだった。

光センサー部分

過程4(タッチセンサー部分の製作)

 タッチセンサーは、ほかのロボットとぶつかるのを判断しなくてはならないので、本体の前方に設置する。光センサーを2つ使っているため、タッチセンサーは1つにした。また、前方だけならシングルバンパーでもカバーできると判断し、光センサー部分の前に取り付けた。

シングルバンパー

過程5(センサー部分と本体の合体)

 センサー部分と本体を合体させるにあたり、いくつかの案があった。また、タッチセンサーは、本体の過程4で述べたように前方に設置する。

案1 光センサーを本体の後方に設置する

 光センサー部分は、タッチセンサー部分と違い、前方につける必要がないので、後方につけることが可能。

  ↓

 本体と接合するための部品が足らなかったので、断念。

案2  光センサーとタッチセンサーを別々に本体に設置する

 光センサーもタッチセンサーも前方に設置するが、光センサーは光センサーで、タッチセンサーはタッチセンサーで別々に本体に設置する。別々に設置することによって、ロボットの大きさをコンパクトにできる。

  ↓

 別々に設置することはできるが、使用するパーツが多くなり、壊れやすくなってしまうので、断念。

案3 光センサーとタッチセンサーを合体させて本体に設置

 本体にセンサー部分を設置する前に、光センサー部分と、タッチセンサー部分を先に合体させる。おそらくこの案が一番簡単に出来そう。

  ↓

 予想通り、簡単に設置することが出来た。しかし、光センサー部分とタッチセンサー部分をつなげたことによって、ロボット本体が長くなってしまった。

結果

 とりあえず、3番目の案が1番簡単に出来たので、これで進めることにした。

結果

過程6 (ロボットのバランス)

 いままで想像していたより、センサー部分が大きくなってしまった。そのため、光センサー部分を引きずってしまう形になってしまった。このまま走らせると、センサー部分が壊れてしまいそうだし、光センサー自体壊れてしまいそうなので、補助タイヤをつけることにした。

補助なし補助タイヤ補助あり

 補助タイヤをつけるという考えはとてもよく、実際にロボットのバランスも取ることが出来た。しかし、走らせる中で、補助タイヤのゴムの摩擦により、上手く曲がりきれなくなってしまうことがあった。それを克服するために、ゴムのつけずに、ホイールのみをつけることにした。

ホイール

過程7 (タイヤの変更)  

 ついに完成と思い、走らせてみたところ、円を走る時にスピードが早すぎ、線から外れてしまった。そこで、スピードを遅くするためにタイヤを小さいサイズに変更した。そのため、ギヤも変えなければいけなかったので、簡単にタイヤを付け替え出来る部分を作った。

変更タイヤ取り替え装置

 いろいろと試してみたが、結局最初に制作したタイヤの方が、曲がれていたので元に戻した。

過程8(簡易化)

 ロボットの強度を高めるために、パーツを減らすことにした。実際にはほとんど変えることは出来なかったが、少しスタイリッシュになった。

スタイリッシュ

過程9(プログラミング)

エリーゼのために

#define Do 523
#define DO 262
#define Re 587
#define R 622
#define mi 1319
#define Mi 659
#define MI 330
#define Fa 698
#define FA 349
#define Sol 784
#define SOL 392
#define SI 494
#define RA 220
#define Ra 440 
task play_music() //
{
   while (true)
  {
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(R,15); Wait(20);  // 
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(R,15); Wait(20);
      PlayTone(Mi,15); Wait(20);
      PlayTone(SI,15); Wait(20);
      PlayTone(Re,15); Wait(20);
      PlayTone(Do,15); Wait(20);
      PlayTone(Ra,35); Wait(45);
      
      PlayTone(DO,15); Wait(20);  // 
      PlayTone(MI,15); Wait(20);  // 
      PlayTone(Ra,15); Wait(20);  // 
      PlayTone(SI,35); Wait(45);
      
      PlayTone(MI,15); Wait(20);  // 
      PlayTone(Ra,15); Wait(20);  //
      PlayTone(SI,15); Wait(20);  // 
      PlayTone(Do,35); Wait(45);
      
      PlayTone(MI,15); Wait(20);
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(R,15); Wait(20);  //
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(R,15); Wait(20);
      PlayTone(Mi,15); Wait(20);
      PlayTone(SI,15); Wait(20);
      PlayTone(Re,15); Wait(20);
      PlayTone(Do,15); Wait(20);
      PlayTone(Ra,35); Wait(45);
      
      PlayTone(DO,15); Wait(20);  //
      PlayTone(MI,15); Wait(20);  //
      PlayTone(Ra,15); Wait(20);  // 
      PlayTone(SI,35); Wait(45);
      
      PlayTone(MI,15); Wait(20);  //
      PlayTone(Do,15); Wait(20);  // 
      PlayTone(SI,15); Wait(20);  // 
      PlayTone(Ra,35); Wait(45);
      
      PlayTone(SI,15); Wait(20);  // 
      PlayTone(Do,15); Wait(20);  // 
      PlayTone(Re,15); Wait(20);  // 
      PlayTone(Mi,35); Wait(45);
      
      PlayTone(SOL,15); Wait(20);  //
      PlayTone(Fa,15); Wait(20);  //
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(Re,35); Wait(45);
      
      PlayTone(FA,15); Wait(20);  // 
      PlayTone(Mi,15); Wait(20);  //
      PlayTone(Re,15); Wait(20);  // 
      PlayTone(Do,35); Wait(45);
      
      PlayTone(MI,15); Wait(20);  // 
      PlayTone(Re,15); Wait(20);  // 
      PlayTone(Do,15); Wait(20);  // 
      PlayTone(SI,35); Wait(45);
      
      PlayTone(MI,15); Wait(20);
      PlayTone(MI,15); Wait(20);  // 
      PlayTone(Mi,15); Wait(20);  // 
      PlayTone(MI,15); Wait(20);  // 
      PlayTone(Mi,15); Wait(20);
      PlayTone(Mi,15); Wait(20);
      PlayTone(mi,15); Wait(50);
      PlayTone(R,15); Wait(20);
  }
}
task main () 
{
  SetSensor(SENSOR_1, SENSOR_LIGHT);  //センサー1を光センサーに定義する
  SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー2を光センサーに定義する
  SetSensor(SENSOR_2,SENSOR_TOUCH);   //センサー3をタッチセンサーに定義する
  start play_music ;
  
  while(true) {
      if (SENSOR_1 > 50) {                           //左のセンサーが黒線からはずれたら右のタイヤが止まる
      Off(OUT_C); 
      } else {                                                //黒線上では正回転
      OnFwd(OUT_C);
      }
      if (SENSOR_3 > 50) {         //右のセンサーが黒線からはずれたら左のタイヤが止まる
      Off(OUT_A); 
      } else {                                                //黒線上では正回転
      OnFwd(OUT_A); 
      }
      if ((SENSOR_1 > 50) && (SENSOR_3 > 50)) {      //両方ともはずれたら右に少し曲がる
      OnFwd(OUT_A); OnRev(OUT_C);Wait(20);
      if  ((SENSOR_1 > 50) && (SENSOR_3 > 50)) {     //それでも黒線上になかったら停止したあと直進
      OnRev(OUT_A+OUT_C); Wait(100);
       Off(OUT_A+OUT_C); Wait(300);
       OnFwd(OUT_A+OUT_C); Wait(170);
      }
      }
      if (SENSOR_2 == 1 )                                //衝突したら一時停止
      {
          OnRev(OUT_A+OUT_C);  Wait(50);
          Off(OUT_A+OUT_C);  Wait(300);
      }                        
  }
  Off(OUT_A+OUT_C);
}

ロボットの解説

 一つのセンサーが対角線上のタイヤ一つを制御している。プログラムの簡略化を図っている。  右のセンサーが黒線上から外れた場合、左のタイヤの回転が止まるようにプログラミングした。右のタイヤは回転しているため、ロボット本体は左に曲がる。

左折

 右も同様にして、右折する。

右折

 両方のセンサーが、黒線上から外れてしまった場合。まず、少し右に曲がるようになっている。そして、再び黒線を発見できたらコースに復帰する。また、黒線を発見できなかったら、後退し、一時停止したのち直進、再びライントレースを開始する。

 これは、急カーブで曲がりきれなかったときには前者、交差点に差し掛かったら、後者のプログラミングが実行されるようになっている。もしもの時を想定したプログラミングである。

苦労した点

 1番苦労したのは、プログラミングである。前回の書道ロボットのプログラミングより、飛躍的に難しくなっている。こういったプログラミングなど、この授業で初めてやった私たちには、ifやwhile、elseなどを駆使しなければできない今回の課題のレベルになるまでに相当な時間が必要だった。

 また、音楽をプログラミングは考えたこともなく、実際に流してみると全く違っていたりと、大変だった。さらに、この音楽プログラムを流しながら動くようにプログラミングに組み込むのにも骨が折れた。

工夫した点

 過程の中でも述べたように、多くの試行錯誤を繰り返した。しかし中でも、センサー部分を1番工夫した。

 光センサーについては、センサーを2つとも黒線上の上に設置したことだ。これによって正確に走ることが出来た。センサーの方向を同じにすることによって感知のずれをなくすようにしてある。

同じ方向

 タッチセンサーについて、バンパーを広くとることで、シングルバンパーでも間に合うようにした。さらに、シングルバンパーはロボットの簡略化というねらいもある。

 補助タイヤは、それ自体が工夫した点だが、補助タイヤを設置するのにも、レゴの特性を生かした工夫をしている。

レゴ特性設置部分

感想

 今回の課題はコース、ロボット、プログラミングを制作するにあたってどれも問題点が多く困難だった。コースでは2体が接触することを考慮に入れずに制作してしまったのが失敗だった。ロボットはセンサー部分を本体に設置するのが大変だった。プログラミングでは急なカーブでコースを外れないようにするのが大変だった。

 三点とも苦労したが、地道な修正により完成することが出来ただけでなく、最後にはメロディーも付けたことで、よりグレードアップしたものになった。今回の経験を活かして次の課題に取り組みたい。

 また、今回の製作にあたって、私たちを支えてくださった皆様に感謝します。

完成

コメント

 意見、感想がありましたら、お願いします。

  • マシンの解説や、考察は大変よくなされていますが、プログラムについてもっと解説してください。 -- まいける(TA) 2007-06-21 (木) 10:18:37
  • 写真を多用しておりとてもわかりやすいです。プログラムについてもっと解説すると、より良い物になるでしょう。 -- ヒロヤ? 2007-06-21 (木) 13:29:21
  • プログラムについて、きちんと考察のスペースを設けてほしいところです。while文をいれこ構造にしたほうが早い動作ができそうな気がするのですが(現場をみていないので不確かですが)、たとえばA8Rのようなプログラムのほうが早い動作ができるように思いますので、その辺を考察してみてはどうでしょう。 -- まいける(TA) 2007-06-22 (金) 10:47:24


添付ファイル: fileDSC00315.JPG 215件 [詳細] fileDSC00312.JPG 219件 [詳細] fileDSC00282.JPG 205件 [詳細] fileDSC00310.JPG 214件 [詳細] fileDSC00309.JPG 213件 [詳細] fileDSC00308.JPG 233件 [詳細] fileDSC00276.JPG 209件 [詳細] fileDSC00275.JPG 214件 [詳細] fileDSC00277.JPG 224件 [詳細] fileDSC00274.JPG 212件 [詳細] fileDSC00273.JPG 111件 [詳細] fileDSC00272.JPG 217件 [詳細] fileDSC00271.JPG 119件 [詳細] fileDSC00270.JPG 214件 [詳細] fileDSC00269.JPG 228件 [詳細] fileDSC00268.JPG 111件 [詳細] fileDSC00267.JPG 253件 [詳細] fileDSC00266.JPG 98件 [詳細] fileDSC00265.JPG 110件 [詳細] fileDSC00264.JPG 235件 [詳細] fileDSC00263.JPG 200件 [詳細] fileDSC00262.JPG 192件 [詳細] fileDSC00261.JPG 202件 [詳細] fileDSC00260.JPG 215件 [詳細] fileDSC00259.JPG 101件 [詳細] fileDSC00258.JPG 212件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-06-22 (金) 10:47:25 (4445d)