A&D社の体重計にはRS-232Cインターフェイスを持った機種があります。
そのうちの一つ、ベッドサイドスケールAD-6121AをPaPeRo i上のPythonアプリから利用する方法を紹介します。
接続方法
まずAD-6121A本体の他に、別売りの通信ケーブル(RS232C接続ケーブル、D-sub9ピン)が必要です。
PaPeRo iに接続するには、さらにUSBシリアルケーブルが必要になりますが、これにはbuffalo BSUSRC06を使用しました。
PaPeRo iに接続するとlsusbコマンドではFTDI社製のデバイスとして認識され、/dev/ttyUSBnでアクセスできます。
# lsusb
...
Bus 003 Device 011: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Pythonでシリアルポートアクセス
シリアルポートアクセスのためにはpyserialパッケージが必要なので、pipコマンドでインストールしてください。
# pip3 install pyserial
インポートするパッケージ名はserialになります。
一般にシリアルポートを使用するアプリでは、使用可能なポートから使用したいポートを選択できる様になっているものですが、pyserialで使用可能なポート名を列挙するには以下の様にします。
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
dev_list = [pt.device for pt in ports]
シリアルポートをオープンするにはserial.Serial()を、ボーレート等のシリアル通信パラメータをAD-6121Aにあわせて呼び出します。そのままやっても良いのですが、パラメータのデフォルトを変更した派生クラスを作って利用する方法もあります(オープンする部分がスッキリします)。
import serial
class Ad6121aSer(serial.Serial):
def __init__(self, port=None, baudrate=2400, bytesize=serial.SEVENBITS,
parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE,
timeout=None):
super(Ad6121aSer, self).__init__(port=port, baudrate=baudrate,
bytesize=bytesize,
parity=parity, stopbits=stopbits,
timeout=timeout)
port = '/dev/ttyUSB0'
ser = Ad6121aSer(port=port)
体重データフォーマット
AD-6121Aには裏面にモードスイッチがあり、モードによってシリアルデータの出力内容が変化します。ここでは「個人モード」を使用する事にします。
「個人モード」では体重が安定したときに一度だけ体重データが出力され、フォーマットは以下の様になっています。
"ST,+000110.2 kg\r\n"
シリアルデータはbyte列なのでdecode()で文字列に変換します。
また、PaPeRo iに自然に体重として読み上げて貰うためには以下の様なコードで数値+”kg”の文字列に変換します。
def get_weight(line):
s = line.decode('ascii')
val = float(s[3:12])
unit = s[13:].strip()
res = str(val) + unit
return res
以上の様な処理を行って、体重計に乗るとPaPeRo iが体重を読み上げてくれるデモプログラムを作成しましたのでご参照ください。