IoTで使うPython入門Step3-計測 (9) DMM TP9605BT RS-232C

 TekPower TP9605BTは 6000カウントのDMMです。製品の裏側に赤外線の通信ブロックがあり、付属の赤外線-USBケーブルでPCとつなげられ、COMポートを利用したRS-232Cの通信ができます。Blurtoothもサポートされています。付属の小さなCD-ROMからインストールするように説明がありますが、読み取り機がないので使えていません。Amazon.comから入手しました。

 Windows 10の環境でプログラムを作っています。

RS-232Cの機能を有効にする

 本体裏に赤外線-USB変換ケーブルをつなぎます。使われているのはCH340です。Windows 10であれば自動的にドライバが入りますが、不明なデバイスが出る場合は、いったん削除し、新規にダウンロードしてインストールします。

 DMMのダイアルを、OFFから測定したい、ここではV=電圧モードにすると電源が入ります。右上にあるREL/RS232のボタンを2秒以上押すと、パネルにRS232の文字が出て、通信できる状態になります。この操作は、電源を切るとクリアされます。

TeraTermで接続を確認

 デバイスマネージャでつながっているCOMポートを確認し、通信ソフトの定番TeraTermを立ち上げ、シリアルでCOM番号を選んで通信を始めます。通信速度は9600bpsです。今回はCOM13でした。
 データは、何もせずに送られてきます。頻繁に文字化けが起こります。

シリアル通信

 タスクバーの「ここに入力して検索」欄にCMDと入れ、コマンド・プロンプトを立ち上げ、シリアル通信のライブラリを用意します。既にインストールしてあれば不要です。python3にライブラリが入っているので、実行はpyを使います。pythonではありません。

pip install pyserial

 送られてくるデータは13バイトで、先頭は符号、4バイトがデータです。そのあとに0x20が入り、次が小数点のドットの位置です。そのあとは設定しているロータリ・スイッチの位置(DCやAC)などが読み出されます。解説書はここからダウンロードできます。
 したがって、データ自体は5文字目まで読めばよいことがわかります。最初に小数点位置を表す1文字をスライスの機能を使って切り出します。数字(文字)がそのまま小数点第何位かを表しています。
 プログラムの終了はCTRL-Cです。読み取り時に数字以外のデータを読み取ったらエラーになるので、except :の処理はpassで何もせずにWhileループに戻ります。

import serial
from time import sleep

ser = serial.Serial('COM13', 9600, timeout=0.5)

while 1:
try:
sleep(0.5)
data = ser.readline()
if int(data[6:7]) == 1: # 0.000
n = 1000
elif int(data[6:7]) == 2: # 00.00
n = 100
elif int(data[6:7]) == 3: # 000.0
n = 10
else:
n=1
print(float(data[:5]) / n)
except KeyboardInterrupt:
print('\n end')
ser.close()
break
except :
# print("error")
pass # continue

 実行中の様子です。被測定物の電圧変化から数秒遅れてデータが変わります。フロー制御は行っていないので、どんどんデータは送られてきます。

data = ser.readline()

のところを空読みを入れると、表示のレスポンスは向上しますが、相対的にエラーが増加します。もう少し工夫が必要です。

data = ser.readline()
data = ser.readline()
data = ser.readline()

 24行目のerror表示を生かして実行しているところです。

●コラム Pythonのスライス機能

 文字列などのシーケンス型のオブジェクトでは、スライス、インデクシングが使えます。
 シーケンス型は、文字列(str)やlist型を含みます。スライスは、「どこからどこまで」という指定が、インデクシングは「どこ」の指定ができます。文字の最初は0から数えます。

 本文のdata[6:7]はスライスで小数点の位置データを読み出していますが、インデクシングではdata[6]で読み出せます。

【例】"23.56"[2:]  結果 '.56'

【例】"23.56"[1:3] 結果 '3.'

【例】"23.56"[2:3]  結果 '.'

【例】"23.56"[:2]  結果 '23'

【例】"23.56"[2]  結果 '.'