34401Aをpythonで制御 の履歴(No.1)


旧HPの34401AマルチメーターをPythonから制御する(2024/05/27)

経緯

 旧HPの34401AデジタルマルチメーターのPCからの制御は以前は有償のプログラム環境でやってましたが、ライセンス費用の更新をするのも面倒になってきたので、pythonで制御することにして、少し試してみました。pyserialというライブラリーを使います。また、PCとしてはMacBookAirを使っています。

Pythonで制御してみる

 ハード的には34401AとはRS232Cケーブル(クロスでメスーメスのケーブルが必要)とSerial-USB変換器を使ってMacと接続します。もちろんWindowsでも問題ないはずです。
 まずSerial-USB変換器のドライバーのインストールが必要です。私の場合(M3 MacBookAir)では、Cable MattersやStarTech.comのSerial-USB変換器が問題なく使えています。
 34401A側をRS232Cで、通信パラメータを設定する必要があります。フロントパネルのShift, 矢印キーで設定できますが(E: I/O MENUのところで)、詳しい設定方法は34401Aのマニュアルを見てください。34401Aの電源オンにした時にディスプレイにRS-232と出るとRS232Cで通信する設定になっているはずです。
 pyserialは標準のライブラリーではないので、pipかanacondaでのインストールが必要です。以前anacondaいくつかトラブルがあったので、今回はpipでインストールしています。
 簡単なプログラムを以下に示します。これはDCV 0.1 Vレンジに設定して、測定するだけのプログラムです。無限ループになっているので、止める時はControl+Cをタイプします。
 最初の行はpythonのインストール先を指定します。serial.Serial()でSerial-USB変換器の指定が必要ですが、これはSerial-USB変換器をMacに繋いで置いて、terminalで

ls /dev/cu.*

を実行すると、cu.usbserial-*というのが出てくるので、usbserial-*の部分をここにコピーしてやります。Windowsの場合はここがCOM3とかになりますが、その番号は設定でデバイスドライバー部分を調べると分かるはずです。私の場合、通信速度だけの指定(9600)で問題なく動きましたが(34401A側の設定は9600ボー、None Parity 8bitだった)、ここで問題が出る場合は34401A側の設定とpyserialで設定(parityやデータビット数)を一致させる必要があると思います。
 ser1.read(17)で読んだデータはバイナリー形式で最後にCR+LFが付いてます。なのでstrip()でCR+LFを取って、ASCIIに変換するためにdecode()をしています。

 これで一応、電圧値を読んで、その値を出力することができました。