- UART와 RS485 통신의 차이점
- 필요한 구성 요소
- 장거리 유선 통신을위한 회로도
- MAX485 UART-RS485 컨버터 모듈
- 이더넷 CAT-6E 케이블
- Arduino 코드 설명
- 결론
우리는 Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430 등과 같은 마이크로 컨트롤러 개발 보드를 오랫동안 센서와 보드 사이의 거리가 최대 몇 센티미터 이하인 소규모 프로젝트에서 사용하고 있습니다. 이러한 거리에서 다양한 센서 모듈, 릴레이, 액추에이터 및 컨트롤러 간의 통신은 매체의 신호 왜곡과 그 안으로 들어오는 전기적 노이즈에 대해 걱정하지 않고도 간단한 점퍼 와이어를 통해 쉽게 수행 할 수 있습니다. 그러나 10 ~ 15 미터 이상의 거리 에서 이러한 개발 보드를 사용하여 제어 시스템을 구축하는 경우 시스템이 안정적으로 작동하도록하려면 노이즈와 신호 전력을 고려해야합니다. 전송하는 동안 데이터.
Arduino로 쉽게 구현할 수있는 I2C 및 SPI와 같은 다양한 유형의 직렬 통신 프로토콜이 있으며 오늘은 데이터를 전송하기 위해 고 노이즈 산업 환경에서 매우 일반적으로 사용되는 RS485라는 또 다른 가장 일반적으로 사용되는 프로토콜을 살펴 보겠습니다. 장거리. 이 튜토리얼에서 우리는 RS485 통신 프로토콜에 대해 배우고 우리가 가지고있는 두 개의 Arduino Nano 로이 를 구현하는 방법과 MAX485 RS485에서 UART로 변환 모듈 을 사용하는 방법을 배웁니다. 이전에는 Arduino와의 MAX485 통신 및 Raspberry pi와의 MAX485 통신도 수행했으며 관심이있는 경우 확인할 수도 있습니다.
UART와 RS485 통신의 차이점
시장에서 Arduino, Raspberry Pi와 함께 일반적으로 사용되는 GPS, Bluetooth, RFID, ESP8266 등 대부분의 저가형 센서 및 기타 모듈은 TX (Transmitter) 및 RX 2 선만 필요하므로 UART TTL 기반 통신을 사용 합니다. (리시버). 표준 통신 프로토콜은 아니지만 다른 주변 장치와 직렬 데이터를 송수신 할 수있는 물리적 회로입니다. 직렬로만 데이터를 송수신 할 수 있으므로 먼저 병렬 데이터를 직렬 데이터로 변환 한 다음 데이터를 전송합니다.
UART는 비동기 전송 장치 이므로 두 장치간에 데이터를 동기화하는 클럭 신호가 없습니다. 대신 각 데이터 패킷의 시작과 끝에서 시작 및 중지 비트를 사용하여 전송되는 데이터의 끝을 표시합니다. UART 전송 데이터는 패킷으로 구성됩니다. 각 패킷에는 1 개의 시작 비트, 5-9 개의 데이터 비트 (UART에 따라 다름), 선택적 패리티 비트 및 1 또는 2 개의 정지 비트가 포함됩니다. 매우 잘 문서화되고 널리 사용되며 오류 검사를 허용하는 패리티 비트도 있습니다. 그러나 여러 슬레이브와 여러 마스터를 지원할 수 없기 때문에 몇 가지 제한이 있습니다. 최대 데이터 프레임은 9 비트로 제한됩니다. 데이터 전송을 위해 마스터와 슬레이브의 전송 속도는 서로 10 % 사이 여야합니다. 다음은 UART 데이터 라인을 통해 캐릭터가 송신기 인 방식의 예입니다. 신호 High 및 Low는 GND 레벨에 대해 측정되므로 GND 레벨을 이동하면 데이터 전송에 치명적인 영향을 미칩니다.
반면에 RS485는 장거리 및 더 빠른 속도로 사용할 수있는 여러 장치의 네트워크를 위해 개발 된보다 산업 기반 통신입니다. GND 핀에서 전압 측정이 아닌 차동 신호 측정 방법 에서 작동합니다. RS485 신호는 플로팅이며 각 신호는 Sig + 라인과 Sig- 라인을 통해 전송됩니다.
RS485 수신기는 신호 라인의 절대 전압 레벨 대신 두 라인 간의 전압 차이를 비교합니다. 이것은 잘 작동하고 통신 문제의 일반적인 원인 인 접지 루프의 존재를 방지합니다. Sig + 및 Sig- 라인이 꼬여서 케이블에 유도 된 전자기 노이즈의 영향을 무효화 하고 RS485가 최대 1200m 범위 의 데이터를 전송할 수 있도록 노이즈에 대한 훨씬 더 나은 내성을 제공하면 최상의 결과를 얻을 수 있습니다.. 또한 트위스트 페어를 사용하면 직선 케이블로 가능한 것보다 전송 속도를 훨씬 높일 수 있습니다. 작은 전송 거리에서는 RS485로 최대 35Mbps의 속도를 구현할 수 있지만 거리에 따라 전송 속도는 감소합니다. 1200m 전송 속도에서는 100kbps의 전송 속도 만 사용할 수 있습니다. 이 통신 프로토콜을 실현하려면 특수 이더넷 케이블이 필요합니다. CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A 등과 같이 사용할 수있는 이더넷 케이블에는 여러 범주가 있습니다. 자습서에서는 CAT-6E 케이블 을 사용합니다. 24AWG 와이어의 꼬인 쌍이 4 개 있으며 최대 600MHz를 지원할 수 있습니다. RJ45 커넥터로 양쪽 끝이 종료됩니다. 라인 드라이버의 일반적인 라인 전압 레벨은 최소 ± 1.5V에서 최대 약 ± 6V입니다. 수신기 입력 감도는 ± 200mV입니다. ± 200mV 범위의 노이즈는 공통 모드 노이즈 제거로 인해 기본적으로 차단됩니다. RS485 통신의 두 라인을 통해 바이트 (0x3E)를 전송하는 방법의 예입니다.
필요한 구성 요소
- 2 × MAX485 컨버터 모듈
- 2 × Arduino Nano
- 2 × 16 * 2 영숫자 LCD
- 2 × 10k 와이퍼 전위차계
- Cat-6E 이더넷 케이블
- 브레드 보드
- 점퍼 와이어
장거리 유선 통신을위한 회로도
아래 이미지는 Arduino의 장거리 유선 통신을 위한 송신기 및 수신기 회로도를 보여줍니다. 송신기와 수신기 회로가 모두 동일하게 보이지만 다른 점은 코드가 기록 된 것뿐입니다. 또한 데모를 위해 하나의 보드를 송신기로 사용하고 하나의 보드를 수신기로 사용하고 있지만 동일한 설정으로 송신기와 수신기로 작동하도록 보드를 쉽게 프로그래밍 할 수 있습니다.
위의 회로에 대한 연결 다이어그램도 아래에 나와 있습니다.
위에서 볼 수 있듯이 RJ45 커넥터를 통해 이더넷 Cat-6E 케이블의 각 끝에 연결된 Arduino nano, 16 * 2 Alphanumeric LCD 및 MAX485 UART-RS485 변환기 IC 가있는 거의 동일한 두 쌍의 회로가 있습니다. 튜토리얼에서 사용한 케이블의 길이는 25m입니다. 마스터 모드에서 작동하는 MAX RS485 모듈을 통해 RS485 신호로 변환되는 Nano 케이블을 통해 송신기 측에서 일부 데이터를 전송합니다.
수신 측에서 MAX485 컨버터 모듈은 슬레이브로 작동하고 마스터로부터의 전송을 수신하면 수신 한 RS485 데이터를 표준 5V TTL UART 신호로 다시 변환하여 수신하는 Nano에서 읽고 16 *에 표시합니다. 2 영숫자 LCD가 연결되었습니다.
MAX485 UART-RS485 컨버터 모듈
이 UART-RS485 컨버터 모듈에는 RS-485 통신에 사용되는 저전력 및 슬 루율 제한 트랜시버 인 온보드 MAX485 칩이 있습니다. 단일 + 5V 전원 공급 장치에서 작동하며 정격 전류는 300μA입니다. 반이중 통신에서 작동하여 TTL 레벨을 RS-485 레벨로 변환하는 기능을 구현합니다. 즉, 둘 다가 아닌 언제든지 송수신 할 수 있으며 최대 전송 속도 2.5Mbps를 달성 할 수 있습니다. MAX485 트랜시버는 드라이버가 비활성화 된 경우 무부하 또는 완전 부하 상태에서 120μA ~ 500μA 사이의 공급 전류를 소비합니다. 드라이버는 단락 전류로 제한되며 드라이버 출력은 열 차단 회로를 통해 높은 임피던스 상태에 배치 될 수 있습니다. 수신기 입력에는 입력이 개방 회로 인 경우 논리 높은 출력을 보장하는 오류 방지 기능이 있습니다.또한 강력한 간섭 방지 성능이 있습니다. 또한 칩의 현재 상태를 표시하는 온보드 LED가 있습니다. 즉, 칩에 전원이 공급되는지 또는 데이터를 전송 또는 수신하는지 여부를 표시하여 디버그 및 사용이 더 쉽습니다.
위에 제공된 회로도는 온보드 MAX485 IC가 다양한 구성 요소에 연결되는 방법을 설명하고 원하는 경우 브레드 보드와 함께 사용할 0.1 인치 표준 간격 헤더를 제공합니다.
이더넷 CAT-6E 케이블
장거리 데이터 전송을 생각할 때 우리는 즉시 이더넷 케이블을 통해 인터넷에 연결하는 것을 생각합니다. 오늘날 우리는 주로 인터넷 연결을 위해 Wi-Fi를 사용하지만 이전에는 각 개인용 컴퓨터로 연결되는 이더넷 케이블을 사용하여 인터넷에 연결했습니다. 이러한 이더넷 케이블을 일반 와이어에 사용하는 주된 이유는 먼 거리에서 노이즈 유입 및 신호 왜곡에 대해 훨씬 더 나은 보호를 제공하기 때문입니다. 절연 층 위에 차폐 재킷을 적용하여 전자기 간섭을 방지하고 각 전선 쌍을 함께 꼬아 서 전류 루프 형성을 방지하여 노이즈에 대한 보호를 훨씬 향상시킵니다. 양쪽 끝에 8 핀 RJ45 커넥터가있는 경우가 많습니다. CAT-4, CAT-5와 같이 사용할 수있는 이더넷 케이블에는 여러 범주가 있습니다.CAT-5E, CAT-6, CAT-6A 등.이 튜토리얼에서는 4 개의 꼬인 24AWG 와이어 쌍이 있고 최대 600MHz까지 지원할 수있는 CAT-6E 케이블을 사용합니다.
CAT-6E 케이블의 절연 층 내부에서 한 쌍의 전선이 꼬이는 모습을 보여주는 사진
CAT-6E 이더넷 케이블 용 RJ-45 커넥터
Arduino 코드 설명
이 프로젝트에서 우리는 결과를 표시하기 위해 각각 16 * 2 영숫자 LCD를 구동하는 두 개의 Arduino Nano를 사용하고 있습니다. 하나는 송신기로, 하나는 수신기로 사용합니다. 그래서 아두 이노 코드에서는 데이터를 보내거나받은 데이터를 LCD 화면에 표시하는 데 중점을 둡니다.
송신기 측의 경우:
먼저 LCD 구동을위한 표준 라이브러리를 포함하고 Arduino Nano의 D8 핀을 출력 핀으로 선언합니다. 나중에 MAX485 모듈을 송신기 또는 수신기로 선언하는 데 사용할 것입니다.
int enablePin = 8; int potval = 0; #포함
이제 설정 부분으로 이동합니다. 인 에이블 핀을 하이로 당겨 MAX485 모듈을 송신기 모드로 설정합니다. 반이중 IC이기 때문에 동시에 송수신 할 수 없습니다. 또한 여기에서 LCD를 초기화하고 환영 메시지를 인쇄합니다.
Serial.begin (9600); // 9600 전송 속도로 직렬 초기화: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("전송기 나노"); 지연 (3000); lcd.clear ();
이제 루프에서 연속적으로 증가하는 정수 값을 직렬 라인에 쓴 다음 다른 나노로 전송합니다. 이 값은 디스플레이 및 디버깅을 위해 LCD에도 인쇄됩니다.
Serial.print ("보낸 값 ="); Serial.println (potval); // RS-485 버스에 POTval 직렬 쓰기 lcd.setCursor (0,0); lcd.print ("보낸 값"); lcd.setCursor (0,1); lcd.print (potval); 지연 (1000); lcd.clear (); potval + = 1;
수신기 측:
여기서 다시 LCD를 구동하기위한 표준 라이브러리를 포함하고 Arduino Nano의 D8 핀을 나중에 MAX485 모듈을 송신기 또는 수신기로 선언하는 데 사용할 출력 핀으로 선언합니다.
int enablePin = 8; #포함
이제 설정 부분으로 이동합니다. 인 에이블 핀을 하이로 당겨 MAX485 모듈을 수신기 모드로 설정합니다. 반이중 IC이기 때문에 동시에 송수신 할 수 없습니다. 또한 여기에서 LCD를 초기화하고 환영 메시지를 인쇄합니다.
Serial.begin (9600); // 9600 전송 속도로 직렬 초기화: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("수신기 나노"); 지연 (3000); digitalWrite (enablePin, LOW); // (마스터로부터 값을 받기 위해 핀 8은 항상 LOW)
이제 루프에서 직렬 포트에 사용 가능한 것이 있는지 확인한 다음 데이터를 읽고 들어오는 데이터가 정수이므로이를 구문 분석하고 연결된 LCD에 표시합니다.
int pwmval = Serial.parseInt (); // RS-485를 통해 Master로부터 INTEGER 값 받기 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("받은 값"); lcd.setCursor (0,1); lcd.print (pwmval); 지연 (1000); lcd.clear ();
결론
이 프로젝트에 사용한 테스트 설정은 아래에서 찾을 수 있습니다.
이 프로젝트의 전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 이 방법은 장거리 데이터를 전송하는 간단하고 구현하기 쉬운 방법 중 하나입니다. 이 프로젝트에서는 MAX-485 모듈로 달성 할 수있는 최대 전송 속도보다 훨씬 낮은 9600의 전송 속도 만 사용했지만이 속도는 대부분의 센서 모듈에 적합하며 실제로 필요하지 않습니다. 케이블을 이더넷 연결로 사용하고 얻을 수있는 모든 대역폭과 전송 속도를 요구하지 않는 한 Arduino 및 기타 개발 보드로 작업하는 동안 모든 최대 속도. 혼자서 전송 속도를 가지고 놀면서 다른 이더넷 케이블 유형도 시도해보십시오. 질문이 있으시면 아래 댓글란에 남겨 주시거나 포럼을 이용하시면 최선을 다해 답변 드리겠습니다. 그때까지 아디오스!