Raspberry PiでGPIB通信を実現する
最初に
Zennに書くのは初めてなので、不備がありましたら申し訳ございません。
計測器との通信では、USBとの接続情報は多く見つかりますが、GPIBについてはかなり難航したので、同じ課題に直面する方の役に立てれば幸いです。
参考にした記事
以下の投稿を参考にさせていただきました:
ただし、使用しているLinux-GPIBドライバがかなり改訂されており、従来のやり方を大きく変更する必要がありました。
使用した機材
- Raspberry Pi 5
- National Instruments GPIB-USB-HS+
- OSインストール用のPC
- Linux-GPIB ドライバ:https://linux-gpib.sourceforge.io
古いOSのインストールが必要な理由
使用予定のドライバのソースコードを確認すると、SourceForgeで4.3.7のファイルは存在しますが中身が空で、実質的に最新版は4.3.6となっています。
このバージョンはカーネルの互換性の関係で最新のRaspberry Pi OSでは動作しないため、古いOSのインストールが必要です。
Raspberry Pi Imagerで古いOSをインストール
-
他のPCで、Raspberry Piの公式インデックスから2024/10/22のバージョンをダウンロードします:
https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2024-10-28/ -
Raspberry Pi Imagerをインストールします:
https://www.raspberrypi.com/software/ -
Imagerの下部にある「カスタムイメージを使用」から、ダウンロードしたファームウェアをMicroSDに書き込みます。
-
MicroSDをRaspberry Piに挿入し、電源を接続して起動します。
重要な注意事項
以下からRaspberry Piでの操作になりますが、古いOSを使用する際は、絶対にsudo apt update
を実行しないでください。OSもアップグレードされてしまい、最初からやり直しになります。システムからアップデートを求められた場合も同様に無視してください。
必要なパッケージのインストール
sudo apt install -y build-essential linux-headers-$(uname -r) libtool autoconf automake libusb-dev libgpib-dev dkms
Linux-GPIBドライバのビルドとインストール
- SourceForgeからtarファイルをダウンロードします:
wget https://sourceforge.net/projects/linux-gpib/files/latest/download
もしくは直接ダウンロード:
- ダウンロードしたファイルを展開してビルドします:
cd Downloads
tar -xvzf linux-gpib-4.3.6.tar.gz
cd linux-gpib-4.3.6
tar -xvzf *.tar.gz
- カーネルモジュールをビルドします:
cd linux-gpib-kernel-4.3.6
make
sudo make install
- ユーザーライブラリをビルドします:
cd ..
cd linux-gpib-user-4.3.6
./bootstrap
./configure --sysconfdir=/etc
make
sudo make install
GPIB設定ファイルの編集
sudo cp util/templates/gpib.conf /etc/gpib.conf
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 gpib_common
sudo ldconfig
sudo gpib_config
インストールが正常に完了したか確認します:
lsmod | grep gpib
GPIBモジュールが表示されれば、インストール成功です。
動作確認
ibtest
コマンドで動作確認を行います:
ibtest
以下の手順で機器との通信をテストします:
-
d
を入力 -
1
(機器のアドレス。今回は1でした)を入力 -
w
を入力 -
*IDN?
を入力 -
r
を入力 -
100
を入力
機器の情報が表示されれば、正常に動作しています。
再起動時に自動ロードする
このままでは再起動するたびにmodprobe
しなければならないので、自動起動するようにします。
echo "gpib_common" | sudo tee -a /etc/modules
Python環境の設定
Python開発環境をセットアップします:
sudo apt-get install python3-dev python3-distutils python3-pip python3-setuptools
Python用GPIBライブラリをインストールします:
cd linux-gpib-user-4.3.6
cd language/python/
sudo python3 setup.py install
PyVISAのインストール
システム全体にインストールする場合:
sudo apt-get install python3-pyvisa
venvを使ってインストールするとなぜか認識されずでした。
サンプルプログラムの実行
以下のPythonプログラムで動作確認を行います。任意の場所に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
当環境ではsudo
が必要でした。
IDNコマンドの応答が正常に表示されれば、設定完了です!
補足:NIVISAについて
「NIVISAはLinux対応なので、それを使えばもっと簡単にVISAが使えるのでは?」と考える方もいらっしゃるかもしれません。(私がそうでした)
実際に試してみましたが、NIVISAはArm64アーキテクチャに対応していません。UbuntuをインストールしてもArmプロセッサでは動作しないため、Raspberry Piで使用するには今回紹介した方法が必要になります。
まとめ
Raspberry PiでGPIB通信を実現するには、古いOSと対応するドライバを使用する必要があります。手順は複雑ですが、一度設定が完了すればPyVISAを使って計測器との通信が可能になります。
参考になれば幸いです!
Discussion