Debian13でrubyからGPIB制御


NIのPCI-GPIBを積んだPCにDebian13を入れて,rubyから制御できるようにセットアップしたので,そのときのやり方を書いておく. Debian13をインストールするところまでは,省略する. sudoもインストールして設定しておく.

linux-gpibは,現在はlinux-gpib-4.3.6が最新の安定版のようなので, https://sourceforge.net/projects/linux-gpib/files/linux-gpib%20for%203.x.x%20and%202.6.x%20kernels/4.3.6/ からlinux-gpib-4.3.6.tar.gzを取って来る. そのフォルダに行ってから,以下を実行する.

sudo apt install linux-headers-$(uname -r) build-essential automake

tar xvfz linux-gpib-4.3.6.tar.gz
cd linux-gpib-4.3.6/

tar xvfz linux-gpib-kernel-4.3.6.tar.gz
cd linux-gpib-kernel-4.3.6/
make clean
sed -i 's/GPIOF_DIR_IN/GPIOD_IN/g' drivers/gpib/gpio/gpib_bitbang.c
make
sudo make install
cd ..

tar xzvf linux-gpib-user-4.3.6.tar.gz
cd linux-gpib-user-4.3.6
./configure
make
sudo make install
cd ..

sudo ln -s /usr/local/lib/libgpib.so.0 /lib/libgpib.so.0

そして,GPIBボードなどの設定をするために,/usr/local/etc/gpib.confをスーパーユーザーから編集して,最初の方の設定を以下のように変更する.

minor = 0
board_type="ni_pci_accel"
name="dev0"

board_typeはni_pciでも良いようだが,違いは不明である. 最低限のインストールはこれで終了である.

実際にGPIBを使うためには,ドライバーを以下のようにして組み込む.

sudo /sbin/modprobe tnt4882
sudo /usr/local/sbin/gpib_config --minor 0

うまく組み込めたかを確認するためには,以下のコマンドを実行する.

sudo lsmod |grep gpib

このとき,

gpib_common            65536  2 tnt4882,nec7210

などと表示されれば,うまくいっている. しかしこのままではroot権限が無いとアクセスが出来ないので,アクセスできるようなgpibグループの設定を以下のように行う.

sudo /sbin/groupadd gpib
sudo /sbin/usermod -aG gpib ユーザー名
sudo chgrp gpib /dev/gpib*
sudo chmod g+rw /dev/gpib*

GPIB機器を接続して,例えば以下のような感じでアクセス出来れば,成功である.

/usr/local/sbin/ibtest
d
adressの番号を入力
w
*idn?
r
100

うまく行かないときには,以下のようなエラーが出ので,その場合はこれまでの操作や接続などを確認して欲しい.

libgpib: IBOPENDEV ioctl failed
libgpib: error in is_cic()!
ibdev error

ibsta = 0x8000  < ERR >
iberr= 0
EDVR 0: OS error

ibcntl = 19

ドライバーの組み込みや,groupの設定を自動で行うようにするために,以下のコマンドを実行する.

echo "alias char-major-160 gpib_common" >>/etc/modprobe.d/gpib.conf
echo "alias gpib0 tnt4882" >>/etc/modprobe.d/gpib.conf
echo "install tnt4882 /sbin/modprobe --ignore-install tnt4882; chgrp gpib /dev/gpib*; /usr/local/sbin/gpib_config --minor 0" >>/etc/modprobe.d/gpib.conf
echo "KERNEL==\"gpib*\", GROUP=\"gpib\", MODE=\"0660\"" >/etc/udev/rules.d/40-gpib-permissions.rules

ここでは,ファイルを作って行を追加しているので,複数回は実行しないこと. 再起動して上記のibtestが動いたら成功である.

GPIBをrubyから使うためのライブラリとしては,以前はRAAに田鎖さんの作ったgpib-rubyがあったのだが,RAAが閉鎖されてしまったので,ここに置いておく. それに,轟さんのパッチをあてると,最近のrubyでもうまく動くようになる. ここで,なぜかUSE_IBDEVがうまく働いていないようだったので,その条件分岐を削除するという変更も加えている. これらのファイルを同じフォルダに置いて,以下を実行する.

sudo apt install ruby3.3-dev
tar xfz gpib-ruby.tgz
cp gpibruby.patch gpib-ruby/
cd gpib-ruby
patch gpib.c gpibruby.patch

しかし,そのままの設定だとflexを使うことになるのだが,flexと共にgpib-rubyをインストールして使おうとすると,以下のようなエラーが出てしまう.

<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:136:in `require': /lib/x86_64-linux-gnu/libfl.so.2: undefined symbol: yylex - /usr/local/lib/x86_64-linux-gnu/site_ruby/gpib.so (LoadError)

そこで,extconf.rbの中の

  $LOCAL_LIBS="-lgpib -lm -lfl"

という行を

  $LOCAL_LIBS="-lgpib -lm"

に変えてから,以下を実行するとgpib-rubyのインストール完了である.

ruby ./extconf.rb --with-gpib-include=/usr/local/include/gpib
make
sudo make install

rubyで以下のようなプログラムが動けば,成功である.

require "gpib"
dev = Gpib.new(10)
dev.write("*idn?")
p dev.read(100)

誰か,gemでも作って,簡単にインストールできるようにしてくれないかな.

無事にうまくインストールできたら,kernelが変わる度に上記を実行するのは面倒なので,kernelを固定しておく方が良い. 以下のコマンドで,現在使っているkernelの番号と,インストールされているkernelのパッケージを確認する.

uname -r
dpkg -l |grep "linux-image"

そして,そのパッケージをhold状態にするために,以下を実行する.

echo linux-image-amd64 hold | sudo dpkg --set-selections
echo linux-image-6.12.38+deb13-amd64 hold | sudo dpkg --set-selections

rubyでGPIBを使っている人は少ないようで,情報も少ないので,この情報が誰かの役に立ってくれると嬉しく思う. 私自身も自作のUSB-GPIB変換機で十分なので,GPIBボードはあまり使わなくなって,linux-gpibやgpib-rubyもインストールする機会がめっきり無くなってしまった. それらのインストールが面倒なので,変換機を使うという側面もある.