[Python] USB to RS485 시리얼통신(Hamilton Valve MVP-4와 PC 통신)
처음으로 장비 관련 개발을 해보고 있다. (장비가 맞나..?)
시리얼통신으로 라즈베리파이와 장비를 연동하여 파이썬 코드에서 장비값을 받아오거나 동작시켜야 한다.
통신 관련된 지식도 없고.. 이런 장비를 제어해 본 경험도 없어서 이번에도 역시 엄청 헤매면서 하고 있다.
택배로 받은 각 장비들을 보고 숨이 턱턱 막히긴 했지만.. 이 또한 지나가리.
고객사가 준 간단한 인터페이스 가이드라인을 보고 통신을 어떻게 해야하는지 찾아본 후 아래와 같이 정리해봤다.

처음에는 디텍터에서 보내오는 값을 계측기로 받아 PC에서 센서 값을 읽어오는 것을 시도했고, 여차저차 값을 받아오는 것까지 확인했다.
이번에는 RS-485 통신 인터페이스를 이용하여 PC에서 밸브를 동작시키는 것에 성공했다.
일단 연결부터 멘붕이었다.
당연히 전원을 인가하는 케이블이 있을 줄 알았는데.. 없었다.
고객사에 전화해서 문의하니 그런건 없다고 한다.
통신 케이블도 없었다. 밸브에 달린 포트는 D-SUB15 수컷이었고, 나는 이것을 PC의 USB 포트와 연결해야 했다.
이런걸 살면서 단 한번도 해본적이 없어서, 과연 이게 내가 할 수 있는건가 싶었다.
회사분들께 물어보니 밸브 전압과 맞는 어댑터나 파워서플라이 사서 선 연결해서 전원 주면 된다고 한다..
통신은 485toUSB 케이블을 열심히 찾아봤는데, 알아보니 각 장치마다 핀맵이라는게 존재해서 그냥 아무거나 사다가 쓰면 안되는 것을 알게 되었다.
즉, 한땀한땀 선을 따서 전원 및 통신 케이블을 직접 제작해야 하는 상황.
이래저래 알아본 후 연결을 위한 부품들을 구매요청해서 받았다.

위의 사진 중 파워서플라이를 사용하는 대신 일반 어댑터 24V짜리를 구매한 후 선을 잘라서 사용하기로 했다.
이런걸 해본적이 없으니 이렇게 하면 되는건가.. 긴가민가 하면서 일단 진행했는데 다행히 전원이 잘 들어왔다.
이제 통신 차례.
메뉴얼에서 아래와 같이 밸브 D-Sub 15핀의 핀맵 테이블을 찾을 수 있었다.
(핀맵이라는 것이 있는지 이번에 처음 알았다.)

전원 인가를 위해서 D-SUB15 터미널 블럭(수컷)의 1번에 24V, 9번에 그라운드를 연결하고, 485통신을 위해서 11번,12번에 각각 T+,T-를 연결해줬다.
밸브의 포트는 수컷이고, 터미널 블럭은 암컷이기 때문에 핀 번호가 반전되니 주의해야 한다.
터미널 블럭 구매 페이지를 가보니 아래와 같이 핀 번호 그림이 제공되어 있었다.


그리하여 위와 같이 D-SUB 15 터미널블럭 커넥터를 제작했다.
커넥터 하나 만들었는데 뭔가 전문가가 된 것 같고 괜히 뿌듯했다.
생각보다 알아가는 재미가 꽤나 있었다.
이제 터미널블럭 커넥터와 USB to 485 커넥터를 연결해야 했다.
USB to 485 제품 메뉴얼을 보니 485 통신은 T-, T+ 만 연결하면 된다더라.
그래서 11번과 T+, 12번과 T- 가 연결되도록 선을 연결했다.
무슨 485통신 드라이버를 설치해야한다고 해서 설치했다.
장치와 PC 간 시리얼 통신을 하기 위해서 아주 중요한 것이 있다.
장치와 연결되는 PC 포트의 통신 속도를 통신하고자 하는 장치의 통신 속도(보레이트, Baud Rate)로 같게 맞추기.
통신 속도는 데이터 비트가 전송되는 비트 속도를 나타낸다.
일반적으로 사용되는 속도에는 9600, 19200, 38400, 115200 bps 등이 있다.
장치를 PC에 올바르게 연결하면 다음과 같이 장치관리자의 포트에 새롭게 포트가 추가된다.
(미리 장치관리자의 포트를 열어놓은 후 장치를 연결해서 추가되는 포트를 확인해보자)
나의 경우 USB포트에 연결하니 COM4가 추가 되었다.
속성의 포트 설정 탭에 들어가 비트/초(B)를 장치의 보레이트와 같게 변경했다.
(장치의 보레이트는 보통 데이터시트나 메뉴얼에 적혀있다.)


고객사가 준 Hamilton MPV-4 밸브의 경우 밸브에 달린 DIP Switch를 조절하여 9600과 38400을 선택할 수 있게 되어있었다. 메뉴얼대로 3번 스위치를 ON으로 변경했다.
사실 처음에는 이게 스위치인지도 몰랐는데 메뉴얼을 보다보니 제어하기 위해서 꼭 설정해줘야 하는 것이었다.

또 여러 밸브를 연결했을 때 처음 밸브와 마지막 밸브는 ON으로 해줘야 하고, 한 개만 사용한다면 역시 7,8번을 ON으로 해야된다고 적혀있었다.

그렇게 해서 아래와 같이 통신을 위한 구성을 만들었다.

구글링을 하여 아래와 같이 485 시리얼 통신 코드를 만들어 실행해 보았다.
import serial
import serial.rs485
ser = serial.Serial('COM4', baudrate=38400, timeout=1)
ser.rs485_mode = serial.rs485.RS485Settings()
print(ser)
command = "/1ZR<CR>"
command_bytes = command.encode('ASCII')
print(command_bytes)
ser.write(command_bytes)
response = ser.readline().decode()
ser.close()
if response:
print("Response:", response)
else:
print("No response received from MVP.")
실행을 하니 커넥터의 TD LED에서 초록불이 깜빡이긴 했는데, Response가 들어오지 않았다.
선을 잘 못 연결한 것인지, 더 설치해야 할 것이 있는지, 선 두께가 얇아서 그런 것인지, 코드가 잘못된 것인지...
경험도 지식도 없으니 안 되는 이유를 알 길이 없었다. 감도 안 잡혔다.
다시 고난의 시간..
선을 여기 연결했다가 바꿔봤다가.. 메뉴얼을 봤다가.. 검색도 해봤다가.. GPT에도 물어봤다가..
코드를 이것저것 바꿔봤다가..
별 짓을 다 해봤다.
그러다가 메뉴얼에서 command 맨 끝 부분에는 꼭 <CR>을 넣어줘야한다고 적혀있었는데, <CR>이 뭔가 검색해봤다.
뭐.. 커서를 맨 앞으로 옮겨주는 것이라고 한다. 알고보니 커맨드에 직접 <CR>이라고 입력하는 것이 아니라 \r이라고 입력해야 된다는 것을 알게 되었다.
그래서 위의 command 코드를 수정했다.
command = "/1ZR\r"
그리고 실행하니, 뿌우우우 하면서 밸브 모터가 작동했다..!!
생판 모르는 분야를 무작정 하려니 어렵고 이해도 안 되고 감도 안 잡히지만..
이것도 역시 맨땅에 헤딩질을 하다보면 실력이 조금씩 늘지 않을까 싶다.