ロボット

Pathfinder

 今回は黒く描かれた線を辿るロボットを制作しました。製作における主なポリシ−は

1.見ていて美しい
2.機能的である
3.強度が高く扱いが容易

という点です。また自ら道を見つけ進むという意味で"Pathfinder"と命名しました。

製作過程

過程1

 このロボットの製作において、大きなタイプが二つあります。一つは二つの密着、或いは互いに接近した光センサで黒い線をなぞるようにするタイプ、もう一方は二つの光センサの間隔を空け黒い線を挟むようにするタイプ、です。トレースする上での双方のメリット、デメリットは他のチームの方々が十分に解説されているのでここでわざわざ述べることはありませんが、私たちのチームはそれとは別の理由で二つの光センサでラインを挟むタイプを採用しました。何故かというと光センサがロボットの正面中央を占領してしまうとバンパーの取り付けにビームやアームが必要となり、ロボットが大掛かりになってしまい美しくなくなると思ったからです。

 とりあえず光センサを組み立て、実験的に仮のバンパーを取り付けました。

1.jpg 2.jpg

 しかし、このデザインではバンパーが正面の衝突にしか対応できない(実験だから仕方ない)、二つのセンサが融合し、ロボットとの接続箇所が一カ所しか無く、強度や扱いに不安を覚える、そして何より美しくないので作り直すことにしました。

過程2

 前回の失敗から次に作るロボットには

1.広範囲の衝突に対応できること。
2.光センサとバンパーは独立すること。

の二点を求めることにしました。
そのため、まず各センサが独立してロボットに接続される様、光センサーの間隔を広げました。これにより本体下部のコネクタをバンパーとの接続専用に使えるようになりました。バンパーは部品点数の少なさと、最初から他との接続を考慮されているデザインからテキストのシングルバンパーを使用しました。但し、テキストに載っている物と基本的には同じですがそのままではアーム部が地面と接触し、タッチセンサが誤動作する可能性があるので、アームを少し上に上げています。

バンパー1.jpg バンパー2.jpg

↑バンパーの部品の順番を入れ替えてアームを上にずらしている。

 こうして完成したのがPathfinderです。このデザインの特徴は先に書いたポリシーを満たす物となっています。例えば、プレートのポッチの裏側が前や上に露出しない、センサーケーブルを下から通しているので、RCXの端子付近がすっきりとしている、部品点数が少なく無駄に大きくない点など美しいデザインとなっています。

3.jpg 4.jpg ~ P1000042.JPG
↑ケーブルが下を通っているところ。無駄な長さを調節しているので端子付近でコードが余ることは無い。

 また各センサ部がほぼ完全に独立したモジュールとなっており、写真のようにそれぞれを簡単に分離する
ことができ、機能的で扱いが容易です。

コネクタ.jpg
↑光センサの間隔を広げることにより下部のコネクタを使用してバンパーが接続できるようになった。

接続.jpg
↑矢印の示すパーツで光センサとバンパーが繋がっているがあくまで補助であり基本的にそれぞれの接続は独立している。

5.jpg
↑分解したところ。それぞれがモジュール化してるのがわかる。

コースについて

 今回はこのようなコースを用意しました。いわゆるMac OSの「Commandキー」であり、
交差の多いコースです。
command2.png

一回目

 一回目はA5Rが描いた物を使用しました。しかし、図形が大きすぎ紙からはみ出たセンサーがマットに反応し誤動作してしまいました。さらに優先道路すら描かれていませんでした。
P1000043.JPG

二回目

 そのため再度紙を購入し新たに描き直すことにしました。  今度はうまく走ることができました。

プログラムについて

 プログラムは基本的に単純な物にしました。線をトレースするだけなら衝突ぐらいしか予測ができない事は無いからです。また今回はミュージックを演奏するプログラムも取り入れました。他のチームの多くが『エリーゼのために』のようなメジャーな曲をやっていたので敢えて知っている人の少ない曲にしました。Sonata ArcticaのSilenceからWolf & Ravenです。まずGarageBandで曲をコピーしBPMを計りそこから一拍の時間を算出し、プログラムに置き換えました。

ライントレースのプログラム

#define THRESHOLD 43
task main ()
{
     start WolfAndRaven;  //メロディWolf & Ravenを演奏
    
     SetSensor(SENSOR_1,SENSOR_LIGHT); //Lライトセンサ
     SetSensor(SENSOR_3,SENSOR_LIGHT); //Rライトセンサ
     SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサ
    
     while(true)
     {
             
       if (SENSOR_2==0)  //タッチセンサが触れていないとき且つ、
       {
        if (SENSOR_1>THRESHOLD) L光センサが白のとき且つ、
        {
       
          if (SENSOR_3>THRESHOLD) //R光センサが白のとき
          {
      
             OnFwd(OUT_A+OUT_C); //前進する
      
          }
          else            //R光センサが黒のとき    
          { 
      
             OnFwd(OUT_A);                 //右折する
             OnRev(OUT_C);
          }
        }
        else                                          // L光センサが黒のとき且つ、
        { 
     
          if (SENSOR_3>THRESHOLD) //R光センサが白のとき
          {
       
             OnRev(OUT_A);      //左折する
             OnFwd(OUT_C);
                
          }
          else             //R光センサが黒のとき
          {
          
             OnRev(OUT_A+OUT_C);  //後退し、しばらく待つ
             Wait(100);
             Off(OUT_A+OUT_C);
             Wait(300);
             
          
          }
         
       }
     }
     else                                              //タッチセンサが触れたとき
     {
     
           OnRev(OUT_A+OUT_C);    //後退し、しばらく待つ
           Wait(100);
           Off(OUT_A+OUT_C);
           Wait(300);                            
     
     }
   }
}

ミュージック演奏プログラム

#define B5 3951
#define DS4 1245
#define CS4 1109
#define B3 988
#define AS3 932  
#define GS3 831
#define G3 784
#define FS3 740
#define F3 698
#define E3 659
#define DS3 622
#define B2 494
#define B5 3951
task WolfAndRaven()
{
  while(true)
  {
    Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(CS4,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(GS3,33); Wait(36);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(GS3,72); Wait(72);
    Wait(22);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(CS4,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(GS3,18); Wait(18);
    PlayTone(AS3,36); Wait(36);
    PlayTone(B3,36); Wait(36); 
    PlayTone(GS3,18); Wait(18);
    PlayTone(FS3,18); Wait(18);
    PlayTone(F3,36); Wait(36);
    Wait(25);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(CS4,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(GS3,33); Wait(36);
    PlayTone(B3,18); Wait(18);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(GS3,48); Wait(54);
    PlayTone(GS3,18); Wait(18);
    PlayTone(DS4,21); Wait(27);
    PlayTone(DS4,21); Wait(27);
    PlayTone(DS4,13); Wait(18);
    PlayTone(B3,30); Wait(36);
    PlayTone(B3,18); Wait(18);
    PlayTone(B3,18); Wait(18);
    PlayTone(CS4,30); Wait(36);
    PlayTone(DS4,30); Wait(36);
    PlayTone(DS4,18); Wait(18);
    PlayTone(CS4,14); Wait(18);
    PlayTone(CS4,36); Wait(36);
    PlayTone(DS4,36); Wait(36);
    PlayTone(G3,36); Wait(36);
    PlayTone(GS3,36); Wait(36);
    PlayTone(AS3,32); Wait(36);
    PlayTone(AS3,54); Wait(54);
    PlayTone(GS3,14); Wait(18);
    PlayTone(GS3,72); Wait(72);
    Wait(40);
    PlayTone(GS3,32); Wait(36);
    PlayTone(GS3,23); Wait(27);
    PlayTone(AS3,23); Wait(27);
    PlayTone(B3,14); Wait(18);
    PlayTone(B3,52); Wait(54);
    PlayTone(AS3,14); Wait(18);
    PlayTone(AS3,54); Wait(72);
    PlayTone(DS3,36); Wait(36);
    PlayTone(G3,36); Wait(36);
    PlayTone(AS3,36); Wait(36);
    PlayTone(DS4,36); Wait(36);
    PlayTone(CS4,23); Wait(27);
    PlayTone(B3,23); Wait(27);
    PlayTone(AS3,18); Wait(18);
    PlayTone(B3,36); Wait(54);
    PlayTone(B3,14); Wait(18);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,23); Wait(27);
    PlayTone(DS4,18); Wait(18);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,23); Wait(27);
    PlayTone(DS4,13); Wait(18);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,23); Wait(27);
    PlayTone(DS4,18); Wait(18);
    PlayTone(GS3,23); Wait(27);
    PlayTone(GS3,5); Wait(9);
    PlayTone(GS3,14); Wait(18);
    PlayTone(AS3,14); Wait(18);
    PlayTone(B3,63); Wait(72);
    PlayTone(B3,63); Wait(72);
    PlayTone(B3,63); Wait(72);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,23); Wait(27);
    PlayTone(DS4,14); Wait(18);
    PlayTone(CS4,63); Wait(72);
    PlayTone(B3,36); Wait(36);
    PlayTone(AS3,32); Wait(36);
    PlayTone(AS3,63); Wait(72);
    PlayTone(AS3,23); Wait(27);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,18); Wait(18);
    PlayTone(B3,63); Wait(72);
    PlayTone(B3,32); Wait(32);
    PlayTone(DS3,32); Wait(32);
    PlayTone(E3,63); Wait(72);
    PlayTone(B3,23); Wait(27);
    PlayTone(CS4,23); Wait(27);
    PlayTone(DS4,14); Wait(18);    
    PlayTone(CS4,63); Wait(72);
    PlayTone(B3,36); Wait(36);
    PlayTone(AS3,32); Wait(36);
    PlayTone(AS3,9); Wait(9);
    PlayTone(GS3,9); Wait(9);
    PlayTone(FS3,126); Wait(126);
    PlayTone(B2,144); Wait(144);
    PlayTone(B5,144 ); Wait(144);
    
  }
}

感想

前回と違って、左右対称なロボットを作ることができた。工学部のチームにまともに太刀打ちすることは難しいので、自分にできることをやった。まだまだ改善の余地が多く(不要な物が多い)妥協をしなかったかといわれたら多少苦しい。一方で今回はメロディの機能が四時間かかり一番骨が折れたがDTMの延長のようで一番楽しかった。複数のロボットで各パートに分けてプログラムし演奏したら楽しいかもしれない。C言語を使う(らしい)Csoundもこのような手法やるのだろうか?興味を持てた。次回からは隣のチームとの連携強化を図りたい。

Extra

ロボットに演奏させたWolf & Ravenを録音したMP3ファイルです。


添付ファイル: fileP1000043.JPG 209件 [詳細] fileWolf & Raven.mp3 166件 [詳細] fileP1000042.JPG 194件 [詳細] file接続.jpg 193件 [詳細] fileコネクタ.jpg 231件 [詳細] fileバンパー2.jpg 220件 [詳細] fileバンパー1.jpg 201件 [詳細] filecommand2.png 203件 [詳細] filecommand.png 93件 [詳細] file5.jpg 206件 [詳細] file4.jpg 204件 [詳細] file3.jpg 201件 [詳細] file2.jpg 203件 [詳細] file1.jpg 226件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-06-28 (木) 17:40:19