라즈베리파이, 아두이노

[라즈베리파이] USB 컨버터(RS485/RS232)를 이용한 시리얼 통신 읽/쓰기 파이썬 예제

포도알77 2019. 3. 27. 10:30

 라즈베리파이(Raspberry pi / RPi)에 USB TTL 컨버터(RS485/RS232)를 이용하여 시리얼 통신하는 예제 코드를 작성하여 둔다.


 우선 컨버터를 이용하기 때문에 결국 프로토콜이 RS232이든 반이중 RS485이든 결국 라즈베리파이에 들어오는 것은 serial임을 기억해야 한다. (USB를 안쓰고 TTL 기반의 컨버터를 써도 결과는 똑같다. 다만 GPIO를 이용하는것 차이이다.)


 USB를 통하여 통신하는 경우, Java의 RXTX 라이브러리나 파일 자체(리눅스는 모든 장치를 파일로 처리하므로 /dev 안의 파일)를 읽,쓰기 해도 무방하다.


 하지만 Python을 이용하는 것이 별도의 라이브러리를 설치하지 않고 딱 좋은 것 같다. 따라서 Python의 PiSerial를 이용한 예제 코드가 포스팅된다.



1. 라즈베리파이 구성


 현재 라즈베리파이에는 총 4개의 USB 장치가 연결되어 있다.

사진 상단의 USB 포트에는 마우스, 키보드가 연결되어 있고, 하단의 USB 포트에는 전면측에 USB to RS232, 후면부에 USB to RS485 컨버터 케이블이 연결되어 있다.





2. 예제 코드

import os, sys
import serial
import time

# 시리얼 장치 연결
# 보레이드 9600, 장치 위치 ttyUSB0
ser = serial.Serial('/dev/ttyUSB0',9600, timeout = 5)

def run():
    #시리얼 쓰기
    ser.write(bytes(bytearray([0x01,0x02,0x03,0x04,0x05])))
    while True:
        # 시리얼 읽기 (5바이트씩 읽음)
        line = ser.read(5)
        if len(line) == 0:
                break;
        # 헥사 코드로 출력  
        hex_list = ["{:x}".format(ord(c)) for c in line];
        print ''.join(hex_list)
while True:
    run();
 여기서 /dev/ttyUSB0는 USB장치 위치이다. 0이라는 번호는 여러 장치를 연결하는 경우 달라질 수 있으므로, 아래의 3번을 이용해서 장치 번호를 알아야 한다.




3. lsusb 명령과 grep 명령으로 USB 장치 찾기


(1) ls /dev/ttyUSB* 명령 실행

ls /dev/ttyUSB*

 이 명령을 수행하면, 현재 드라이버가 잡혀서 정상 설치된 USB 장치 목록이 나타난다. 장치 목록은 ttyUSB[0-9]+ 형태이며, 해당 장치가 내가 원하는 장치인지 확인할 필요가 있다.


(2) lsusb 명령 실행

lsusb
 이 명령을 수행하고 나면, 현재 라즈베리파이에 연결된 USB 장치 목록이 나타난다. 아래 사진에서 볼 수 있듯 내가 설치한 RS485 컨버터(CP210x)와 RS232 컨버터(FT232)가 첫줄과 두번째 줄에 노출되어 있다.

(3) cat 명령어 실행

cat /sys/bus/usb-serial/devices/ttyUSB0/../uevent 
 이 명령을 수행하면, 해당 ttyUSB* 장치의 ID 정보(lsusb에서 노출되는 동일한 값)를 얻을 수 있다.

 Product 라인을 보면 ttyUSB0는 10c4/ea60으로 적혀있는데, lsusb에서 노출된 10c4:ea60과 동일함을 알 수 있다.

 따라서 RS485 장치는 ttyUSB0에 연결됨을 알 수 있다.







페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사