CULBバナナでもワニでもありません.GoogleAnalyticsSyntaxHighlighter2010年9月26日日曜日ArduinoでGPIB・イーサネットアダプタまた「イーサネットアダプタ」ですw計測機器には、GPIBコネクタのついてるものが結構あります。なりゃ当然、このコネクタを介して計算機から計測器を制御して、測定を自動化してやろう、という野望も湧いてくる、ってもんです(私の場合は、それが仕事の1つなんですが)。GPIBインタ-フェイスカードが引くくらい高い。※GPIBの場合、ケーブルも高くて二重苦です。いうわけで、ArduinoでGPIBインターフェイスを自作してみることにしました。ShieldでLANに載せてみます。GPIBは、3線式ハンドシェイクによるパラレルバスで、信号は負論理のTTLレベルです。前回のRS-232Cのようなレベル変換回路は不必要で、Arduinoに直結できます。ラインの本数ですが、バス管理ラインも含めると全部で16本のラインがあります。SRQ、GND含めると計17本)Arduinoで使えるピン数は、digitalが14本、analog(digitalとしても利用可)が6本の計20本。Shield使うのでSPIのためにdigital10-13の4本は開けておかなければなりません。シリアル用のdigital0・1も開けておかないと、デバックでしんどいことになります。すると、使えるピン数は14本、と足りなくなってしまいました。SRQは、バスに接続された機器から(用紙切れや機器異常の)サービス要求をバスコントローラへアサートするラインですが、この機能を使わないことにします。RENは、接続された機器の操作モードをリモート/ローカルに切り替えるためのラインですが、LOWに落としておけば常時リモートなので、今回は使わないことにします。これでなんとかピン数が足りました。以下が、今回書いたスケッチです。MACアドレスとかIPアドレスは伏せ字にしてあります。delayMicroseconds(20);}ピンアサインは全部digitalで使ってるので適当です。どこに繋いでも動くと思います。メイン部分のやってることは単純で、setupでサーバ立てて、loopでリスンして、クライアントからのコマンド文字列を解釈して、GPIBへ流してるだけです。コマンド文字列のデリミタはセミコロン(;)です。バス管理コマンドとして、「IFC」と「DCL」を実装しています。アドレス指定デバイスクリアコマンドとして「C(アドレス)」も実装しています。リモート/ローカル関連のコマンドは、RENが常時GNDなので実装しませんでした。トリガーコマンドも未実装です(私個人が使わないので)。ポール関連コマンドもSRQライン使ってないので未実装です。おまけとして、ライン状態を取得する「STA」コマンドを実装しておきました。GPIB接続された機器とのコマンドのやりとりは、コマンド送信が「W(リスナアドレス)=(コマンド文字列)」、リプライ受信が「R(トーカアドレス)」となっています。このコマンドインタープリタ部分は、かなり適当に書いたので、ちょっとしたエラーで簡単にハングアップしますw実用するには、もっと真面目に書かないといけないでしょう。GPIB関連の処理は、面倒くさかったので、ライブラリにせずにベタ書きにしました。C++忘れたので、クラスにもしませんでしたw。get_dio()が、DIO1-8へのバイト書き込みと読み出しです。3線式ハンドシェイクを行いながら、トーカ・リスナ間で1バイトのデータ送受信を行う関数です。gpibListen()が、上記関数を使って、GPIBコマンドを送受信する関数です。簡単に実装するために、複数のリスナアドレス指定はできないようになっています。各ステップに入っているウェイトは適当です。なくても動くかも知れません(動かないかも知れませんが)。GPIBコマンドのデリミタは「CR+LF」に決め打ちしています。スケッチ書けたので、実際に機器繋いでテストです。高いケーブルを覚悟決めてエイヤっとぶった切って、切ったほうはハンダ上げします。DIO1-8以外のラインには専用のGNDラインがあるのですが、全部まとめて1本にします。※そのケーブルがあれば良かったのですが、手元にありませんでした。テスト用に、使っていない計測機器を集めてきて、全部を接続します。428-PROG)です。これらは、フロントパネルの16セグにテキストメッセージを表示させることができますので、こんなこともできますwちなみに、このために送ったコマンドは、こんな感じです。ArduinoでのGPIB制御は、ネット上に実装例は未だに無く(探した限りでは)、Playgroundにも情報がありません(フォーラムでの質問はありましたが...)。GPIBコンバータもRS-232Cのものは、ネット上に回路やキットの情報があるのですが、イーサネットのはなかなか見当たりません。この投稿が、誰かの役に立てば幸いです(損害や不利益は関知しませんがw)。さんのコメント...はじめまして。ArduinoでのGPIBの実現のコード大変参考になりました。こちらもAVRでも試してみたのですが、FT2232Dで同じような実装を行い動作するようになりました。プロトタイプですが、FTでのコードは以下にアップしてあります。ありがとうございました。Adsense社による広告配信のために、Cookieやウェブビーコンを使用したデータ収集をおこなっています。ブラウザのCookie機能をオフにすることで、第三者へのデータ送信をおこなわせないことが可能です。詳しくは、Adsense広告の公式プライバシーポリシーをご覧ください。http://www.google.com/intl/ja/privacy.html本ブログで紹介したプログラム等による不利益等は一切関知いたしません。