超簡単高速USB-GPIBアダプタ

USB内蔵のAVRマイコンを使えば、GPIBをUSBに変換するアダプタは比較的簡単に作ることができる。 USBを内蔵していないAVRマイコンでも、V-USBというプロジェクトを使えば 同様のことは実現できるが、V-USBはUSB1.1のlow speedモードしか使えない。 USB内蔵のAVRマイコンではfull speedでの動作が可能である。

ここではストロベリーリナックスから販売されている、AT90USB162ボードを使って作成してみた。 このボードはUSBコネクタの付いたボードにUSBスタック内蔵のAVRマイコンと周辺回路が載った物で、 ブートローダー内蔵だからライター不要な上に、PORTBとPORTDあわせて16ポートがまるまる使用可能である。 しかもUSBのバスパワーのみで動作する。 このボードは人気があるらしく、いまだに(2013年5月現在)販売されている。

制作は非常に簡単で、GPIBコネクタを調達してAT90USB162のPORTBを8本の制御ラインに、PORTDを 8本のデータラインに、GNDをまとめてGNDに半田付けするだけである。 GPIBの規格ではHighレベルは3.3V程度であるので、AT90USB162の電源電圧は3.3Vに設定した。 (本来は6.2kΩと3kΩの抵抗で終端してオープンコレクタで繋ぐべきなのだろうが、3.3VのCMOS出力なら 問題ないと考えた。反射が気になる場合は終端すべき。)



写真の結線は以下のようになっている。

PB0 - REN
PB1 - EOI
PB2 - DAV
PB3 - NRFD
PB4 - NDAC
PB5 - IFC
PB6 - SRQ
PB7 - ATN
PD0 - DIO1
PD1 - DIO2
PD2 - DIO3
PD3 - DIO4
PD4 - DIO5
PD5 - DIO6
PD6 - DIO7
PD7 - DIO8

GPIBのコネクタの端子間は狭いので、接触しないように熱収縮チューブなどで絶縁しておくとよい。 GPIBのプロトコルは検索すればあちこちで見つかる。気をつけることは、ラインの初期状態がすべて Highレベルであること。リスナが指定されるか、あるいはATNがLowになると受信側のNDACがLowになる。 これがデータ転送の初期状態である。あと、データが負論理(Lowが1)であることにも注意する。
以下にプログラム例を示す。
AVR側はLUFAライブラリ(ver151115)を使った。 以下のUSBGPIB2.zipを展開し、makefile中のLUFAディレクトリを変更してコンパイルする。

USBGPIB2.zip

コンパイル済みのHEXファイルはここに置いておく。これをFLIPを使って書き込むだけでもよい。
PC側のプログラム例(MinGW用)は以下に示す。

gpserial.c
gpserial.h
TDS520.c

細かい点はプログラムを参照して欲しい。
手元のTDS520というデジタルオシロで試したところ、バイナリ転送で100kB/sは出ていた。計測用途なら十分実用になりそうだ。
full-speedの12Mbpsを考えるとまだまだ遅いが、これはAT90USB162ではSRAMが少なくてバッファサイズが大きく取れないためだと 思われる。
もっと速くしたい場合は、バッファの大きく取れるATmega32U4あたりを使うとよいだろう。

-------------
AT90USB162のチップは秋月で300円程度で手にはいるし、 変換基板は100円で売っている。これにUSBコネクタ(50円)と、 周辺部品を加えれば1000円程度で制作することも可能である。 GPIBコネクタの入手性が悪いが、これは中古のGPIBケーブルを途中で切って直接ポートにつなげることでもなんとかなる。 今回は余っていた中継アダプタを割って使った。