Message Ball


Message Ballとは

ロボットに何かを探査させたら、愉快ですね。でもLego MindStormsのRCXは、ごく近くのものでも、純正部品だけでは、なかなかうまく探査できません。ライトセンサーは、全然遠目がきかないし、タッチセンサーでは棒を振りまわして、物にぶつけるなど接触によるしかできません。

超音波や、赤外線を利用した自作センサーを作れば、結構離れた物体を検知できます。KimKosakaさんは、梵天丸にヒントを得て、RCXの一つの入力ポートにつなぎ、左右にある障害物をそれぞれ異なる入力値で表現しRCXで識別できるIR-eyeという特殊センサーを自作しました。

また、ななしのさんは、左右に異なる赤外線メッセージを交互に送信するユニットを自作し、これをロボットの上に乗せ、反射光をRCXの赤外線ポートで受信し、反射の有無でIR-eye同様に、離れた障害物を左右を分離して、検知する事に成功しました。

これらは、PIC, AVRなどの超小型RISCマイコンで製作されています。

しかし障害物は検知できても、赤外線を反射するものすべてに反応するので、特定の物体を探査する事はできません。なんとか離れた場所から「目標物」を見つけ、それを捕獲するしくみを実現したいと思い製作したのが、このMessage Ballです。

このページは初期のバージョンを詳細に解説します。実際の製作は改良された、Version 2にしたほうが良いでしょう。

Message Ball Version 2のページへ


動作原理

原理は単純です。自らRCXが受信できる赤外線Messageを全方位に連続して送信します。RCXで作ったロボットは、赤外線ポートをいろいろな方向に向けて試し、もっとも強くメッセージを受信できる方向に進めば、目標物に到達できます。

ただし、赤外線ポートは、受信強度を知る事ができません。信号が受信できたかどうかしか分からないのです。そこで、Message Ballは、送信するMessageの強度を7段階に分け、それに対応するメッセージ番号を順次繰り返し送信する事にしました。

強度 Message
7 107
6 106
5 105
4 104
3 103
2 102
1 101

受信できたもっとも弱いメッセージで、信号強度を判定する事ができます。


回路

この程度のものでも、汎用Logic ICを使って作ると、大変な事になります。Microchip TechnologyのPICに実装する事にしました。

回路図はここに置きます。

単純ですが、ちょっと小細工してあります。IR Messageは、38kHzで変調した赤外線キャリアをOn/Offして、2400bps 8bit, odd parity, 1 stop bit Serial信号にして送信します。出力をプログラムで可変したいので、DAコンバーターをつけることにしました。3bit DACなので、ディスクリートで組んでます。R1-R8がその部分で、この構成をR-2Rラダー電圧出力DACと言います。

DACには他にもいろいろ構成がありますが、R-2Rラダーは見てのとおり10kと20kのように、適当な抵抗値とその倍の値の抵抗で作れるので、部品の種類が少なく、また直接電圧を出力を取れるので、この応用例のような、簡便な用途にむいてます。

ついでだから、動きを細かく見てみましょうか?

下の図1を見てください。

図1

1 bitの場合です。スイッチは実際にはPICの出力端子に相当します。電流の引き込み(sink)、流し出し(source)とも可能なので、等価回路としては、0を出力している時にはGNDに、1を出力している時には電源に接続したものとして表現できます。PIC16F84のRA4はオープンドレインですので、GND側のスイッチだけしかありません。また、TTLやLS TTLもsource, sinkが極端に非対称でsourceはほとんどとれないし、出力電圧も電源電圧までスイングしませんので、こう言った応用はできません。この応用ができるのは、CMOSでオープンドレインでない、普通の出力に限られます。話がだいぶそれました。この回路で、PA2に0を出力すると0が、0を出力すると0.5VddがVoutに出るのは自明です。

さて、図2は2bitの場合です。                    

図2 図3 図4

まずPA1が0の時を考えましょう。この時の等価回路は、図3のようになります。書きかえれば図4になり、これは、図1とまったく同じです。ですので、PA2の0,1を出すと、それぞれ0, 0.5VddがVoutに出ます。

では、PA1が1の時はどうでしょうか?図5はこの場合の等価回路です。ちょっと面倒ですが、丁寧にオームの法則を適用していけば分かるでしょう。実は図6と等価なのです。Voutは(PA2+0.5)/2*Vddになります。つまり、0, 1のときそれぞれ、0.25Vdd, 075Vddになります。

図5 図6

さて、いよいよ3bitです。図7に等価回路を書きます。まず、PA1, PA0が共に0の時を考えましょう。この場合の等価回路は、まず、図8のようになり、さらに合成抵抗をまとめて、図9になります。数学好きの人にはもうこれで十分ですね。これは図3と同じで、と言うことは図1と等価です。この回路は再帰的になっているんです。任意のビットのところで切り分けると、その端子と、それ以外の端子が、2Rを直列に2本つないだ状態の両端になるように見えます。

図7 図8 図9

これなら、何段つなげても2種類の抵抗だけで作れるわけですね。

さて、この形式のDACは電圧出力で、Voutから電流を取り出すと誤差になってしまいます。できるだけ電流を流さないようにするには、高入力インピーダンスのオペアンプでバッファーを作れば良いのですが、この応用ではそこまで誤差にこだわる事もないし、もっと簡単に済ませたいので、エミッターホロワーで受ける事にしました。

ただし、エミッターホロワーでは、トランジスターのエミッタ−ベース間電圧(Vbe)が、約0.6V以上にならないと、つかえませんし、この分入出力にオフセットを生じます。ちょっとトリッキーですがD1にPICの電源電流を流し、この分を補正するバイアス電圧を発生してます。また、出力が7/8*Vddでは大きすぎるので、DACの動作を乱さないように入力抵抗が3Rになるように作った減衰器で、1/4にしました。

おまけにD1は電池スナップを逆接続した時のU1,U2の保護にもなりますね。Q1はLEDで保護されるようにも見えますが、ちょっと逆耐圧が不足だから、D2で保護してます。エミッタホロワーのコレクター電流(Ic)は、入力電圧に比例する定電流性があります。ですからここにLEDをつなげば、DACの出力に比例する電流を供給できます。

通常LEDなどをデジタル出力でON/OFFするときは、トランジスタを飽和領域でドライブしスイッチとして動作させますが、この回路では、飽和させずに能動域で動作させます。大電力を制御する時は、トランジスタの発熱が大きくなり、この方式は適しませんが、電力が少なければ、電池が消耗しても出力変動が押さえられ、トランジスタのHfeのばらつきの影響も少なくなります。


プログラム

プログラムは、Microchipが提供している、MPLAB環境を使いました。強力なシュミレーターとデバッガーが付属しているので、アセンブラーで割り込みを使ったプログラムにかかわらず、2回の書きこみで動作させることができました。プログラムはここに置きます。

もっと改良すれば、4MHzで動作させられそうですが、取りあえず、8MHz Clockで動作するように作りました。


製作

ここまで行けば、ボール型に組んで見ます。

電池を入れたままごろごろ本当に転がる形にするのは、かなり難しそうなので、大き目のガチャポン(デラックスガチャポン?)のケースに入れ、転がらずに滑るようにしました。360度全周囲に、ほぼ同じ強度に赤外線を放射するのは、複数のLEDを使ったのではかえってむらが出て難しいと考え、乳白色のプラスチックスペーサーを加工して、散光器にしてみました。

広杉計器の乳白色ジュラコン(ポリアセタール)製のスペーサC-415 (OD 8mm, ID 4.2mm,長さ15mm)をドリルで加工し、LEDがはまるように口元をID5mmに広げました。このままだと上方への放射が多く無駄なので、先端にアルミホイルをはりつけて、上に行った光線を反射してもう一度拡散させ、横向きに放射するようにしました。。後は回路を小さくまとめて、ボールに押しこみます。


動作確認

早速動作確認してみましょう。

試験用プログラムをNQCで作りました。受信できた一番弱いMessageにより、高さの違う音を鳴らします。いままでRCXは大きく窓の開いた面が感度が高いと思っていたんですが、違うようです。操作ボタンがついた面が最も感度が高く、約70cm離れた状態で、一番強いMessageを受信しました。


今後の予定

まだ本格的に使用していないのですが、7レベルに受信状況が把握できるようになったので、意外なことがわかりました。RCXのIR Portはパネル面側から受信したときのほうが、黒い窓が大きくついている面より、ずっと高感度なのです。

早速探査ロボットも作ってみたいのですが、それより定量的な指向性を測定したくなってきました。ここ当分遊べそうです (^^;


Message Ball Version 2のページへ

MindStormsの洞窟へ戻る

Google