2020TweetRIGOLのMSO5000シリーズのオシロをPythonから制御した例を紹介します。notebookから使うおわりにはじめに作ったものPythonを使ってMSO5000を制御するスクリプトを作ってみました。思ったより記事が長くなったので成果物だけをここに挙げておきます。idt12312/save_as_csv.pyオシロを買った最近RIGOLのMSO5000シリーズのオシロ(RIGOLの黒いオシロと言われているような)を買いました。値段の割に高機能で、趣味で電子回路をいじる分には十分な性能です。プログラムから操作したいオシロをはじめとする計測器にはPCのプログラムから自動制御できるような機能がたいてい実装されています。MXO5000のオシロも例の漏れずそうです。多くの測定パラメータで何回も似たような測定をしたい場合には、プログラムを作って自動で測定をした方が楽です。工場の出荷試験などがそうでしょう。趣味用途ではどうでしょうか。回路の動作確認やデバッグのために使われることが多く、いちいちプログラムを作って測るよりも手動でオシロのボタンやつまみをいじって操作する方が便利です。わからない動作を追うので測定パラメータを事前に決めることは難しいですし、一回限りの測定であるこも多く、わざわざプログラムを作っていては無駄が多いでしょう。趣味用とオシロをプログラムから操作する必要性はあまりないのかもしれません。スクリーンキャプチャと波形データをPCに読みだす機能だけはプログラムから(というかPCから)操作できると便利かなと思いました。手動では、USBメモリをオシロにさしてボタン操作をすることでUSBメモリにスクリーンキャプチャや波形データを保存することができます。保存のたびにオシロのメニューを切り替える必要があり、何度もデータを取ろうと思うと煩わしく感じることもあります。MSO5000シリーズオシロを制御する方法を紹介したいと思います。他の計測器をPythonから制御したい場合にも役に立つのではないかと思います。Architecture)というAPI規格を定めています。VISAはハードウェア操作を抽象化するので、VISAに準拠している計測器であればメーカー・機種・インターフェースが違っても同じように制御できます。RIGOLのオシロもVISAに準拠をしているので、世の中にあるVISAに準拠した測定器の制御方法が通用します。Instruments)というものがあります。SCPIではコマンドの構文とデータの送受方法が共通化されているだけで、コマンド自体は計測器によって独自のものが定義されています。現代の多くの計測器はSCPIで動くので、SCPIを使えば具体的なコマンドは違えど同じような考え方で制御をすることができます。SCPIは文字列で構成されるコマンドなので、プログラミング言語によらず同じコマンドで制御をすることができます。SCPIが定まる以前に作られた計測器は、メーカーや機種ごとに独自のコマンド体系が使われていました。SCPIでないコマンド体系を持つ計測器であっても、VISAに準拠していれば以降で紹介するのと同じようにPythonから扱えるものも多いです。Pythonから制御するPythonにはVISAに対応した計測器を制御する、pyvisaというライブラリがあります。https://pyvisa.readthedocs.io/en/latest/writeやqueryというメソッドを使ってSCPIのコマンドを文字列として送受信します。query_binary_valuesをよく使います(これしか使わないかも)。inst.query('*IDN?')pyvisaを使うにはVISAのバックエンドとして働くVISA規格が実装されたライブラリも必要になります。こだわりがなくPythonからしか使わないのであれば、PyVISA-pyというVISAのPython実装を使うと楽です。https://pypi.org/project/PyVISA-py/ほかにもNIが無料で提供しているNI-VISAもよく使われている気がします。なんでもいいのでVISAライブラリが一つ入っていればpyvisaからVISA準拠の計測器を制御できるようになります。MSO5000シリーズのオシロに限って、LANで接続する場合とUSBで接続する場合を紹介します。LANで繋ぐとPC側にドライバなどが必要なく楽なのでおススメです。必要なソフトをinstallするPythonからLAN経由でRIGOLのオシロを制御する場合は、Pythonに加えて以下の2つが必要です。pyこれらはPyPIに登録されているので、以下ようにpipを使ってinstallできます。pyvisa-pyこれらに加えて、USB経由で制御する場合はPC側にドライバが必要です。SIgmaというソフトをinsltallするとドライバとユーティリティ類が揃いました。Installer」という項目からdownloadしてinstallしました。https://jp.rigol.com/products/oscillosopes/mso5000.htmlこれをinstallするとNI-VISAがinstallされます。NI-VISAがinstallされている場合はpyvisa-pyをinstallする必要はありません。addressという識別子が割り当てられます。LANなど)ごとに違うaddressが割り当てられます。LANを使う場合オシロをLANで接続するために、PC側にドライバなどのソフトの準備は必要ありません。オシロ側でLANの設定をするだけで十分です。addressはオシロのLANの設定画面から確認することができます。addressはTCPIP::192.168.1.21::INSTRになっていました。USBを使う場合オシロをUSBでPCに接続するするには、PC側に前述のドライバが必要です。addressを確認することができます。私の環境ではUSB0::0x1AB1::0x0515::{serial_number}::INSTRとなっていました。addressにはaliasという別名をつけることができます。Manager」を選択するとaliasを設定する画面が開きます。addressを設定しなくても、わかりやすい自分の設定した文字列で計測器にアクセスできるようになります。上の画像ではaliasとしてscopeを設定しています。コマンドを調べるSCPIに対応している計測器には、SCPIのコマンドのリファレンスマニュアルが準備されているはずです。Manual」がそれに該当します。https://jp.rigol.com/products/oscillosopes/mso5000.htmlここにSCPIコマンドの定義が書いてあり、このコマンドを使って計測器を制御します。メーカーや計測器によって同じコマンドでも動作が違うことがよくあるので注意が必要です。場合でもそこを読めば雰囲気がわかると思います。SCPIコマンドの中には*(アスタリスク)から始まるIEEE488.2の共通コマンドというものがあります。これはSCPIに対応している計測器で共通して使えるコマンドです。計測器の識別情報を取得する*IDN?、計測器をリセットする*RST、命令の実行を待機する*OPC?辺りはよく使います。SCPIの*IDNコマンドを使って計測器の識別情報を読みだしてみます。前述のPythonの環境ができた状態で以下のスクリプトを実行すると、*IDN?で取得できる識別情報が表示されます。addressを指定します。addressのaliasを設定することもできます。識別情報はカンマ区切りで、以下の意味を持ちます。スクリーンキャプチャを保存するオシロスコープの画面そのものを画像として保存してみます。オシロにUSBメモリを挿して手動で保存するよりも楽だと思います。以下のスクリプトをload_screen.pyというファイルに保存したとして、次のコマンドを実行します。addressがTCPIP::192.168.1.21::INSTRであるオシロから画面のデータ読みだしてtest.pngの画像ファイルに保存します。このスクリプトではPILを使っているので、PILもinstallが必要です。MSO5000では:DISP:DATAコマンドで画面のデータをbitmap形式で取得できます。SCPIでは基本的に文字列でデータをやり取りしますが、たまにバイナリデータを扱うこともあります。今回の例では、:DSIP:DATA?を送るとbitmapのバイナリデータが送られてきます。このバイナリデータはファイルにそのまま保存するとbitmapファイルになるようなデータです。pyvisaではquery_binary_valuesを使うと、バイナリデータの解釈方法や保存方法を指定してデータを受け取ることができます。上の例ではバイナリデータをbyteごとにPythonのbytesに詰めています。endianとして整数に解釈していく」処理も簡単にできます。データを入れる先はnumpyのndarrayなども指定できるので、受け取った大量のデータをそのままnumpyでのデータ処理に流していくこともできます。今回の主題からは外れますが、bmpだとサイズが大きいのでPILを使ってpngに変換して保存しています。出力ファイル名に.jpegなどを指定すれば.jpegで保存することもできます。対応しているformatはPILのsaveが対応している形式です。このスクリプトを使って取得した画面のキャプチャは以下のようになります。これはI2Cの通信のデバッグをしているところです。MSO5000にはアナログCHの信号もいくらかのプロトコルで解釈してくれる機能があります。波形データをcsvファイルに保存する次はオシロスコープで取得した波形データをcsvファイルで保存してみます。以下のスクリプトをload_screen.pyというファイルに保存したとして、次のコマンドを実行します。addressがTCPIP::192.168.1.21::INSTRであるオシロのCH1,2から10000点データを読みだして、test.csvに保存します。データを読みだす前にオシロをSTOP状態にしています。オシロからデータを読みだして解釈する部分はload_waveform関数に書いてあります。波形データ自体はWAV:DATAコマンドで読みだせるのですが、読みだしたデータを物理量に直すためには:WAV:PREコマンドで取得したパラメータも必要です。データの解釈方法はマニュアルに書いてあります。load_waveform関数の冒頭では以下の設定をしています。文字列(‘2.34E-3’のように)で送るか、1点を2byteで送るか1byteで送るかを選択するオシロの測定値はメモリに保存されていて、その一部が画面に表示されています。:WAV:MODEでは画面に表示されているものをから読みだすのか、メモリにあるものを読みだすのかを選択できます。MODEとデータ点数(:WAV:POIN)によってデータが間引かれたりもします。この辺りはオシロによってかなり動作が違うので要注意です。:WAV:FORMを文字列に指定するとデバッグはしやすくなるのですが、数万点のデータを転送するにに結構時間がかかります。時間短縮のためにbyteを選択しておくのが無難です。多くのオシロのADCは8bitなので、1点あたり1byteで事足ります。resokutionにしているときは1点の分解能がbitを超える場合があります。いう時は:WAV:FORMをwordにして1点を2byteで送ると分解能を保ちつつ高速にデータの転送ができます。modeで動かしても分解能が8bit以上にはならないのでwordを設定する利点はありません。notebookからもオシロを制御することができます。notebookで完結させることができます。MSO5000を制御する方法を紹介しました。計測器の自動制御は趣味用途だとあまり使わないかもしれませんが、たくさん同じような測定をしたいときには重宝します。