Rasberry Pi で 計測器制御 (GPIB-USB-HS経由)
概要
工場の製造や検査工程では高性能、高信頼性の産業用PCが使われることが多いですが、高タクトが求められない工程や、稼働頻度が低い工程の場合はオーバースペックなことがあります。
そこで省スペース、省電力、低価格であるRasberry Piをコントローラーとして使用することを考えました。OSのインストールからGPIB経由で計測器制御するまでの手順をまとめましたのでRaspberry Piを触るのが初めての人でも大丈夫です。
今回はRaspberry Pi Zero W と GPIB-USB-HS(GPIBコントローラー)を使用しました。
OSのインストール
Raspberry Pi Imagerを使って、Micro SDカードにOSをインストールします
今回は、Raspberry Pi OS Lite (32-bit)をインストールしました。
Raspberry PiにSSHで接続できるようにする
Windowsの場合、SDカードへの書き込みが成功すると D:\にbootという名前のドライブができていると思います。
まずはboot直下にsshという拡張子なしのファイルをつくります。次にWiFiに接続するためのwpa_supplicant.confというファイルを作ります。
wpa_supplicant.confに記述する内容は、下記の記事を参考にしました。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="SSID"
psk="Pre-Shared Key"
}
SDカードをRaspberry Piに差し込んで起動します。Raspberry Pi Zero Wの場合、起動後1,2分するとターミナル経由でアクセスできるようになります。
Host: raspberrypi.local
ID: pi
Password: raspberry
pi@raspberrypi:~ $
GPIB-USB-HSを使えるようにする
カーネルビルド
GPIBドライバーは、カーネルモジュールなのでRaspberry Piのカーネルソースの取得とビルドが必要です。
以下、公式ページの手順を参考に進めます。
ビルドに必要なソフトウェアをインストールします。
sudo apt install git bc bison flex libssl-dev make -y
カーネルソースを取得します。
git clone --depth=1 https://github.com/raspberrypi/linux
デフォルトの.configファイルを作成します。
(Raspberry Pi Zero W向け。ほかのバージョンについては公式ページをご確認ください。)
cd linux
KERNEL=kernel
make bcmrpi_defconfig
カーネルをビルドします。
make -j2 zImage modules dtbs
Raspberry Pi Zeroの場合はビルドが長時間(6時間以上かかったと思います)に及ぶのでSSHの接続が切れてもいいようにnohup付きでコマンドを実行するのがおすすめです。ビルドのログはビルドを実行しながらtailコマンドを使って確認できます。
nohup make -j2 zImage modules dtbs &
tail -f nohup.out
ビルドが完了したらカーネルモジュール、デバイスツリーBLOB、カーネルイメージをインストールします。
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
再起動します。
sudo reboot
カーネルのバージョンがインストールしたバージョンと一致していれば成功です。
(venv) pi@raspberrypi:~/visa-test $ uname -a
Linux raspberrypi 5.15.30+ #1 Thu Mar 24 16:07:03 GMT 2022 armv6l GNU/Linux
Linux-GPIB (GPIBドライバー)のビルド&インストール
ビルドに必要なソフトウェアをインストールします。Linux-GPIBのソースコードはSVNで管理されているのでSVNが必要です。
sudo apt install subversion -y
sudo apt install automake libtool -y
ソースコードを取得します。
svn checkout svn://svn.code.sf.net/p/linux-gpib/code/trunk linux-gpib
ドライバーをビルド & インストールします。
cd linux-gpib
cd linux-gpib-kernel
make
sudo make install
ユーザーアプリをビルド & インストールします。
cd ..
cd linux-gpib-user
./bootstrap
./configure
make
sudo make install
設定ファイルをコピー & 編集します。
sudo cp util/templates/gpib.conf /usr/local/etc/
sudo vi /usr/local/etc/gpib.conf
中身を下記に変更します。
interface {
minor = 0
board_type = "ni_usb_b"
name = "NI GPIB-USB-HS"
pad = 0
sad = 0
timeout = T3s
eos = 0x0a
set-reos = yes
set-bin = no
set-xeos = no
set-eot = yes
base = 0
irq = 0
dma = 0
master = yes
}
device {
minor = 0
name = "MSO6054A"
pad = 1
sad = 0
eos = 0xa
set-reos = no
set-bin = no
}
ドライバーの読み込みと設定の反映を行います。
sudo modprobe ni_usb_gpib
sudo ldconfig
sudo gpib_config
ロード済みカーネルモジュールにni_usb_gpibとgpib_commonがあれば成功です。
pi@raspberrypi:~ $ lsmod | grep gpib
ni_usb_gpib 40960 0
gpib_common 49152 1 ni_usb_gpib
Pythonで計測器制御する (pyVISA)
pyVISAのインストール
VISAは計測器制御のためのライブラリで、これをPython経由で制御できるようにしたモジュールがpyVISAです。
venvをインストールします。
sudo apt install python3-venv -y
仮想環境作成 & 有効化
python3 -m venv venv
. ./venv/bin/activate
必要なモジュールをインストールします。gpib-ctypesはpyVISA経由でGPIBインターフェースを制御するの必要です。また、シリアル通信デバイスとUSBデバイスが制御できるようにpySerialとPyUSBも入れておきます。
pip install -U pip
pip install pyvisa
pip install pyvisa-py
pip install gpib-ctypes
pip install pySerial
pip install PyUSB
デフォルトではrootからしかGPIBにアクセスできないのでパーミッションを変えておきます。
sudo chmod 666 /dev/gpib*
pyvisa-infoコマンドで診断ができます。
機器、Python、pyVISAやバックエンドの情報が表示されます。
Machine Details:
Platform ID: Linux-5.15.30+-armv6l-with-glibc2.31
Processor:
Python:
Implementation: CPython
Executable: /home/pi/visa-test/venv/bin/python
Version: 3.9.2
Compiler: GCC 10.2.1 20210110
Bits: 32bit
Build: Mar 12 2021 04:06:34 (#default)
Unicode: UCS4
PyVISA Version: 1.11.3
Backends:
ivi:
Version: 1.11.3 (bundled with PyVISA)
Binary library: Not found
py:
Version: 0.5.2
ASRL INSTR: Available via PySerial (3.5)
USB INSTR: Available via PyUSB (1.2.1). Backend: libusb1
USB RAW: Available via PyUSB (1.2.1). Backend: libusb1
TCPIP INSTR: Available
TCPIP SOCKET: Available
GPIB INSTR: Available via Linux GPIB (b'4.3.4 r[2016]')
GPIB INTFC: Available via Linux GPIB (b'4.3.4 r[2016]')
再起動したら都度、以下のコマンドの実行が必要です。
sudo /dev/gpib* 666
sudo gpib_config
計測器制御
keysightのデジタルマルチメーター34465Aと接続してみました。
電流を測定してみます。
python
>>> import pyvisa
>>> rm = pyvisa.ResourceManager()
>>> rm.list_resources()
('ASRL/dev/ttyAMA0::INSTR', 'GPIB0::1::INSTR')
>>> inst = rm.open_resource('GPIB0::1::INSTR')
>>> inst.query(":meas:curr?")
'+2.76998717E-12\n
ログ出力の有効化
log_to_screen()を呼ぶとpyVISAのログ出力が有効になります。
>>> from pyvisa.ctwrapper.highlevel import NIVisaLibrary
>>> from visa import log_to_screen
>>> log_to_screen()
>>> NIVisaLibrary.get_library_paths()
>>> inst.query(":meas:curr?")
2022-03-31 04:19:53,280 - pyvisa - DEBUG - GPIB.write b':meas:curr?\r\n'
2022-03-31 04:19:53,294 - pyvisa - DEBUG - GPIB0::23::0::INSTR - reading 20480 bytes (last status <StatusCode.success_max_count_read: 1073676294>)
'-2.35894342E-12\n'
まとめ
Rasberry Piを使ってGPIBインターフェース経由で計測器制御する手順をまとめました。
一度構築したシステムのSDカードを複製すれば、システムを追加したりバックアップの作成も容易に行えます。
Discussion
Hello Mr.Hiroki Abe, I read your content. Thanks for your timing investment on this sharing, its very helpful. I have some questions. I have Raspberry Pi 4 and GPIB-USB-B. Following your steps, I already installed almost all of steps before Installing Driver, I think that driver is not compatible to GPIB-USB-B I have. Could you tell me know which version of GPIB driver have you installed in this case? The latest version is compatible to GPIB-USB-B is 17.6 (and earlier). I have Line ID, can we have a conversation on that? My Line ID: (+84) 0767156335.
Hi LEBATAI-san, Thank you for your comment.
I'll check GPIB driver version which I installed later since my Raspberry Pi is now in the warehouse ... Thank you!
Hi LEBATAI-san, Sorry for waiting you. I couldn'd find my Pi. However I installed the latest version driver at I wrote this article (March, 22)