🎉

Raspberry PiでGPIB通信を実現する(4.3.7版)

に公開

最初に

過去(https://zenn.dev/peachpie/articles/6b0df7a46add7f)にGPIBの構築方法を記載しましたが、待望の最新版が出たので改訂いたしました。

参考にした記事

以下の投稿を参考にさせていただきました:

ただし、使用しているLinux-GPIBドライバがかなり改訂されており、従来のやり方を大きく変更する必要がありました。

使用した機材

必要なパッケージのインストール

sudo apt install -y build-essential linux-headers-$(uname -r) libtool autoconf automake pkg-config libusb-1.0-0-dev

Linux-GPIBドライバのビルドとインストール

  1. SourceForgeからtarファイルをダウンロードします:
cd Downloads
wget -O linux-gpib-latest.tar.gz 'https://sourceforge.net/projects/linux-gpib/files/latest/download'

もしくは直接ダウンロード:

https://sourceforge.net/projects/linux-gpib/files/linux-gpib for 3.x.x and 2.6.x kernels/4.3.7/

  1. ダウンロードしたファイルを展開してビルドします:
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
  1. カーネルモジュールをビルドします:
cd linux-gpib-kernel-4.3.7
make -j4
sudo rm -rf /lib/modules/`uname -r`/gpib
sudo make install
  1. ユーザーライブラリのビルドの準備をします:

まずカーネルのバージョンを確認:

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");
  1. ユーザーライブラリのビルドをします:
./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

以下の手順で機器との通信をテストします:

  1. d を入力
  2. 1(機器のアドレス。今回は1でした)を入力
  3. w を入力
  4. *IDN? を入力
  5. r を入力
  6. 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