センサ部

壁を検出するセンサはAD変換機を使った光センサによる距離測定方法、 いわゆるアナログセンサ(アナログ型)と呼ばれているものを使うことに しました。以前作ったマイクロマウスのセンサはすべてウイング型と よばれる壁を上から見るタイプです。こちらの方が一般的に製作しやすく プログラムも楽と言われています。それは、一つのセンサは壁が有るか無いか だけをみていて、それをたくさん並べて壁がどの位置に有るかを検出している からです。センサ一つはONかOFFになります。いわゆるデジタルです。 それに対していわゆるアナログ型は、壁に向かって光をだして反射して 来た光の強さを計ります。光の減衰は距離の二乗に反比例しますから、 戻って来た光の強さで壁までの距離が測定できると言うわけです。 光の強さはフォトトランジスタで受けた光を増幅してADコンバータで デジタル値に変換して使うのが一般的です。測定事体はアナログです。 それがアナログセンサと呼ばれる所以だと思っています。

アナログ回路部分が入ってくると全てデジタルの回路よりは調整部分など も出て来てそれだけ作成が難しくなるというのが相場です。今回は 「ロボコンマガジン No.11 実践マイクロマウス入門講座 第4回光センサユニット」の回路を参考に作成しました。実績のある 回路を元にしているのでそれほど大きなトラブルは無いと思っています。

とは言ってもいきなりマウスに回路を組み込むのは不安なので試作回路を つくりました。今回は専用のADコンバータを使う換わりにPICに内蔵 しているADコンバータを使うことにしました。そのためにPICのソフト開発を 行う回路も兼ねて作成しました。結果的には、OPアンプ増幅率など ちょっといじったので、試作回路を作った意味は十分有りました。ちょっと 手間はかかりましたけど。

試作回路の基板

センサ回路の簡単な説明をします。センサはLEDが東芝のTLN105という 赤外線タイプのものフォトトランジスタがシャープのPT501で、これは ジャンク品として安く大量に買った基板から外したものです。相手として 同じくシャープのLEDがついていたのですが、こちらは別の目的に使って しまってフォトトランジスタだけが沢山残っていたので使ってみました。 最初は東芝のP601というフォトトランジスタを使うつもりだったのですが シャープの物で目的の性能がでたのでこちらを使うことにしました。だから P601でも同じように使えるはずです。

LEDは出力ポートにつながれていてソフトでトランジスタ(D1051)を ONにすることで光らせます。並列に電解コンデンサを入れてここに 貯えた電力で強く光らせるようになっています。D1051は小形で割と 電流が流せるので重宝しています。これもジャンクで大量に手に入れた ものです。

受講側はフォトトランジスタで受けた光を抵抗とコンデンサを使った 簡単なフィルターを通したのちにOPアンプで増幅しています。OPアンプは LC358を使っています。デュアルタイプなので前と左右の3箇所のセンサを つけるためには2つ必要です。4個OPアンプが入った同機能のICもあると 思いますが、安易にロボコンマガジンの記事のものをそのまま使いました。

OPアンプで増幅した信号はそのままPICのADコンバータのついた 入力ピンに入力されます。今回使用したPIC16F876はなぜかADコンバータ を3つ使用する場合連続したポートにはならず、途中で一つ飛んだ並びに なってしまいます。仕様とはいえちょっと使いにくいです。

ADコンバータの出力はPICのポートから単純に出力するようにする 予定です。アドレスバスとデータバスのイメージをポートに持たせて 3つのセンサをアドレスバスで切り替えてデータバスへデータを出力 する形になります。このあたりロジックで回路を組む代わりにPICを使った ことになると思います。 最終版の回路はこのようになりました。これをマウスの前の部分の 基板に全て組み込んで20ピンのコネクタでメイン基板とつなぐ予定です。 このような設計にすることでセンサ部分を独立したブロックとして扱う ことが可能になります。

テスト用のソフトも作成しましたが、LEDを光らせてから、データホールド を行うまでの時間の調整などはやはり2chのシンクロがあると便利と感じました。 とりあえず適等な値を入れて試してみて一番結果がよかったものにしました。

こで基本設計は終わりました。実際にマウス用の基板として製作したものは こんな感じです。

マウスのセンサ基板

回路が完成しましたので、次にPICのソフトを作成する必要があります。 試作回路の基板を使って赤外線LEDを光らせてフォトトランジスタの の値をAD変換する部分は作成しました。その結果をポートから出力する 部分を付け加えればいいわけです。

今回は割り込みをつかわないで、ループ方式にしました。3つのフォトトランジスタ の値を順番に取り込みます。この間隔ですが、最初はAD変換のための時間を 使うだけでどんどん行っていたのですが、それだと、赤外線のLEDはかなり 発熱することが分かりました。遠くまで測定できるように明るく光らせるように かなり大きな電流をLEDに流しているためだと思われます。あまり測定回数を 増やしてもしかたがないし、電池も消耗するだけなので、間にウエイトを いれて約5msで3つのフォトトランジスタの値を取り込む程度にしました。

データは3つのフォトトランジスタの値を2bitで表してそれぞれのアドレスを 指定されたらその値をポートに出すようにしました。AD変換した値は一旦変数に 保存しておいて、データ指定のアドレスを読み取った段階でポートに出力します。 このようにデータ読み取りとAD変換を非同期にすることでメインCPU側は AD変換時間など気にしないでポートを読み取るのと同じ感覚で距離測定の結果を 読み取ることができます。

変数に保存してある値をポートに出力する処理はウエイト処理の間で行うように しました。アドレスポートを読み取ってそれによって3つのどの変数の値を 出力するか決めます。この時にどのアドレスであっても実行する命令数が同じに なるようにダミーの命令を入れて、ウエイト時間が一定になるようにしています。 AD変換している間はこのポートに出力する処理を行わないので、どうしても少し 時間が空いてしまいますが、アドレスが変化してから100μs以内程度でポートに 値が出てくるようになりました。もう少し命令の配置とか工夫すれば短くする ことは可能だと思います。

基板はほぼ完成です。ソフトの改良とかの余地はあるのですが、とりあえずは これで一段落とします。後はLEDやフォトトランジスタの位置の調整などを 行う必要があります。

その後テスト用の冶具(アドレスをDPWで指定、ポートの値をLED表示する)を 作成して調べたところセンサ3セットのうち一つだけ大きく感度が悪いことが 分かりました。まだまだ調整が必要なようです。だだし時間がないので2001年の 大会にはこのままで出場しました。


ホーム 一つ戻る