Raspberry PiでGPIB通信を実現する(4.3.7版)
最初に
過去(https://zenn.dev/peachpie/articles/6b0df7a46add7f)にGPIBの構築方法を記載しましたが、待望の最新版が出たので改訂いたしました。
参考にした記事
以下の投稿を参考にさせていただきました:
ただし、使用しているLinux-GPIBドライバがかなり改訂されており、従来のやり方を大きく変更する必要がありました。
使用した機材
- Raspberry Pi 5
- National Instruments GPIB-USB-HS+
- OSインストール用のPC
- Linux-GPIB ドライバ:https://linux-gpib.sourceforge.io
必要なパッケージのインストール
sudo apt install -y build-essential linux-headers-$(uname -r) libtool autoconf automake pkg-config libusb-1.0-0-dev
Linux-GPIBドライバのビルドとインストール
- SourceForgeからtarファイルをダウンロードします:
cd Downloads
wget -O linux-gpib-latest.tar.gz 'https://sourceforge.net/projects/linux-gpib/files/latest/download'
もしくは直接ダウンロード:
- ダウンロードしたファイルを展開してビルドします:
tar -xvzf linux-gpib-4.3.7.tar.gz
cd linux-gpib-4.3.7
tar -xvzf linux-gpib-karnel-4.3.7.tar.gz.tar.gz
tar -xvzf linux-gpib-user-4.3.7.tar.gz.tar.gz
- カーネルモジュールをビルドします:
cd linux-gpib-kernel-4.3.7
make -j4
sudo rm -rf /lib/modules/`uname -r`/gpib
sudo make install
- ユーザーライブラリのビルドの準備をします:
まずカーネルのバージョンを確認:
uname -r
バージョンが6.13未満であれば以下の手順で実行可能。
バージョンが6.13以上の場合は確認していないので未記載。
もし6.13以上の場合はSourceForgeのREADME.txtを参照。
ユーザーライブラリをカレントディレクトリに:
cd ..
cd linux-gpib-user-4.3.7
不必要なエラーをサイレントにします。
この手順は実行しなくとも動作しますが、invalid descriptorというエラーがうるさいので非表示にしておくことを推奨します。動作には影響しないので問題はありません。
nano ./lib/ibutil.c
233行目を以下のようにコメントアウトします:
// fprintf(stderr, "libgpib: invalid descriptor\n");
- ユーザーライブラリのビルドをします:
./bootstrap
./configure --sysconfdir=/etc
make
sudo make install
GPIB設定ファイルの編集
sudo nano /etc/gpib.conf
設定ファイルの内容を書き換えます(GPIB-USB-HS+の場合):
interface {
minor = 0
board_type = "ni_usb_b"
pad = 0
sad = 0
master = yes
}
注意: 他の製品を使用する場合は、対応ハードウェア一覧を参考に設定を変更してください。メーカーや製品により設定が異なるため、注意事項もよく読んでください。
ドライバの読み込みと確認
sudo depmod -a
sudo modprobe ni_usb_gpib
sudo ldconfig
sudo gpib_config
インストールが正常に完了したか確認します:
lsmod | grep gpib
GPIBモジュールが表示されれば、インストール成功です。
動作確認
ibtestコマンドで動作確認を行います:
sudo ibtest
以下の手順で機器との通信をテストします:
-
dを入力 -
1(機器のアドレス。今回は1でした)を入力 -
wを入力 -
*IDN?を入力 -
rを入力 -
100を入力
機器の情報が表示されれば、正常に動作しています。
Python環境の設定
Python開発環境をセットアップします:
sudo apt-get install python3-dev python3-pip python3-setuptools
Python用GPIBライブラリをインストールします:
cd linux-gpib-user-4.3.7
cd language/python/
sudo python3 setup.py install
PyVISAのインストール
GPIBモジュールの実行にはsudo権限が必要なので、システム全体にインストールします:
sudo apt-get install python3-pyvisa python3-zeroconf
サンプルプログラムの実行
以下のPythonプログラムで動作確認を行います。任意の場所にtest.pyを作成します:
nano test.py
import pyvisa
rm = pyvisa.ResourceManager()
devs = rm.list_resources()
print("機器一覧:", devs)
num = int(input("接続したい機器の番号を入力してください:"))
inst = rm.open_resource(devs[num])
print("IDN:", inst.query("*IDN?"))
inst.close()
プログラムを実行します:
sudo python3 test.py
GPIBモジュールの実行にはsudo権限が必要なのでsudoが必要です。
IDNコマンドの応答が正常に表示されれば、設定完了です!
gpibに管理者権限を与える
以上でGPIBモジュールは動作するのですが、毎回sudoを実行するのは些か面倒です。
そこで以下のように変更します。
ls -l /dev/gpib*
crw------- 1 root root 216, 0 10月 21 16:00 /dev/gpib0のような表示が出ると思います。
root rootというのは管理者権限のことを指すので、これを変更します。
グループ作成&一時的に権限付与:
sudo groupadd gpib
sudo chgrp gpib /dev/gpib*
sudo chmod 660 /dev/gpib*
sudo usermod -aG gpib $USER
恒久化(udev ルール)してルール再読み込み&適用:
sudo nano /etc/udev/rules.d/99-gpib.rules
KERNEL=="gpib[0-9]*", GROUP="gpib", MODE="0660"
sudo udevadm control --reload-rules
sudo udevadm trigger
再起動します:
sudo reboot
チェック:
ls -l /dev/gpib*
crw-rw---- 1 root gpib ... /dev/gpib0 のように表示されたら成功です。
補足:NIVISAについて
「NIVISAはLinux対応なので、それを使えばもっと簡単にVISAが使えるのでは?」と考える方もいらっしゃるかもしれません。(私がそうでした)
実際に試してみましたが、NIVISAはArm64アーキテクチャに対応していません。UbuntuをインストールしてもArmプロセッサでは動作しないため、Raspberry Piで使用するには今回紹介した方法が必要になります。
まとめ
Raspberry PiでGPIB通信を実現する手順を記載しました。4.3.7は待望のアップデートであり、昔の手順よりも簡素化できており、また公式でカーネルのアップデートにも対応する方針が取られたことを喜ばしく思います。
Discussion