평소와 같이 USB 웹캠이 아닌, 조명 밝기를 조절하는 컨트롤러를 같이 다루게 될 기회가 생겼다
USB 포트에 연결된 상태이므로 장치관리자에 들어가서 Device 이름을 확인해본다
내 경우엔 여기서 Prolific 어쩌구가 JV502 에 해당하는 디바이스 이름이고, 뒤에 붙은 COM5 가 현재 이 장치가 연결된 포트의 번호가 된다 (안보인다면 드라이버 설치 우선 해보자)
이 항목들을 우선 파이썬에서 불러와야 한다
방법은 매우 간단하다
사용중인 가상환경에서 pyserial 을 우선 설치한다
$ pip install pyserial
그리고 다음과 같이 코드를 짜면 끝이다
if __name__ == "__main__":
import serial.tools.list_ports
serial_ports = serial.tools.list_ports.comports()
for ports in serial_ports:
print(ports)
[OUTPUT]
COM1 - 통신 포트(COM1)
COM5 - Prolific USB-to-Serial Comm Port(COM5)
이제 원하는 디바이스와 통신하기 위해 우선 연결을 해줘야 한다
우선 코드먼저 보자면 포트이름과 통신속도(baud-rate) 를 넘겨주면 연결이 된다
port_name = "COM5" # port 이름
baud = 19200 # 디바이스의 통신 속도
ser = serial.Serial(port_name, baud, timeout=0)
여기서 통신속도(baud) 는 장치를 만든 제조사에서 배포한 사양서를 참조하면 확인할 수 있다
아래는 내가 사용중인 JV502 디바이스의 사양서 중 일부이다
참고로 사양서엔 통신모드가 RS232 로 나와있는데 RS232 는 아래와 같은 포트를 사용하지만 나는 RS232 to USB 를 사용해 usb 포트에 연결해서 쓰는중이다
어쨌든 연결까지 됐다면 이제 프로토콜에 따라 통신하면 된다
JV502 프로토콜 사양서를 예시로 가져와보면
이상한 말이 잔뜩 써져있는데 결국 통신하는데 #A1255& 이런식으로 명령어를 주면 된다는 뜻이다 #A1255& 를 예로들어 설명하자면
# : 통신시작
'A' : 아스키코드를 사용할 것이란 뜻
'1' : 컨트롤 할 채널 (위 제품의 경우 채널이 2개)
'2, 5, 5' : 위에서 명시한 채널의 전압(밝기) 값을 000 ~ 255 중 최대 밝기로 설정
'&' : 통신종료
한번 이해하고나면 매우 쉽다!
그럼 이 명령어를 컨트롤러로 보내야 밝기 조절이 가능한데 이것도 매우 간단하다
data = '#' + 'A' + '1' + '2' + '5' + '5' + '&' # channel 1 밝기 최대
ser.write(data.encode()) # 시리얼 통신에 최적화된 바이트 문자열로 통신
이렇게 제품마다 정해진 프로토콜 대로 통신하면 된다
아래는 전체코드, 매우매우매우매우매우매우간단하다
import serial.tools.list_ports
ser = serial.Serial("COM6", 19200, timeout=0) # 시리얼 연결
data = '#' + 'A' + '1' + '2' + '5' + '5' + '&' # channel 1 밝기 최대
ser.write(data.encode()) # 명령어 전송
'Programming > Python' 카테고리의 다른 글
[QT] 위젯에 이미지를 띄웠는데 이미지가 왜곡 되어 보이는 경우 해결방법 (0) | 2023.08.16 |
---|---|
Pycharm import 빨간 줄 없애기 (0) | 2023.06.20 |
[Python] Scikit-image TypeError: rescale() got an unexpected keyword argument 'multichannel' (0) | 2023.03.15 |
[Python] Could not load the Qt platform plugin "xcb" 해결방법 (0) | 2023.02.26 |
[Python] list를 부분 분리 할 때 사용하는 '*' (0) | 2022.10.06 |