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もインストールする機会がめっきり無くなってしまった. それらのインストールが面倒なので,変換機を使うという側面もある.