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

 第2回では、ラズパイを使ってDMMの34461AをUSB経由でアクセスをしました。ライブラリはUSBTMCでした。
 前回、PCの環境のpythonを使い、visaライブラリを使って電源E3631にUSB経由GPIBでアクセスしました。
 ここでは、最初、ラズパイの環境でPythonのvisaライブラリを使って34461AをUSB経由でアクセスします。次に、Windows 10の環境でUSB、LAN経由でアクセスします。

接続テスト

 PCでvisaライブラリによる接続を確認します。34461AのLANケーブルをネットワークのハブにつなぎ、USBケーブルはPCへつなぎます。Keysight Connection Expert 2018を動かすと、USBとLAN(TCP/IP)に34461Aを見つけてきます。

ラズパイにvisaライブラリをインストール

 ラズパイのターミナルで、ライブラリpyusb、pyvisa、pyvisa-pyをインストールします。pipはOSをインストールしたときに入っています。これで、Windows 10と同じライブラリ環境になりました。

pip install pyusb
pip install pyvisa
pip install pyvisa-py

 ターミナルでpipを使うと、ライブラリはバージョン2対応になり、Python3用には入っていません。

  34461AのUSBケーブルをラズパイに接続します。ラズパイのLANポートは34461A、PCと同じTCP/IPのネットワークにつながっています。ラズパイのターミナルでpythonと入力して対話モードにします。

>>>import visa
>>>r = visa.ResourceManager()
>>>print(r.list_resources())
(u'ASRL/dev/ttyAMA0::INSTR', u'USB0::10893::4865::MY53216054::0::INSTR')

 visaのライブラリを利用して、USBのvisaアドレスがわかりました。LAN(TCP/IP)のアドレスは見つけてきませんでした。

テスト・プログラム

 USBのvisaアドレスをコピーして利用します。プログラム名はk.pyで保存します。

import visa
from time import sleep

visaAddr = "USB0::10893::4865::MY53216054::0::INSTR"
r = visa.ResourceManager(visaAddr)
instr = r.get_instrument(visaAddr)

print(instr.query("*IDN?"))

data = instr.query("MEAS:DC?")
print("DC: ", float(data))

instr.write("CONF:VOLT:AC\n")
sleep(0.5)
data = instr.query("MEAS:AC?")
print("AC: ", float(data))

  ターミナルからpython k.pyを実行しました。*IDN?に対する型番、各種CONFによる設定、MEASによる読み出しが実行されました。画面はqueryではなくaskを用いたときのメッセージです。

MQTTで発行

 読み出した直流の電圧をBrokerに発行します。

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

visaAddr = "USB0::10893::4865::MY53216054::0::INSTR"
topic = "K-34461A/DC/volt"
host = 'raspberrypi.local'
r = visa.ResourceManager(visaAddr)
instr = r.get_instrument(visaAddr)
instr.write('CONF:VOLT:DC 10,0.001\n')

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

 Node-REDで購読しているところです。

Windows 10で同じように実験

 Windows 10でライブラリpyusb、pyvisa、pyvisa-pyのインストールは、前回行いました。入ったのはPython3にほうです。下記のプログラムd.pyをコマンド・プロンプト内で、py d.pyで動かします。

import visa
r = visa.ResourceManager()
print(r.list_resources())

 実行結果です。ラズパイのときのようにシリアルは表示されませんでしたが、USBとTCP/IPのvisaアドレスが見つかりました。

('TCPIP0::192.168.111.111::hislip0::INSTR', 'USB0::0x2A8D::0x1301::MY53216054::0::INSTR')

◆TCP/IPのvisaアドレスで実行します。

 メーカIDの0x2A8Dは10進で10893、機種IDの0x1301は10進で4865です。

import visa

#visaAddr = 'USB0::10893::4865::MY53216054::0::INSTR'
visaAddr = "TCPIP0::192.168.111.111::hislip0::INSTR"

r = visa.ResourceManager()
instr = r.get_instrument(visaAddr)
print(instr.query("*IDN?"))
data = instr.query("MEAS:DC?")
print("DC: ", float(data))
instr.write("CONF:VOLT:AC\n")
data = instr.query("MEAS:AC?")
print("AC: ", float(data))

◆USBのvisaアドレスで実行します。

import visa

visaAddr = 'USB0::10893::4865::MY53216054::0::INSTR'
#visaAddr = "TCPIP0::192.168.111.111::hislip0::INSTR"

r = visa.ResourceManager()
instr = r.get_instrument(visaAddr)
print(instr.query("*IDN?"))
data = instr.query("MEAS:DC?")
print("DC: ", float(data))
instr.write("CONF:VOLT:AC\n")
data = instr.query("MEAS:AC?")
print("AC: ", float(data))

 どちらも同じ結果になりました。

 実験の途中、エラーが出たときのメッセージを見ていると、USBの接続はUSBTMCの規格で通信しているようです。なので、pyusbライブラリがpyvisaライブラリから呼ばれているのかもしれません。第2回のUSBTMCライブラリより、こちらのほうがインストールは簡単でした。実験はしていませんが、pyusbライブラリはlibusb対応と書かれていますが、USBTMC対応機器へアクセスできるかもしれません。
 pyvisa-pyライブラリはpyvisaのbakckendと説明されていますが、どういう役割かはわかりません。

(※)PyVISA のドキュメント;PyVISA: Control your instruments with Python

(※)ラズパイで見つからなかったTCP/IPのvisaアドレスをPCで見つけたアドレスを用いてアクセスしてみましたが、エラーになりました。