PyModbus를 사용하여 USB-RS485 변환 어댑터를 통해 Modbus 호환 온습도 센서의 값을 얻습니다.

Pymodbus와 USB-RS485 변환 어댑터를 사용하여 Modbus RTU 호환 장치에서 정보를 얻으십시오.

사용중인 장비



Raspberry Pi



사용하는 것은 라즈파이 4입니다.

온습도 센서



KKmoonRS485 온도 습도 송신기 RS485 Modbus-RTU 데이터 로거 무선 온도 센서 온도 습도 모니터
「RS485 Modbus」로 Amazon에서 검색하면 맨 위에 나오는 이쪽의 센서 사용하고 있습니다.

htps //w w. 아마존. 이. jp/dp/B07KS3WJRM/

사양도 인용해 둡니다.


품목
내용


전원 범위
DC8V ~ 48V (양과 음의 극성을 구별하지 않고 극성을 반대로 할 수 있습니다)

온도 측정 범위
-40°C~125°C

습도 측정 범위
0~100%RH

측정 정확도와 분해능
온도: ±0.3°C, 0.1°C 습도: ±3.0%, 0.1RH

응답 시간
2초

시리얼 전송 속도
1200,2400,4800,9600(2자리 다이얼 스위치), 기본 9600

바이트 형식
8데이터 비트, 1스톱 비트, 체크 불필요

통신 주소
1~63(6자리 다이얼 스위치), 기본 1


변환 어댑터



이 변환 어댑터를 사용하여 USB-RS485를 변환합니다.
WINGONEER USB 2.0 to RS485 직렬 컨버터 어댑터 CP2104 SN75176 FUSE + TVS, FT232보다 안정적인 이중 보호

사용중인 라이브러리 "PyModbus"



아래에서 쉽게 설치할 수 있습니다.
pip install pymodbus

배선



USB 어댑터를 사용한 구성이므로 매우 간단합니다.


전원이 DC8V ~ 48V로 크기이므로 조심하십시오. 위 사진에서 센서가 붉게 빛나고 있다고 생각합니다만 전원 부족하지 않으면 빛나지 않습니다. 극성은 신경 쓰지 않고 괜찮습니다.

RS485의 A, B를 맞추어 배선합니다.



아래 사진과 같이 이 온습도계는 플러스 마이너스 반대로도 움직입니다. (역으로도 움직이는지의 테스트 때의 사진이었습니다・・)



USB 어댑터를 꽂을 때 어떤 장치가 인식했는지 확인하십시오. USB에 꽂은 직후에 dmesg 보면 알기 쉽습니다. 아래의 로그를 보면 ttyUSB0임을 알 수 있습니다.
$ dmesg | tail -n 5
[ 7533.026509] usb 1-1.3: Product: CP2104 USB to UART Bridge Controller
[ 7533.026524] usb 1-1.3: Manufacturer: Silicon Labs
[ 7533.026538] usb 1-1.3: SerialNumber: 00868CDA
[ 7533.032198] cp210x 1-1.3:1.0: cp210x converter detected
[ 7533.042672] usb 1-1.3: cp210x converter now attached to ttyUSB0
$ ls /dev/ttyUSB0
/dev/ttyUSB0

PyModbus를 사용하여 얻기



PyModbus를 사용하면 다음과 같이 쉽게 온도와 습도를 얻을 수 있습니다.
from pymodbus.client.sync import ModbusSerialClient

client = ModbusSerialClient(baudrate=9600, port="/dev/ttyUSB0", method="rtu")
if client.connect():
  res = client.read_holding_registers(address=0, count=2, unit=1)
  temperature = res.registers[0]/10
  print(f"Temperatur:\t{temperature} ℃")
  humidity  = res.registers[1]/10
  print(f"Humidity:\t{humidity} %")
  client.close()

이하 조금 설명합니다.

port에는 USB를 꽂을 때 Linux에서 인식되는 장치를 지정합니다. baudrate는 위의 스펙의 표에 있는 대로 조정 가능합니다만, 디폴트에서는 9600이므로 그것을 지정합니다.
ModbusSerialClient(baudrate=9600, port="/dev/ttyUSB0", method="rtu")

여기서 Socket 통신이 열립니다.
if client.connect():

예를 들면 다음과 같이 connect한 후, client.socket 에 대해서 Modbus의 명령을 직접 던지는 것도 가능합니다.


실행해보기



다음과 같이 온도와 습도를 얻을 수 있었습니다.



참고한 기사



비슷한 구성을 Golang에서 구현하고 주변의 내용도 써 주시고 있습니다.

이번은 RS485의 USB 변환 장치를 사용했습니다만, 전에 GPIO 경유로 했을 때의 기사입니다. 실은 외형은 함께입니다만 별도의 온습도 센서를 사용하고 있습니다.

좋은 웹페이지 즐겨찾기