linux-gpib の設定メモ: PythonでGPIB機器を制御するための環境構築


新しい実験*1を行うために、新しくLinux Boxを実験機器制御用に設定する必要が出てきた. 昨年の夏にlinu-gpibをインストールした方法*2を書いたのだが、改めてその手順に従ってインストール作業をしてみたものの、これがどういうわけか上手く認識されない. というわけで新たに修正版のメモをここに書いておく.

準備したもの

linux-gpibのダウンロード

linux-gpibのソースをダウンロードする. Fedora Core 4は2.6系カーネルなので, linux-gpibは3.2系のバージョンを使わなくてはならない (linux-2.6.8以降).

Linuxカーネルについて気づいたこと

linux-gpibをインストールするには、現在起動している(正確には、linux-gpibを走らせるときに使う)カーネルのソースツリーが必要になる.

linux-gpibをuntarした中にあるREADMEによると、linux-gpibをコンパイルするGCCのバージョンは、利用しているカーネルコンパイルしたGCCのバージョンと一致しなくてはいけないようである. 実は、この辺を無視していて一通りのインストール作業が終わったあとで右往左往(=立ち往生)する羽目になった.


また、カーネルの再構築の手順は、例えばここ↓によくまとまっている.
http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html

インストール

手順は以下. configureのオプションに, Pythonを使うためのオプションと、Linuxソースの位置を明示的に指定した.

# cd /usr/local/src
# tar zxvf linux-gpib-3.2.05.tar.gz
# cd /usr/local/src/linux-gpib-3.2.05
# ./configure --with-linux-srcdir=/usr/src/linux-2.6.xx --enable-python-binding
# make
# make install

/etc/ld.so.confの編集

Linux-GPIB Package の shared library が読み込まれるように、 /etc/ld.so.conf を編集する. 以下のように /etc/ld.so.conf に /usr/local/lib を追記した.

(etc/ld.so.conf)
/usr/local/lib

/etc/groupの編集

/deb/gpib*を利用できるように, gpibグループへGPIBを利用するユーザを登録する.

gpib:x:501:sei, shiguchi

firmwareのインストール

NI-USB-Bを利用する為には、ベンダーから提供されているファームウェアをインストール(コピー)しておく必要がある:

上記Webサイトからダウンロード, untarしたものの中の, *.hex (ファームウェア) /usr/share/usb/ni_usb_b/ へコピーする.

# tar xvzf gpib_firmware-2005-09-06.tar.gz
# cp gpib_firmware-2005-09-06/ni_gpib_usb_b/*.hex  /usr/share/usb/ni_usb_gpib/

/etc/modprobe.confの編集

以下のような3行を/etc/modprobe.confへ追記.

alias char-major-160 gpib_common
alias char-major-160-0 ni_usb_gpib
alias gpib0 ni_usb_gpib

/etc/gpib.confの編集

最後に、/etc/gpib.confを編集. かなりの説明をはしょっています...

interface {
        minor = 0
        board_type = "ni_usb_b"       # ドライバ名
        name = "ni-usb-b"
        pad = 0                       # /dev/gpib0 を利用. 1なら/dev/gpib1
        sad = 0
        timeout = T3s
        eos = 0x0a
        set-reos = yes
        set-bin = no
        set-xeos = no
        set-eot = yes
        master = yes
}

device {
        minor = 0
        name = "laserctrl"            # 接続する機器の名称(なんでもよい)
        pad = 1                       # 接続する機器のID
        sad = 0
}

device {
       minor = 0
       name = "agilent_multimeter"
       pad  = 10
       sad  = 0
}

再起動して接続テスト

ここで一度再起動. そして, # gpib_conf とrootで打つ. # dmesgで以下のような具合のメッセージが表示されると上手く認識されている. ついでに, # lsmod で gpib_commonとni_usb_gpibがしっかりロードされているかどうか調べる.

実際には、gpib_configの前に、modprobeを実行して

# modprobe gpib_common
# modprobe ni_usb_gpib
# gpib_config

と手動でドライバをロードする必要があるかもしれない. 半年前に導入したときには (FC-3, linux-2.6.10, linux-gpib-3.2.03)この必要はなかったのだが、今回導入したマシンには, modprobeを打たないとUSB-GPIBモジュールのLEDが点灯しない(認識されない).

(dmesg)
Linux-GPIB 3.2.05 Driver -- Kernel Release 2.6.12-1.1398_FC4
/usr/src/linux-gpib-3.2.05/driver/ni_usb/ni_usb_gpib.c: ni_usb_gpib driver loading
probe succeeded for path: usb-0000:00:1d.0-1
usbcore: registered new driver ni_usb_gpib
gpib: registered ni_usb_b interface
attached to bus interface 0, address 0xf6f02080
(lsmod)
ni_usb_gpib            26368  0 
gpib_common            38852  1 ni_usb_gpib

Pythonから制御してみる

最後にPythonでプログラムを書いて、動作するかどうかを確認して完了とする. GPIB機器のコマンドはそれぞれのマニュアルを参照しなくてはならない.

#! /usr/bin/env python

import Gpib
mmeter = Gpib.Gpib("agilent_multimeter")  # デバイスを定義. 引数は/etc/gpib.conf内で定義したデバイスのnameに一致させる.
mmeter.write("MEAS:VOLT:DC?")             # 電圧はいくら? 
print mmeter.read()                       # 計測した値を返す.

Laser Diode Controller (ILX LDC-3714)の動作はまだ未確認なので、でき次第編集する予定.

(2/8追記) そして、これがLDC-3714動作テスト用のPYTHONコード. GPIBのコマンドはマニュアルの4章 (http://www.ilxlightwave.com/manuals/laser_diode_controller_LDC-3700B_manual.pdf) からランダムに選択した.

#! /usr/bin/env python

import Gpib

LDC = Gpib.Gpib("lasercontroller")       # ILX LDC-3714

LDC.write("TEC:OUT?");
LDC.read();

LDC.write("ERR?")
LDC.read()

LDC.write("LAS:TOL?");
LDC.read()

2/8/06 追記

FC-4 + linux-gpib-3.2.05 で設定をしたのだが、再起動するとGPIBモジュールが認識されない(firmwareがアップロードされない)ことが起こり、復旧できなくなったため、半年前に導入したときと同じ構成 (FC-3, linux-2.6.10, linux-gpib-3.2.03)に変更して再設定した. 3.2.03の方がすんなり動く感がある.


また、/dev/gpib* のパーミッションはgpib_configを実行した場合に、適切に設定がなされるのであるが、あやふや. セキュリティと相談する必要はあるのだが、Linuxを再起動するたびにchmodをしたくはないので, /etc/rc.localに以下のように記述している.

chmod 666 /dev/gpib*