計測機器には、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, SRQ、GND含めると計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
はじめまして。
返信削除ArduinoでのGPIBの実現のコード大変参考になりました。こちらもAVRでも試してみたのですが、FT2232Dで同じような実装を行い動作するようになりました。まだプロトタイプですが、FTでのコードは以下にアップしてあります。ありがとうございました。
http://ubsa-osx.svn.sourceforge.net/viewvc/ubsa-osx/Monkey/ftgpib.c?view=log