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] 結果 '.'