RS485通信の温湿度センサーXY-MD02にpymodbus.consoleで接続する

以前この記事の内容を手元のメモに残したと思ったのですが、外部公開してなかったからか紛失してしまいました。

以下のように近いことは公開していたのですが、実際に一番普段使うパターンを書いて無くて、半年ぶりくらいに動かす必要出てきた時に無駄な時間使ってしまいました。未来の自分のために残しておきます。

yomon.hatenablog.com

qiita.com

利用している機器

温湿度センサー XY-MD02

温湿度センサーの XY-MD02 は色々な所から出ているので、Amazonなどで XY-MD02 と検索してしまって適当に購入してください。今検索しても大量に検索結果出てきました。現時点ではだいたい1000円台半ば程度で購入できます。

USB to RS485コンバーター

この記事ではこちらを使っているのですが、もっと安いものでも問題無く動きます。

配線

シンプルなので写真だけ。

pymodbus.consoleをインストール

Pythonで書くことが多いのでpymodbusを使います。

github.com

pymodbus には pymodbus.console という機能があり、以下のようなインタラクティブなシェルを使うことが可能です。

ちょっとした確認用途の場合はとても便利な機能になります。

pymodbus.console を利用するには、pymodbus 以外にもいくつかパッケージのインストールが必要になります。

pip install pymodbus click pygments prompt_toolkit

pymodbus.consoleでの通信確認

デバイス認識の確認

USBにデバイスを指して、どこに認識されたか確認します。 /dev/ttyUSB* にマップされるのでudevadmコマンドで確認します。このアダプタは cp210x で認識されるので、以下のように /dev/ttyUSB0 でアクセスできるようです。

$ udevadm info -q property -n /dev/ttyUSB*
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0
DEVNAME=/dev/ttyUSB0
MAJOR=188
MINOR=0
SUBSYSTEM=tty
USEC_INITIALIZED=5886309
ID_BUS=usb
ID_VENDOR_ID=10c4
ID_MODEL_ID=ea60
ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
ID_PCI_INTERFACE_FROM_DATABASE=XHCI
ID_VENDOR_FROM_DATABASE=Cygnal Integrated Products, Inc.
ID_MODEL_FROM_DATABASE=CP2102/CP2109 UART Bridge Controller [CP210x family]
ID_VENDOR=Silicon_Labs
ID_VENDOR_ENC=Silicon\x20Labs
ID_MODEL=CP2102_USB_to_UART_Bridge_Controller
ID_MODEL_ENC=CP2102\x20USB\x20to\x20UART\x20Bridge\x20Con

pymodbus.consoleでセンサーの値を取得

pymodbus.console serial --method rtu --port /dev/ttyUSB0 --baudrate 9600 

インタラクティブにコマンドが打てるので、以下の通り打つと温度が返ってきます。

> client.read_input_registers address=1 count=1 unit=1

10分の一にするので24.9度ですね。

次に湿度です。address を2にします。

> client.read_input_registers address=2 count=1 unit=1

10分の一にするので30.5%ですね。

最後に手元の温湿度計と確認して値に大きな差が無いこと確認して終わりです。