IoTで使うPython入門Step3-計測 (2) DMM 34461A-②

 KeysightのDMM 34461Aのカタログには、USB 2.0(USB-TMC488 & MTPプロトコル)対応と書かれています。USBTMC488はUSB Test & Measurement Classの略で、ユーザからは、USBデバイスはGPIBデバイスが動作しているように見えます。MTPはMedia Transfer Protocolの略で、PCとつないだときのファイル転送用です。
 ここではUSBTMCを利用します。

USBTMCライブラリ

 ラズパイの環境です。
 最初に、次のライブラリをインストールします。1.0.2がインストールされました。

pip install PyUSB

 今回利用したusbtmcはソース・プログラムで提供されています。GitHubにいってZIPファイルをダウンロードします。

 ダブルクリックするとアーカイバが立ち上がるので、解凍します。

cd Dwonloads/python-usbtmc-master
sudo python setup.py install

 0.8がインストールされました。
 34461AのリアパネルからUSBケーブルでラズパイのUSBへつなぎます。ターミナルでlsusbを実行します。
 不明なデバイスが見つかります。「2a8d:1301」はVenderIDが0x2a8d、Productが0x1301を示しています。新しいファイルを作ります。2a8dはKeysightのIDです。

sudo nano /etc/udev/rules.d/usbtmc.rules

 内容です。

# USBTMC instruments
# Agilent 34461A
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="2a8d", ATTRS{idProduct}=="1301", GROUP="usbtmc", MODE="0660"
# Devices
KERNEL=="usbtmc/*", MODE="0660", GROUP="usbtmc"
KERNEL=="usbtmc[0-9]*", MODE="0660", GROUP="usbtmc"

 記入が終わったら、CTRL-O CTRL-Xで終了します。
 usbtmcのグループを作ります。

sudo groupadd usbtmc

 usbtmcのグループにユーザpiを追加します。

sudousermod -aG usbtmc pi

 rebootします。
 テキスト・エディタでテスト・プログラムを入力します。

import usbtmc
instr = usbtmc.Instrument("USB::0x2a8d::0x1301::INSTR")
print(instr.ask("*IDN?"))

 k.pyで保存して、python k.pyで実行します。

 LANのときと同じ結果が返ってきました。

プログラム

 usbtmcのドキュメントはここで見つかりました。python usbtmcのドキュメントはここで見つかりました。
 設定はwrite("CONF...")、データの読み出しはask("READ?")です。電源投入後のデフォルトは直流電圧を読み出します。ここでは直流10Vレンジに変更しました。

import paho.mqtt.publish as publish
from time import sleep
import usbtmc

topic = "K-34461A/DC/volt"
host = 'raspberrypi.local'
instr = usbtmc.Instrument("USB::0x2a8d::0x1301::INSTR")

instr.write('CONF:VOLT:DC 10,0.001\n')
#instr.write("CONF:VOLT:AC\n")

while 1:
readDcVoltage = instr.ask("READ?")
print "DC :" ,float(readDcVoltage), "V"
publish.single(topic, readDcVoltage, hostname=host)
sleep(1)

 Node-REDで購読し、dashboardで表示した様子です。読み出したデータをchartとgaugeで表示しました。34461Aで測っているのはTL431の出力電圧です。

 第4回目でも、別のライブラリvisaを使ってUSBでアクセスします。

(※)参考資料 Linux を使用したUSB 測定器の制御 Application Note AN 1465-30