Arduino Uno 로 시리얼(Serial) 직렬통신을 해보고 RS485 통신으로 동시에 여러개의 아두이노와 통신해 보는 프로젝트 입니다
시리얼통신 이란?
임베디드 시스템은 각종 프로세서와 회로들 간에 서로 통신하며 데이터를 주고 받는것이 기본입니다
임베디드 시스템에서 데이터를 주고 받을때 주로 사용하는 통신방법에는 크게 패러럴(병렬, parallel)과 시리얼(직렬, serial) 통신 방식이 있습니다
패러럴(Parallel) 통신방식은 다수의 비트(bit)를 한번에 전송하는 방법입니다
보통 8 또는 16 또는 그 이상의 라인을 통해 동시에 데이터를 보내줍니다
타이밍(clock)에 맞춰 모든 라인이 같이 동작할 수 있도록 clock(CLK) 라인이 필요하므로 8-bit data bus 의 경우 9라인이 사용됩니다
시리얼(Serial) 통신방식은 데이터를 스트림으로 바꿔서(직렬화, serialization) 한 번에 한 비트씩 전송합니다
시리얼 통신은 clock 라인을 포함 2라인으로 데이터를 전송할 수 있습니다
1.직렬 통신은 하나 또는 두 개의 전송 라인을 사용하여 데이터를 송수신하는 통신 방법으로, 한 번에 한 비트 씩 데이터를 지속적으로 주고 받습니다
적은 신호선으로 연결이 가능하기 때문에 선재와 중계 장치의 비용이 억제되는 등의 장점이 있습니다
2. 시리얼 통신 규격
RS-232C / RS-422A / RS-485는 EIA (전자 산업 협회) 통신 표준입니다
이러한 통신 표준 중 RS-232C는 다양한 응용 분야에서 널리 채택되어 왔으며 컴퓨터의 표준 장비이기도합니다
모뎀 및 마우스 연결에 사용됩니다. 센서 및 액추에이터에는 이러한 인터페이스가 포함되어 있으며 대부분이 직렬 통신을 통해 제어 할 수 있습니다
RS-232C
이 직렬 통신 표준은 널리 사용되며 종종 표준으로 컴퓨터에 장착됩니다."EIA-232"라고도합니다
신호선과 커넥터의 목적과 타이밍이 정의되었습니다 (D-sub 25 핀 또는 D- sub 9 핀).
현재 표준은 신호선을 추가하여 개정되었으며 정식으로 "ANSI / EIA-232-E"라고합니다. 그러나 지금은 일반적으로 "RS-232C"라고도합니다
RS-422A
이 표준은 짧은 전송 거리 및 느린 전송 속도와 같은 RS-232C 문제를 수정합니다, "EIA-422A"라고도합니다.
신호선의 목적과 타이밍은 정의되었지만 커넥터는 아닙니다. 많은 호환 제품 주로 D-sub 25 핀 및 D-sub 9 핀 커넥터를 사용합니다
RS-485
이 표준은 RS-422A에서 몇 가지 연결 장치의 문제점을 수정합니다, "EIA-485"라고도합니다
RS-485는 RS-422A와 호환 가능한 표준입니다.
신호선의 목적과 타이밍이 정의되지만 커넥터 대부분의 호환 제품은 주로 D-sub 25 핀 및 D-sub 9 핀 커넥터를 채택합니다
RS-485 (EIA-485 표준)는 RS-422보다 개선된 버전으로, 디바이스 수를 10개에서 32개로 늘리고 최대 부하에서 적절한 신호 전압을 보장하는 데 필요한 전기적 특성을 정의합니다. 이 강화된 멀티드롭(multidrop) 기능으로 단일 RS485 시리얼 포트에 연결된 디바이스의 네트워크를 생성할 수 있습니다. PC에 네트워크 연결된 여러 분산 디바이스가 필요하거나 데이터 수집, HMI 또는 기타 작업을 위해 컨트롤러를 필요로 하는 산업용 어플리케이션에 있어, 노이즈 제거 및 멀티드롭 (multidrop) 기능을 갖춘 RS485는 최상의 선택입니다. RS-485는 RS-422의 상위 집합이므로, 모든 RS-422 장치는 RS-485로 제어할 수 있습니다. RS-485 하드웨어는 최대 4000 피트 케이블을 통한 시리얼 통신에 사용될 수 있습니다.
RS485의 가장 큰 장점은 역시 32개의 디바이스와 통신할 수 있는 멀티드롭 기능입니다
사용된부품
Arduino Uno Italy
미니 브래드보드
점퍼케이블
RS485 to TTL 시리얼 컨버터
UBS to RS485 변환 컨버터
구성 배선도-RS485 시리얼 통신해 보기 (여러개의 아두이노와 통신해 보기)
사용된 예제코드
테스트방법
위 배선도를 참조하여 USB to RS485 모듈 과 RS485 to TTL 모듈 을 사용해서 일단 한개의 아두이노로 RS485 통신을 해봅니다
배선후 PC의 장치관리자를 확인해 보면 USB to RS485 의 COM포트는 COM9 , 아두이노의 COM포트는 COM5 인것을 확인 할 수 있습니다
아두이노에 위 첨부된 'RS485 example code' 를 컴파일 업로드해 줍니다
아두이노 IDE 2개를 실행 시키고 시리얼 모니터를 COM9 와 COM5 각각 2개를 열어 줍니다
RS485 통신을 할 것이므로 USB to RS485 의 COM포트인 COM9 의 시리얼 모니터의 콘솔 입력창에 원하는 메세지를 입력합니다
그러면 RS485 to TTL 컨버터를 통해 TTL레벨로 변환되어 아두이노의 COM5 시리얼 모니터에 데이터가 전송되어 출력됩니다
여러개(본 테스트 에서는 2개로 테스트 하였습니다) 의 아두이노와 동시에 통신하는 방법도 동일하게 테스트 하면 됩니다
여러개(2개)의 아두이노 배선후 PC의 장치관리자를 확인해 보면 USB to RS485 의 COM포트는 COM83 , 아두이노의 COM포트는 COM5 와 COM7 인것을 확인 할 수 있습니다
여러개(2개)의 아두이노에 위 첨부된 'RS485 example code' 를 컴파일 업로드해 줍니다
아두이노 IDE 3개를 실행 시키고 시리얼 모니터를 COM83 과 COM5 COM7 각각 3개를 열어 줍니다
RS485 통신을 할 것이므로 USB to RS485 의 COM포트인 COM83 의 시리얼 모니터의 콘솔 입력창에 원하는 메세지를 입력합니다
그러면 RS485 to TTL 컨버터를 통해 TTL레벨로 변환되어 아두이노의 COM5 과 COM7 시리얼 모니터에 데이터가 전송되어 출력됩니다
예제코드 입니다
#define SerialTxControl 10 //RS485 제어 접점 핀 arduino pin 10
#define RS485Transmit HIGH
#define RS485Receive LOW
char buffer[100];
void setup(void) {
Serial.begin(9600);
pinMode(SerialTxControl, OUTPUT);
digitalWrite(SerialTxControl, RS485Transmit);
Serial.println("TEST");
delay(100);
digitalWrite(SerialTxControl, RS485Receive);
}
void loop(void) {
digitalWrite(SerialTxControl, RS485Receive); // 포트에서 데이터를 읽음
int i=0; if(Serial.available()){delay(100);
while( Serial.available() && i< 99)
{ buffer[i++] = Serial.read();} buffer[i++]='\0';}
if(i>0)
{
Serial.println(buffer); // 다른 장치로 출력
}
}
프로젝트 동영상-RS485 시리얼 통신해 보기
프로젝트 동영상-RS485 시리얼 통신해 보기 (여러개의 아두이노와 통신해 보기)
위 테스트에서는 RS485통신으로 RS485 모듈에서 데이터를 송신하고 아두이노 우노에서 데이터를 수신을 하였는데요
반대로 아두이노 우노에서 데이터를 송신하고 RS485 모듈에서 데이터를 받을수도 있습니다
Arduino Uno로 RS485 to TTL 모듈과 USB to RS485 모듈을 사용해서 마스터&슬레이브로 통신해 보기
방법은 간단합니다, 위 테스트와 배선도 동일하게 하고 예제도 동일하게 첨부된 예제를 업로드 하면 되지만
예제코드에서 아래 부분을
#define RS485Transmit HIGH
#define RS485Receive LOW
#define RS485Transmit LOW
#define RS485Receive HIGH
이렇게 수정해 주면 됩니다
프로젝트 동영상-USB to RS485 & RS485 to TTL 모듈을 사용해서 마스터&슬레이브로 데이터 주고 받기
댓글