라즈베리파이, 아두이노

[간단한 아두이노 코딩] 18. RS485 통신 해보기 (TTL to RS485 컨버터)

포도알77 2020. 11. 24. 10:31

RS485 통신 해보기 (TTL to RS485 컨버터)

 

1. RS485 통신이란

 RS485는 이름에서 알 수 있듯, Serial 통신의 하나이다. RS232 혹은 UART와는 달리 오직 2개의 선으로 여러 장치를 병렬로 연결하여 통신할 수 있다는 장점이 있다. 물론 속도는 느린 편이지만, 선의 개수가 적고 높은 전압(일반적으로 +-12볼트)를 사용하기 때문에 최대 4000피트(약 1.2km)까지 통신할 수 있다.

 

 아래는 RS485의 연결도를 나타낸다.

 

 위 그림에서 알 수 있듯 총 4개의 장치가 같은 A와 B라인에 연결되어 있다. 즉, 한 시점는 반드시 한개의 장치만 데이터를 전송할 수 있다.(half-duplex) 또한 각 장치들은 모두 같은 보 레이트(Buad Rate)와 설정을 가지고 있어야 함을 알 수 있다.

 

2. TTL to RS485 컨버터

 직전 [간단한 아두이노 코딩] 17. USB to TTL 컨버터 사용해보기에서 말했듯 일반적인 TTL 컨버터는 한쪽이 5V 전압을 사용하는 UART 통신을 수행할 수 있음을 뜻한다.

 

 따라서 RS485 통신 테스트를 해보고 싶다면, TTL to RS485 컨버터를 2개 사용하거나 혹은 직전과 같이 TTL to RS485와 RS480 to USB 컨버터를 이용하여 컴퓨터와 연결해서 확인해야 한다.

 

 그리고 컨버터 중에는 A, B 라인이 아닌 R+, T+ R-, T- 총 4개의 라인을 사용하는 제품이 있는데 이 제품은 +라인끼리(R+, T+) 연결하여 A라인으로, -라인끼리(R-, T-) 연결하여 B라인으로 생각하면 된다.

 

 4라인 제품은 2개의 +,- 라인 페어를 통하여 전이중(Full Duplex)할 수 있다. 다만, 대부분의 RS485 장치들이 반이중(Half-duplex)만 지원하는 경우가 많기 때문에 이 포스팅에서는 묶어서 반이중으로 사용한다.

 

 

3. 대표적인 RS485 컨버터

 왼쪽부터 MAX485 칩셋 기반 TTL 컨버터, 저렴한 USB to RS485(SZH-CVBE-008, CH340 칩셋) 그리고 리얼시스 USB to 485/422 겸용 컨버터이다.

 

 실제로 TTL 컨버터는 모델 실증용으로 사용했고, 좌측 두개는 필드에서 테스트해본 결과 두번째 제품은 저렴한 대신 정말 잘 죽는다. 리얼시스는 제일 비싼만큼 튼튼했지만 너무 비싸다는게 단점.

 

 아무튼 우리는 간단한 통신 테스트를 진행하는 것이므로 TTL to RS485 (MAX485 칩셋) 컨버터를 이용할 것이다.

 

 

4. 회로도

  회로도와 같이 각 아두이노에 RS485 TTL 컨버터의 RO를 0번(Rx), DI를 1번(Tx) 그리고 RE, DE를 7번에 연결하자.

그리고 두번째 아두이노에는 A5번에 LED를 하나 연결해주자.

 그리고 두 컨버터의 A와 B라인을 서로 연결해주자. 교차하는 것이 아니다. (만약 USB 컨버터가 있다면 A 아두이노 대신 USB to RS485 A, B 라인을 연결해주면 된다.)

 

 이제 A 아두이노에서 영어 O와 X를 1초 간격으로 전달 할 것이다. 그러면 B 아두이노는 O와 X를 읽어 LED를 O일 때 켜고 X일 때 끌 것이다. (A는 MASTER/송신, B는 SLAVE/수신)

 

5. 소스코드

 A 아두이노 소스코드

// A 아두이노 마스터 송신
#include <SoftwareSerial.h>

#define ENABLE 7

// RO(Rx-0번), DI(Tx-1번)
SoftwareSerial rs485(0,1);
void setup() {
  rs485.begin(9600);
  pinMode(ENABLE, OUTPUT);
  // RE/DE에서 Write시에 HIGH
  // Read시에 LOW이지만, 여기서는 보내기만 한다.
  digitalWrite(ENABLE, HIGH);
}

void loop() {
  rs485.print('O');
  delay(1000);
  rs485.print('X');
  delay(1000);
}

 

 B 아두이노 소스코드

// B 아두이노 슬레이브 수신
#include <SoftwareSerial.h>

#define ENABLE 7
#define LED 13

// RO(Rx-0번), DI(Tx-1번)
SoftwareSerial rs485(0,1);
void setup() {
  rs485.begin(9600);
  pinMode(ENABLE, OUTPUT);
  pinMode(LED, OUTPUT);
  // RE/DE에서 Write시에 HIGH
  // Read시에 LOW이지만, 여기서는 받기만 한다.
  digitalWrite(ENABLE, LOW);
}

void loop() {
  if(rs485.available()>=1){
    char val = rs485.read();
    if(val=='O')
      digitalWrite(LED, HIGH);
    else if(val=='X')
      digitalWrite(LED, LOW);
  }
}

 

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