Linux から LAN/USB/Serial/GPIB をインターフェースとして、
VISA/SCPI で機器制御を行うためのメモ。
今回は試した周りの環境・制約から OS はUbuntu。
以前は NIVISA を使って C/C++ でコーディング的なことをした気もするが、
NIVISA Linux版 は辛うじて v17 が iso 直リンクでアクセスできるものの、
それ以降は更新されていません。(Windows版は現時点でv19.5 が公開されている)
今回は言語環境も勢いのある python から
NIVISA に依存せずに機器制御を行えるようにする。
Contents
基本環境作り
python で専用の環境を作っておく。
python は anaconda を使っているので、
1 2 |
conda -n gpibTest python=x.x.x source activate gpibTest |
この環境に色々突っ込んでいく。
1 2 |
pip install pyvisa pip install pyvisa-py |
pyvisa は python の VISA フロントエンド。
上記のNIVISAを扱うこともできるが、
今回は pyvisa-py をバックエンドとして用いる。
pyvisa-py は Serial/USB/TCPIP(LAN)/GPIB をインタフェースとして扱えるが、
実際に通信を行うには、各インタフェース毎に多少の設定なり準備が必要になる。
オプションで、この仮想環境を jupyter で使いたいなら、
1 |
ipython kernel install --user —name=gpibTest --display-name=gpibTest |
とかすると、
jupyter kernelspec list で環境がインストールされているのが確認できる。
あとはブラウザの画面で Kernel -> Change Kernel から
display-name で設定した名前の kernel を選べば、
import visa などが通るようになる。
GPIB による制御
今回は Agilent(Keysight) 8508A Vector Voltmeter を、
Agilent 82357B (USB-GPIB インタフェース) を用いて制御する。
まずは、lsusb で上記が見えていることを確認。
linux-gpib
linux kernel 5.3 でも動く最新の 4.3.0 をダウンロード。
適当に展開して、中身の kernel, user ビルド、インストール。
前者は kernel module, 後者は gpib_config など。
"user" は
./configure —sysconfdir=/etc とかしておくと、
後で gpib_config が /etc/gpib.conf を見に行ってくれる。
私はテスト時にこれを省略したため、/usr/local/etc 下を見に行っていて、
気づくまで少し時間が掛かった。
作業ログに、/usr/local/lib/libgpib.so.0 に向かって /lib からリンクを貼れと書いてある。
恐らく共通アカウントの LD_LIBRARY_PATH に /usr/local/lib が入っておらず、
gpib_conf が同ライブラリを見つけられなかったのだろう。
firmware binary
古いが最新の gpib_firmware-2008-08-10.tar.gz をダウンロード, 展開するだけ。
後述の fxload でロードする firmware binary。
fxload
これもダウンロードして、適当にビルド。
load kernel modules
/lib/modules/[kernel version]/gpib 下にある。
その場所まで行って、
1 2 3 |
sudo depmod sudo modprove gpib_common sudo modprove agilent_82357a |
/etc/gpib.conf
コレ をそのまま使わせてもらった。
gpib周りの仕上げ
1 2 |
sudo chmod 666 /dev/gpib0 gpib_config |
/etc/gpib.conf を見に行かせる、libgpib を見つけさせるのは前述の通り。
Agilent 82357b を認識させる
82357b を刺す。
この時点では赤の "FAIL" LED が点灯している。
lsusb をして busID, deviceID を調べる
(ex: Bus 002 Device 005: ID 0957:0518 Agilent Technologies, Inc.)
上記の busID, deviceID を指定して、先程用意した binary firmware を fxload する。
sudo fxload -D /dev/bus/usb/002/005 -t fx2 -I path/to/firmware/measat_releaseX1.8.hex
この時点でまだ "FAIL" は点いたまま。
もう一度 lsusb をして busID, deviceID を調べる。
(大体 deviceID が一つ増えている模様)
(ex: Bus 002 Device 006: ID 0957:0518 Agilent Technologies, Inc.)
sudo fxload -D /dev/bus/usb/002/006 -t fx2 -I path/to/firmware/measat_releaseX1.8.hex
これで、緑の "READY" LED のみが点灯するはず。
簡易テスト
GPIB 周りの確認
ibtest と打って, "d, [address]" とか続けて機器とやりとりできているか確認。
コケたら GPIB 周りのセットアップに失敗。
pyVISA 周りの確認
pyvisa-info と打って、Backends: -> py: -> "GPIB INSTR" の出力を見る。
"Available via Linux GPIB" とかなってたら成功。
"No module named ‘gpib’" とかなってたら失敗。
私は最初試した時に後者になった。
libgpib 関連が /usr/local/pythonx.x/site-packages/ 以下にできていたのが原因。
ビルド時に anaconda の仮想環境外になっていたのかもしれない。
私は python のバージョンも近く、面倒だったので、
/usr/local/pythonx.x/site-packages/ 下の
Gpib.py, gpib.cpython~.so, gpib~.egg-info に向かって、
anaconda/env/[env-name]/lib/pythonx.x/site-packages/下からリンクを貼った。
python で動作確認
1 2 3 4 5 |
import visa rm=visa.ResourceManager('@py') print(rm.list_resources()) ... inst=rm.open_resource('GPIB0::X::INSTR') |
みたいな感じで、GPIB経由で機器をハンドルできるようになる。
参考
- https://gist.github.com/turingbirds/6eb05c9267a6437183a9567700e8581a
- http://ici1974.blogspot.com/2016/08/agilent82357b-part-3.html
USB による制御
上記 GPIB を使えるようになっている状態でも、
pyvisa-info の Backends: -> py: -> USB INSTR の項をみると、
pyUSBを入れろとかになっていて、USB経由ではハンドルできない。
上とは別の機会に、Agilent 33461A に USB でアクセスした時の追記。
pyUSB を追加
1 2 |
conda activate gpibTest pip install pyusb |
USBの権限を修正
この時点で pyVISA から list_resources() とかしても、
以下のような警告が出て、見つけてはいても正しく認識されない。
Found a device whose serial number cannot be read.
The partial VISA resource name is: USB0::xxxx::xxxx::???::0::INSTR
結論からいうと、USBアクセスの権限が足りないためのようで、
以下のスクリプトを実行すると治る。
1 |
wget https://techoverflow.net/scripts/udev-install-usbusers.sh | sudo bash -s $USER |
スクリプトの中を書き下すと、以下のようなことをやっている。
1 2 3 4 5 6 7 8 |
sudo groupadd usbusers sudo usermod -a -G usbusers $USER >> /etc/udev/rules.d/99-xxxx.rules SUBSYSTEM==“usb”, MODE=“0666”, GROUP=“usbusers” sudo udevadm control —reload sudo udevadm trigger |
私は、/etc/udev/rules.d/99-ni_usb_gpib.rules というファイルがあったので、
これに自分で書き加えました。
これで list_resources() で正しい名前が表示されて、
open_resource([name]) で機器にアクセスできるようになる。
もし駄目だったら、sudo service udev restart とかしてもいいかもしれない。
参考
- https://techoverflow.net/2019/08/09/how-to-fix-pyvisa-found-a-device-whose-serial-number-cannot-be-read-the-partial-visa-resource-name-is-usb0-0instr/
- https://techoverflow.net/2019/08/09/how-to-fix-all-usb-permission-issues-on-linux-once-and-for-all/
- https://stackoverflow.com/questions/52256123/unable-to-get-full-visa-address-that-includes-the-serial-number