2010年9月26日日曜日

ArduinoでGPIB・イーサネットアダプタ

また「イーサネットアダプタ」ですw

計測機器には、GPIBコネクタのついてるものが結構あります。

そうなりゃ当然、このコネクタを介して計算機から計測器を制御して、測定を自動化してやろう、
という野望も湧いてくる、ってもんです(私の場合は、それが仕事の1つなんですが)。

ですが、GPIBインタ-フェイスカードが引くくらい高い
※GPIBの場合、ケーブルも高くて二重苦です。


というわけで、ArduinoでGPIBインターフェイスを自作してみることにしました。
ついでにEthernet ShieldでLANに載せてみます。

GPIBは、3線式ハンドシェイクによるパラレルバスで、信号は負論理のTTLレベルです。
なので、前回のRS-232Cのようなレベル変換回路は不必要で、Arduinoに直結できます。

ラインの本数ですが、バス管理ラインも含めると全部で16本のラインがあります。
DIO1-8, NRFD, DAV, NDAC, ATN, EOI, IFC, REN, SRQGND含めると計17本)

Arduinoで使えるピン数は、digitalが14本、analog(digitalとしても利用可)が6本の計20本。

「余裕じゃん」と思ったのですが、Ethernet Shield使うのでSPIのためにdigital10-13の4本は
開けておかなければなりません。 また、シリアル用のdigital0・1も開けておかないと、
デバックでしんどいことになります。

すると、使えるピン数は14本、と足りなくなってしまいました。

SRQは、バスに接続された機器から(用紙切れや機器異常の)サービス要求を
バスコントローラへアサートするラインですが、この機能を使わないことにします。

またRENは、接続された機器の操作モードをリモート/ローカルに切り替えるためのラインですが、
LOWに落としておけば常時リモートなので、今回は使わないことにします。

これでなんとかピン数が足りました。


以下が、今回書いたスケッチです。
MACアドレスとかIPアドレスは伏せ字にしてあります。



ピンアサインは全部digitalで使ってるので適当です。
多分、どこに繋いでも動くと思います。

メイン部分のやってることは単純で、setupでサーバ立てて、loopでリスンして、
クライアントからのコマンド文字列を解釈して、GPIBへ流してるだけです。

コマンド文字列のデリミタはセミコロン(;)です。

バス管理コマンドとして、「IFC」と「DCL」を実装しています。
また、アドレス指定デバイスクリアコマンドとして「C(アドレス)」も実装しています。

リモート/ローカル関連のコマンドは、RENが常時GNDなので実装しませんでした。
また、トリガーコマンドも未実装です(私個人が使わないので)。

ポール関連コマンドもSRQライン使ってないので未実装です。

おまけとして、ライン状態を取得する「STA」コマンドを実装しておきました。

GPIB接続された機器とのコマンドのやりとりは、
コマンド送信が「W(リスナアドレス)=(コマンド文字列)」、
リプライ受信が「R(トーカアドレス)」となっています。

このコマンドインタープリタ部分は、かなり適当に書いたので、
ちょっとしたエラーで簡単にハングアップしますw
実用するには、もっと真面目に書かないといけないでしょう。

GPIB関連の処理は、面倒くさかったので、ライブラリにせずにベタ書きにしました。
また、C++忘れたので、クラスにもしませんでしたw。

簡単に解説すると、

set_dio(), get_dio()が、DIO1-8へのバイト書き込みと読み出しです。

gpibWrite(), gpibRead()が、 3線式ハンドシェイクを行いながら、
トーカ・リスナ間で1バイトのデータ送受信を行う関数です。

gpibTalk(), gpibListen()が、上記関数を使って、GPIBコマンドを
送受信する関数です。
簡単に実装するために、複数のリスナアドレス指定はできないようになっています。

各ステップに入っているウェイトは適当です。なくても動くかも知れません(動かないかも知れませんが)。
GPIBコマンドのデリミタは「CR+LF」に決め打ちしています。


スケッチ書けたので、実際に機器繋いでテストです。

高いケーブルを覚悟決めてエイヤっとぶった切って、切ったほうはハンダ上げします。
DIO1-8以外のラインには専用のGNDラインがあるのですが、全部まとめて1本にします。

※コネクタ形状が、セントロニクスフルピッチ24ピンと同じなので、
※そのケーブルがあれば良かったのですが、手元にありませんでした。

テスト用に、使っていない計測機器を集めてきて、全部を接続します。


後ろからでわかりにくいですが、
上のほうがエレクトロメータ(KEITHLEY 6514)、
下がプログラマブル電流アンプ(KEITHLEY 428-PROG)です。

これらは、フロントパネルの16セグにテキストメッセージを表示させることができますので、


こんなこともできますw

ちなみに、このために送ったコマンドは、



こんな感じです。



ArduinoでのGPIB制御は、ネット上に実装例は未だに無く(探した限りでは)、
Playgroundにも情報がありません(フォーラムでの質問はありましたが…)。

また、GPIBコンバータもRS-232Cのものは、ネット上に回路やキットの情報があるのですが、
イーサネットのはなかなか見当たりません。

この投稿が、誰かの役に立てば幸いです(損害や不利益は関知しませんがw)。

あと、ありえないとは思いますが、このまま商品化とかしないようにw
出来のイイ似たものが既に市販されてますからw

1 件のコメント:

  1. はじめまして。

    ArduinoでのGPIBの実現のコード大変参考になりました。こちらもAVRでも試してみたのですが、FT2232Dで同じような実装を行い動作するようになりました。まだプロトタイプですが、FTでのコードは以下にアップしてあります。ありがとうございました。

    http://ubsa-osx.svn.sourceforge.net/viewvc/ubsa-osx/Monkey/ftgpib.c?view=log

    返信削除