IoTで使うPython入門Step3-計測 (3) 電源 E3631

 Keysightの実験用電源E3631Aは、 最大6V/5A、±25V/1Aが取り出せます。GPIBとRS-232Cのインターフェースが搭載されているので、GPIB-USB変換器のAgilent 82357Bを利用してPCにつなぎました。

 最初に、PCにKeysightの無償ツールKeysight IO Libraries suiteをダウンロードします。バージョンは4.2018でした。インストールは、IO Libraries suiteとCommand Expertの二つにしました。このソフトをインストールしておくと、GPIBのアクセスができるようになります。ただし、Windows用のみです。
 IO Libraries suiteのプログラムの一つであるKeysight Connection Expert 2018を動かすとGPIB0::8::INSTRとして見つけてきます。*IDN?のレスポンスはHEWLETT-PACKARD,E3631A,0,2.1-5.0-1.0です。
 NI-VISAでも同様に使えます(実際には試していない)。こちらはWindows版MacOS版Linux版(CentOS系など)があります。

 前回までラズパイ環境で動かしましたが、ここではPC環境でプログラムを作ります。

Windows 10にpython3.7をインストール

 筆者のPCにはPython2.7がインストールしてありました。ラズパイは、バージョン2と3が最初からインストールされています。プログラムの中で使える関数や文字コードのデフォルトなど異なり、混在するのはよくありません。
 と言いながらバージョン3のほうが新しいのではないかと思い、インストールしました。現時点では、バージョン2もメインテナンスされているので、Python2.7を使い続けても支障はないと思います。

から、

Download Windows x86-64 executable installer

を選びました。インストーラをダブルクリックで起動します。Add Python 3.7 to PATHにチェックを入れ、Install Nowをクリックします。pipは同時にインストールされると書かれています。

 タスク・バー右下の「ここに入力して検索」に

cmd

と入れ、コマンドプロンプトを立ち上げます。今回必要なライブラリをインストールします。

pip install pyusb
pip install pyvisa
pip install pyvisa-py

 pyでpython3が動きます。対話モードの>>>が出ます。

>>>import visa
>>>r = visa.ResourceManager()
>>>r.list_resources()
('GPIB0::8::INSTR',)
>>>k = r.get_instrument("GPIB0::8::INSTR")
>>>print(k.ask("*IDN?"))
HEWLETT-PACKARD,E3631A,0,2.1-5.0-1.0

 USBではなく、GPIB0::8::INSTRを見つけてきました。型名の問い合わせにE3631Aと返答があったので、正常に通信できていることがわかります。

 問い合わせの簡単なプログラムk.pyをエディタ(メモ帳)で作成し、デスクトップに置きます。

import visa
r = visa.ResourceManager()
k = r.get_instrument("GPIB0::8::INSTR")
print(k.ask("*IDN?"))
print(k.ask("CURR?"))


 コマンドプロンプトで実行します。

cd desktop
py k.py

 実行結果です。*IDN?"の問い合わせに型名が、CURR?に対して設定電流が読み出されました。
 問い合わせにaskではなくqueryを使うようにとのコメントが出ていますが、まだ使えるようです。

C:\Users\yoshidawin\AppData\Local\Programs\Python\Python37\lib\site-packages\pyv
isa\resources\messagebased.py:573: FutureWarning: ask is deprecated and will be
removed in 1.10, use query instead.
'1.10, use query instead.', FutureWarning)
HEWLETT-PACKARD,E3631A,0,2.1-5.0-1.0

+5.00000000E+00

 電流、電圧値の読み出しプログラムです。P6Vは、この電源装置に搭載されている3種類の一つを指定するコードです。VOLTで出力電圧を、CURRで電流リミットを設定しています。電源が入った時点では出力はOFFです。設定が終わったらONに切り替えます。
 MEASは測定のコマンドです。結果は指数表記のstr型で戻ってくるので、float()を使うと通常の表示に変わります。

import visa
from time import sleep

r = visa.ResourceManager()
k = r.get_instrument("GPIB0::8::INSTR")
print(k.ask("*IDN?"))
k.write("INST P6V")
k.write("VOLT 3.3")
k.write("CURR 0.1")
print(k.ask("CURR?"))
print(k.ask("VOLT?"))
k.write("OUTPUT:STAT ON")

while 1:
#print(k.ask("MEAS:VOLT:DC? P6V"))
print(float(k.ask("MEAS:VOLT:DC? P6V")),"V")
print(float(k.ask("MEAS:CURR:DC? P6V")),"A")
sleep(1)

(※)電源の設定は、この方法で正しいのかはわかりません。実際に利用されるときは、マニュアルを熟読して、テストしてください。

発行

 MQTTのライブラリを入れます。ラズパイで使ったのと同じです。

pip install paho-mqtt

 今までStep2で作ってきたプログラムの発行部分と上記のプログラムを合わせます。

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

E3631A_ID = "GPIB0::8::INSTR"
r = visa.ResourceManager()
instr = r.get_instrument(E3631A_ID)
instr.write("INST P6V") # set 6Voutput to 3.3V current max100mA
instr.write("VOLT 3.3")
instr.write("CURR 0.1")
instr.write("OUTPUT:STAT ON") # Output ON

ports = 5025
topicV = "E3631A/DC/volt"
topicC = "E3631A/DC/current"
host = 'raspberrypi.local'

while 1:
volts = float(instr.ask("MEAS:VOLT:DC? P6V"))
currents = float(instr.ask("MEAS:CURR:DC? P6V"))
print(volts, "V")
print(currents, "A")
msg = [{'topic':topicV, 'payload':str(volts)}, ( topicC, str(currents), 0, False)]
publish.multiple(msg, hostname=host)
sleep(1)

 Node-REDで購読して、読み出した電圧値が正しくBrokerに届いていることを確認しました(下記の図は電流を読みだしているところ)。

(※)ラズパイではLinux-gpibというドライバがあれば本記事の内容が動くと思われます。pipコマンドではインストールできません。検索すると、2か所でソースをコンパイルして、OSに組み込む方法が見つかりましたが、複雑です。
 NIのLinux用のVISAドライバはCentOSに対応しています。KeysighではLinux用のドライバは見つかりませんでした。菊水電子のドライバもLinux用は見つかりませんでした。テクトロニクス、Rohde & Schwarzは調べていません。

(※)KeysightのGPIB関連のエラー・メッセージです。日本語で読めます。