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で見つけたアドレスを用いてアクセスしてみましたが、エラーになりました。