「Pythonで計測器を制御したいけど、何から始めれば良いのかわからない。誰か教えてくれないかなぁ」
そんな悩みを解消します。
今回は、Pythonを使って計測器を制御する方法について紹介したいと思います。細かい技術の話ではなく、Pythonなどのプログラミングを使うと実験が便利になりますよという紹介です。
計測器に表示される数字を目で読み取って測定するのも良いでしょう。しかし、論文を投稿したり、発表会で発表したりするには、測定結果の信頼性が重要です。そのためには、測定データの統計数を増やす必要があるため測定を自動化したくなることもあるでしょう。
測定の自動化は、コードをコピペし、実行するだけで実現できます。そして、計測器だけでなく多くの機器との通信に応用できます。実験だけではなく、効率化が必要な工場の生産ラインなどでも利用できそうですね。
この記事のあらすじを紹介します。
- 通信設定を間違えずにやること
- PythonコードはコピペでOK
計測器の制御が難しく感じるのは、通信設定が面倒だからでしょう。Pythonでの通信はコピペでオッケーなのです。
そこで必要になるのが、計測器をPCに接続して測定することです。多くの研究室では、買ってきたソフトウェアや歴代の先輩たちが蓄積した測定プログラムを使っているでしょう。Excelのマクロ(VBA)を使ったプログラムもあれば、ナショナルインスツルメントのLabVIEWというソフトウェアを使ったプログラムや マスワークスのMATLABを使ったプログラミングもあるでしょう。今回はPythonで計測器との通信を実現したい人向けの記事です。
準備
LANケーブルで計測器とPCを接続する
現在は通信の速度やモジュールの流通性から、LANケーブルを用いたEthernet通信を使うことにします。
通信設定
IPアドレスの設定
たとえばIPアドレスを以下のように設定してみましょう。
- (PC)192.168.1.1
- (計測器)192.168.1.2
まずは、お互いの住所(IPアドレス)を設定する必要があります。 基本的にIPアドレスは3つ目までの数字を一致させることで、ネットワークを共有できます。そして、4つ目の数字を違った数字にすれば良いのです。
通信できているかチェックする。
コマンドプロンプトを開いて、通信確認をしてみましょう。そして、以下のようなコマンドを打ってみましょう。
ping 192.168.1.2
pingというコマンドで計測器のIPアドレス(192.168.1.2)との通信確認しています。これでネットワークが確立されているか確認することができます。
なお、成功したときには以下のような返答が返ってきます。
192.168.1.2 に ping を送信しています
32 バイトのデータ:
192.168.1.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.2 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 0ms、最大 = 0ms、平均 = 0ms
失敗すると以下のような返答です。通信設定を見直してみましょう。
192.168.1.2 に ping を送信しています
32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
192.168.1.2 の ping 統計: パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)
pythonで計測器との通信してみる。
必要なものはpyvisaというパッケージです。
pyvisaをインストール
pipが使えるconda pronptなどのシェルスクリプトで以下を実行するだけです。
pip install pyvisa
次のコードを実行
これで準備完了です。下記のコードを実行してみてください。ただし、計測器に設定したIPアドレスが違う場合には”192.168.1.2″の箇所を書き換えてください。
#pyvisaをインポート
import visa
#接続
rm = visa.ResourceManager('@py')
rm.list_resources()
inst = rm.open_resource("TCPIP::192.168.1.2::1394::SOCKET")
#終端子を指定
inst.read_termination = '\n'
inst.write_termination = '\n'
#通信確認用(任意)
print(inst.query("IDN?"))
「*IDN?」は計測器の情報を確認するためのコマンドです。ですから、上手く通信できていれば計測器の情報が返ってきます。
あとは、自分の好きなようにコードを書き換えていけば良いです。 inst.query(“(SCPIコード)”) でSCPIコードに基づいた計測器の制御が可能になります。
最後に
Pythonを用いて計測器の制御ができるようになりました。測定の自動化ができますね。もちろん、同じインターフェースのついている機器であれば、通信が可能です。電源などについても制御できますので、本記事を利用していただき、ぜひ実験を効率化して頂ければと思います。