- RS-485 직렬 통신 프로토콜
- Arduino의 RS-485
- 필요한 구성 요소
- 회로도
- RS485 직렬 통신을위한 Arduino UNO 및 Arduino Nano 프로그래밍
- 직렬 통신 RS485로 LED 밝기 제어
마이크로 컨트롤러와 주변 장치 간의 통신을위한 통신 프로토콜을 선택하는 것은 임베디드 시스템의 중요한 부분입니다. 임베디드 애플리케이션의 전반적인 성능은 비용 절감, 빠른 데이터 전송, 장거리 커버리지 등과 관련되어 통신 수단에 의존하기 때문에 중요합니다.
이전 튜토리얼에서 우리는 Arduino의 I2C 통신 프로토콜과 SPI 통신 프로토콜에 대해 배웠습니다. 이제 RS-485라는 또 다른 직렬 통신 프로토콜 이 있는데이 프로토콜은 비동기 직렬 통신을 사용합니다. RS-485의 가장 큰 장점은 두 장치 간의 장거리 데이터 전송입니다. 그리고 그들은 전기적으로 노이즈가 많은 산업 환경에서 가장 일반적으로 사용됩니다.
이 튜토리얼에서는 두 Arduino 간의 RS-485 직렬 통신에 대해 배우고 RS-485 모듈을 통해 ADC 값을 전송하여 Master Arduino에서 Slave Arduino에 연결된 LED의 밝기를 제어하여이를 시연합니다. 10k 전위차계는 마스터 Arduino에서 ADC 값을 변경하는 데 사용됩니다.
RS-485 시리얼 통신의 작동을 이해하는 것부터 시작하겠습니다.
RS-485 직렬 통신 프로토콜
RS-485는 클럭 펄스가 필요없는 비동기 직렬 통신 프로토콜입니다. 차동 신호 라는 기술을 사용하여 한 장치에서 다른 장치로 이진 데이터를 전송합니다.
그렇다면이 차동 신호 전송 방법은 무엇입니까 ??
차동 신호 방법은 양극 및 음극 5V를 사용하여 차동 전압을 생성하는 방식으로 작동합니다. 2 선 사용시 Half-Duplex 통신을 제공 하며 Full-Duplex 는 4 선 4 선이 필요합니다.
이 방법을 사용하여
- RS-485는 최대 30Mbps의 더 높은 데이터 전송 속도를 지원합니다.
- 또한 RS-232 프로토콜에 비해 최대 데이터 전송 거리를 제공합니다. 최대 1200 미터까지 데이터를 전송합니다.
- RS-232에 비해 RS-485의 주요 장점은 단일 마스터가있는 다중 슬레이브이며 RS-232는 단일 슬레이브 만 지원한다는 것입니다.
- RS-485 프로토콜에 최대 32 개의 장치를 연결할 수 있습니다.
- RS-485의 또 다른 장점은 전송시 차동 신호 방식을 사용하므로 노이즈에 영향을받지 않는다는 것입니다.
- RS-485는 I2C 프로토콜에 비해 빠릅니다.
Arduino의 RS-485
Arduino에서 RS-485를 사용 하려면 Maxim MAX485 IC를 기반으로 한 5V MAX485 TTL to RS485 라는 모듈 이 필요합니다. 이는 1200 미터의 장거리 직렬 통신이 가능하고 양방향이기 때문입니다. 반이중 모드에서는 데이터 전송 속도가 2. 5Mbps입니다.
5V MAX485 TTL to RS485 모듈 은 5V의 전압을 필요로하며 5V 로직 레벨을 사용하므로 Arduino와 같은 마이크로 컨트롤러의 하드웨어 직렬 포트와 인터페이스 할 수 있습니다.
다음과 같은 기능이 있습니다.
- 작동 전압: 5V
- 온보드 MAX485 칩
- RS485 통신을위한 저전력 소비
- 슬 루율 제한 트랜시버
- 5.08mm 피치 2P 단자
- 편리한 RS-485 통신 배선
- 칩의 모든 핀은 마이크로 컨트롤러를 통해 제어 될 수 있습니다.
- 보드 크기: 44 x 14mm
RS-485의 핀아웃:
핀 이름 |
사용하다 |
VCC |
5V |
ㅏ |
비 반전 수신기 입력 비 반전 드라이버 출력 |
비 |
수신기 입력 반전 드라이버 출력 반전 |
GND |
GND (0V) |
R0 |
수신기 출력 (RX 핀) |
레 |
수신기 출력 (LOW-Enable) |
DE |
드라이버 출력 (HIGH 활성화) |
DI |
드라이버 입력 (TX 핀) |
이 RS-485 모듈은 Arduino와 쉽게 인터페이스 할 수 있습니다. Arduino 0 (RX) 및 1 (TX)의 하드웨어 직렬 포트 (UNO, NANO)를 사용해 봅시다. 프로그래밍도 간단 합니다. Serial.print ()를 사용하여 RS-485에 쓰고 Serial.Read ()를 사용하여 RS-485에서 읽습니다.
프로그래밍 부분은 나중에 자세히 설명하지만 먼저 필요한 구성 요소와 회로도를 확인합니다.
필요한 구성 요소
- Arduino UNO 또는 Arduino NANO (2)
- MAX485 TTL to RS485 컨버터 모듈-(2)
- 10K 전위차계
- 16x2 LCD 디스플레이
- LED
- 브레드 보드
- 전선 연결
이 튜토리얼에서 Arduino Uno는 Master로 사용되고 Arduino Nano는 Slave로 사용됩니다. 여기에는 두 개의 Arduino 보드가 사용되므로 두 개의 RS-485 모듈이 필요합니다.
회로도
첫 번째 RS-485와 Arduino UNO (마스터) 간의 회로 연결:
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE 레 |
8 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ㅏ |
슬레이브 RS-485의 A |
비 |
슬레이브 RS-485의 B로 |
두 번째 RS-485와 Arduino Nano (슬레이브) 간의 연결:
RS-485 |
Arduino UNO |
DI |
D1 (TX) |
DE 레 |
D8 |
R0 |
D0 (RX) |
VCC |
5V |
GND |
GND |
ㅏ |
마스터 RS-485의 A로 |
비 |
마스터 RS-485의 B로 |
16x2 LCD와 Arduino Nano 간의 회로 연결:
16x2 LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
LCD의 콘트라스트 제어를위한 전위차계 중앙 핀에 |
RS |
D2 |
RW |
GND |
이자형 |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
ㅏ |
+ 5V |
케이 |
GND |
10K 전위차계는 아날로그 입력을 제공하기 위해 Arduino UNO의 아날로그 핀 A0에 연결되고 LED는 Arduino Nano의 핀 D10에 연결됩니다.
RS485 직렬 통신을위한 Arduino UNO 및 Arduino Nano 프로그래밍
두 보드를 프로그래밍하기 위해 Arduino IDE가 사용됩니다. 그러나 확실히 당신은에서 해당 포트를 선택했는지 확인 도구 -> 포트 에서와 보드 도구 -> 보드.
데모 비디오가 포함 된 완전한 코드는이 튜토리얼의 끝에 제공됩니다. 여기서 우리는 코드의 중요한 부분을 설명합니다. 이 튜토리얼에는 Arduino UNO (마스터) 용 프로그램과 Arduino Nano (슬레이브) 용 프로그램이 있습니다.
마스터 코드 설명: Arduino UNO
마스터 측에서는 전위차계를 변경하여 핀 A0에서 아날로그 입력을 취한 다음 Arduino UNO의 하드웨어 직렬 포트 (0,1)를 통해 RS-485 버스에 해당 값을 SerialWrite 합니다.
하드웨어 직렬 핀 (0,1)에서 직렬 통신을 시작하려면 다음을 사용하십시오.
Serial.begin (9600);
Arduino UNO의 핀 A0에서 아날로그 값을 읽고 가변 potval 에 저장 하려면 다음을 사용하십시오.
int potval = analogRead (pushval);
시리얼 포트에 potval 값을 쓰기 전에 RS-485의 핀 DE & RE 는 Arduino UNO의 8 번 핀에 연결된 HIGH 이어야합니다. 그래야 핀 8을 HIGH로 만듭니다.
digitalWrite (enablePin, HIGH);
RS-485 모듈과 연결된 Serial Port에 해당 값을 입력하려면 다음 명령문을 사용하십시오.
Serial.println (potval);
슬레이브 코드 설명: Arduino NANO
슬레이브 측에서는 Arduino Nano의 하드웨어 직렬 포트 (핀 -0,1)에서 사용할 수있는 마스터 RS-485에서 정수 값을 수신합니다. 그 값을 읽고 변수에 저장하기 만하면됩니다. 값은 (0 -1023) 형식입니다. 따라서 PWM 기술을 사용하여 LED 밝기를 제어하므로 (0-255)로 변환됩니다.
그런 다음 변환 된 값을 LED 핀 D10 (PWM 핀)에 AnalogWrite 합니다. 따라서 PWM 값에 따라 LED의 밝기가 변경되고 해당 값이 16x2 LCD 디스플레이에 표시됩니다.
Slave Arduino의 RS-485가 Master로부터 값을 수신하려면 RS-485의 DE & RE 핀을 LOW로 설정하십시오. 따라서 Arduino NANO의 핀 D8 (enablePin)은 LOW로 설정됩니다.
digitalWrite (enablePin, LOW);
그리고 Serial Port에서 사용 가능한 정수 데이터를 읽고 변수 사용에 저장합니다.
int pwmval = Serial.parseInt ();
다음으로 값을 (0-1023에서 0-255)로 변환하고 변수에 저장합니다.
int 변환 = map (pwmval, 0,1023,0,255);
다음으로 아날로그 값 (PWM)을 LED 양극이 연결된 핀 D10에 씁니다.
analogWrite (ledpin, convert);
16x2 LCD 디스플레이에서 PWM 값을 인쇄하려면
lcd.setCursor (0,0); lcd.print ("마스터의 PWM"); lcd.setCursor (0,1); lcd.print (변환);
직렬 통신 RS485로 LED 밝기 제어
전위차계를 사용하여 PWM 값을 0으로 설정하면 LED가 꺼집니다.
그리고 전위차계를 사용하여 PWM 값을 251로 설정 한 경우: 아래 그림과 같이 LED가 최대 밝기로 켜집니다.
그래서 이것이 Arduino에서 직렬 통신에 RS485를 사용할 수있는 방법 입니다.