#contents *ロボット [#e0b17f4b] **Pathfinder [#m3225f39] 今回は黒く描かれた線を辿るロボットを制作しました。製作における主なポリシ−は~ 1.シンプルで美しい~ 2.機能的である~ 3.強度が高く扱いが容易~ という点です。また自ら道を見つけ進むという意味で"Pathfinder"と命名しました。 **製作過程 [#n3c9bc9a] ***過程1 [#s609cb6e] このロボットの製作において、大きなタイプが二つあります。一つは二つの密着、或いは互いに接近した光センサで黒い線をなぞるようにするタイプ、もう一方は二つの光センサの間隔を空け黒い線を挟むようにするタイプ、です。トレースする上での双方のメリット、デメリットは他のチームの方々が十分に解説されているのでここでわざわざ述べることはありませんが、私たちのチームはそれとは別の理由で二つの光センサでラインを挟むタイプを採用しました。何故かというと光センサがロボットの正面中央を占領してしまうとバンパーの取り付けにビームやアームが必要となり、ロボットが大掛かりになってしまい美しくなくなると思ったからです。~ とりあえず光センサを組み立て、実験的に仮のバンパーを取り付けました。~ &ref(2007a/A5/課題2左/1.jpg,50%); &ref(2007a/A5/課題2左/2.jpg,50%); ~ しかし、このデザインではバンパーが正面の衝突にしか対応できない(実験だから仕方ない)、二つのセンサが融合し、ロボットとの接続箇所が一カ所しか無く、強度や扱いに不安を覚える、そして何より美しくないので作り直すことにしました。 ***過程2 [#b554d107] 前回の失敗から次に作るロボットには ~ 1.広範囲の衝突に対応できること。~ 2.光センサとバンパーは独立すること。~ の二点を求めることにしました。~ そのため、まず各センサが独立してロボットに接続される様、光センサーの間隔を広げました。これにより本体下部のコネクタをバンパーとの接続専用に使えるようになりました。バンパーは部品点数の少なさと、最初から他との接続を考慮されているデザインからテキストのシングルバンパーを使用しました。但し、テキストに載っている物と基本的には同じですがそのままではアーム部が地面と接触し、タッチセンサが誤動作する可能性があるので、アームを少し上に上げています。~ &ref(2007a/A5/課題2左/バンパー1.jpg); &ref(2007a/A5/課題2左/バンパー2.jpg); ~↑バンパーの部品の順番を入れ替えてアームを上にずらしている。 こうして完成したのがPathfinderです。このデザインの特徴は先に書いたポリシーを満たす物となっています。例えば、プレートのポッチの裏側が前や上に露出しない、センサーケーブルを下から通しているので、RCXの端子付近がすっきりとしている、部品点数が少なく無駄に大きくない点などシンプルで美しいデザインとなっています。~ &ref(2007a/A5/課題2左/3.jpg,50%); &ref(2007a/A5/課題2左/4.jpg,50%); ~ ↑ケーブルが下を通っているところ。無駄な長さを調節しているので端子付近でコードが余ることは無い。 また各センサ部がほぼ完全に独立したモジュールとなっており、写真のようにそれぞれを簡単に分離する~ ことができ、機能的で扱いが容易です。~ &ref(2007a/A5/課題2左/コネクタ.jpg);~ ↑光センサの間隔を広げることにより下部のコネクタを使用してバンパーが接続できるようになった。 &ref(2007a/A5/課題2左/接続.jpg);~ ↑矢印の示すパーツで光センサとバンパーが繋がっているがあくまで補助であり基本的にそれぞれの接続は独立している。 &ref(2007a/A5/課題2左/5.jpg,100%); ~ ↑分解したところ。それぞれがモジュール化してるのがわかる。 この簡潔な構造により、光センサとバンパーを~ ビームなどに一つのユニットとして強引に取り付けたロボットよりも高い強度を有しています。 *コースについて [#p885095b] 今回はこのようなコースを用意しました。いわゆるMac OSの「Commandキー」であり、~ 交差の多いコースです。~ &ref(2007a/A5/課題2左/command2.png,60%); *プログラムについて [#peecca91] #define THRESHOLD 43 #define RUN_TIME 5000 task main () { start WolfAndRaven; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); ClearTimer(0); while(true) { if (SENSOR_2==0) { if (SENSOR_1>THRESHOLD) { if (SENSOR_3>THRESHOLD) { OnFwd(OUT_A+OUT_C); } else { OnFwd(OUT_A); OnRev(OUT_C); } } else { if (SENSOR_3>THRESHOLD) { OnRev(OUT_A); OnFwd(OUT_C); } else { OnFwd(OUT_A+OUT_C); } } } else { Off(OUT_A+OUT_C); } } } #define DS4 1175 #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 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(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,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,18); Wait(18); 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,52); Wait(54); PlayTone(GS3,9); Wait(9); PlayTone(DS4,25); Wait(27); PlayTone(DS4,25); Wait(27); PlayTone(DS4,18); Wait(18); PlayTone(B3,18); Wait(36); PlayTone(B3,18); Wait(18); PlayTone(B3,18); Wait(18); PlayTone(CS4,34); Wait(36); PlayTone(DS4,34); Wait(36); PlayTone(DS4,18); Wait(18); PlayTone(CS4,16); Wait(18); PlayTone(CS4,36); Wait(36); PlayTone(DS4,36); Wait(36); PlayTone(G3,36); Wait(36); PlayTone(GS3,36); Wait(36); PlayTone(AS3,34); Wait(36); PlayTone(AS3,54); Wait(54); PlayTone(GS3,16); Wait(18); PlayTone(GS3,72); Wait(72); Wait(36); PlayTone(GS3,34); Wait(36); PlayTone(GS3,25); Wait(27); PlayTone(GS3,25); Wait(27); PlayTone(AS3,16); Wait(18); PlayTone(AS3,52); Wait(54); PlayTone(GS3,16); Wait(18); PlayTone(GS3,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,25); Wait(27); PlayTone(B3,25); Wait(27); PlayTone(AS3,18); Wait(18); PlayTone(B3,36); Wait(54); PlayTone(B3,16); Wait(18); PlayTone(B3,27); Wait(27); PlayTone(CS4,27); Wait(27); PlayTone(DS4,18); Wait(18); PlayTone(B3,27); Wait(27); PlayTone(CS4,27); Wait(27); PlayTone(DS4,18); Wait(18); PlayTone(B3,27); Wait(27); PlayTone(CS4,27); Wait(27); PlayTone(DS4,18); Wait(18); PlayTone(GS3,25); Wait(27); PlayTone(GS3,7); Wait(9); PlayTone(GS3,16); Wait(18); PlayTone(AS3,16); Wait(18); PlayTone(B3,63); Wait(72); PlayTone(B3,63); Wait(72); PlayTone(B3,63); Wait(72); PlayTone(B3,25); Wait(27); PlayTone(CS4,25); Wait(7); PlayTone(DS4,16); Wait(18); PlayTone(CS4,63); Wait(72); PlayTone(B3,36); Wait(36); PlayTone(AS3,34); Wait(36); PlayTone(AS3,63); Wait(72); PlayTone(AS3,27); Wait(27); PlayTone(B3,27); 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,25); Wait(27); PlayTone(CS4,25); Wait(7); PlayTone(DS4,16); Wait(18); PlayTone(CS4,63); Wait(72); PlayTone(B3,36); Wait(36); PlayTone(AS3,34); Wait(36); PlayTone(AS3,9); Wait(9); PlayTone(GS3,9); Wait(9); PlayTone(FS3,126); Wait(126); PlayTone(B3,288); Wait(288); } } *感想 [#ae5fbaf9]