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をインストールします

https://www.raspberrypi.com/software/

Raspberry Pi Imager

今回は、Raspberry Pi OS Lite (32-bit)をインストールしました。

Raspberry Pi OS Lite (32-bit)

Raspberry PiにSSHで接続できるようにする

Windowsの場合、SDカードへの書き込みが成功すると D:\にbootという名前のドライブができていると思います。

まずはboot直下にsshという拡張子なしのファイルをつくります。次にWiFiに接続するためのwpa_supplicant.confというファイルを作ります。

wpa_supplicant.confに記述する内容は、下記の記事を参考にしました。

https://zenn.dev/asataka/articles/b92cd770a48d74
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のカーネルソースの取得とビルドが必要です。

以下、公式ページの手順を参考に進めます。

https://www.raspberrypi.com/documentation/computers/linux_kernel.html

ビルドに必要なソフトウェアをインストールします。

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です。

https://pyvisa.readthedocs.io/en/latest/

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と接続してみました。

https://www.keysight.com/jp/ja/product/34465A/digital-multimeter-6-5-digit-truevolt-dmm.html

電流を測定してみます。

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カードを複製すれば、システムを追加したりバックアップの作成も容易に行えます。