- RS-485 직렬 통신
- 필요한 구성 요소
- 회로도
- RS485 직렬 통신을위한 STM32F103C8 및 Arduino UNO 프로그래밍
- STM32F103C8과 Arduino UNO 간의 RS485 통신 테스트 :
통신 프로토콜은 디지털 전자 장치 및 임베디드 시스템의 필수 부분입니다. 여러 마이크로 컨트롤러와 주변기기의 인터페이스가있는 곳에서는 데이터를 교환하기 위해 통신 프로토콜을 사용해야합니다. 여러 종류의 직렬 통신 프로토콜을 사용할 수 있습니다. RS485는 직렬 통신 프로토콜 중 하나이며 산업 프로젝트 및 중장비에 사용됩니다.
이전 튜토리얼에서 Arduino Uno와 Arduino Nano 간의 RS485 직렬 통신에 대해 배웠습니다 . 이 튜토리얼은 STM32F103C8 마이크로 컨트롤러에서 RS-485 직렬 통신을 사용하는 방법에 관한 것 입니다. STM32 마이크로 컨트롤러를 처음 사용하는 경우 Arduino IDE를 사용하여 STM32 시작하기: LED 깜박임으로 시작하고 여기에서 모든 STM32 프로젝트를 확인하십시오.
이 튜토리얼에서 Master STM32F103C8에는 RS-485 직렬 통신을 사용하여 Slave Arduino Uno에있는 3 개의 LED 상태를 제어하는 데 사용되는 3 개의 푸시 버튼이 있습니다.
RS-485 직렬 통신의 작동을 이해하는 것으로 시작하겠습니다.
RS-485 직렬 통신
RS-485는 클럭이 필요없는 비동기 직렬 통신 프로토콜 입니다. 차동 신호 라는 기술을 사용하여 한 장치에서 다른 장치로 이진 데이터를 전송합니다.
그렇다면이 차동 신호 전송 방법은 무엇입니까 ??
차동 신호 방법은 양극 및 음극 5V를 사용하여 차동 전압 을 생성하는 방식으로 작동합니다. 그것은 제공 반이중 사용할 때 통신을 두 개의 전선 및 전이중 사용하는 경우 통신을 네 개의 와이어를.
이 방법을 사용하면:
- RS-485는 최대 30Mbps의 더 높은 데이터 전송 속도를 지원합니다.
- 또한 RS-232 프로토콜에 비해 최대 데이터 전송 거리를 제공합니다. 최대 1200 미터까지 데이터를 전송합니다.
- RS-232에 비해 RS-485의 주요 장점은 단일 마스터가있는 다중 슬레이브이며 RS-232는 단일 슬레이브 만 지원한다는 것입니다.
- RS-485 프로토콜에 최대 32 개의 장치를 연결할 수 있습니다.
- RS-485 의 또 다른 장점은 전송시 차동 신호 방식을 사용 하므로 노이즈에 영향을받지 않습니다.
- RS-485는 I2C 프로토콜에 비해 빠릅니다.
RS-485 모듈은 직렬 포트가있는 모든 마이크로 컨트롤러에 연결할 수 있습니다. 마이크로 컨트롤러와 함께 RS-485 모듈을 사용 하려면 Maxim MAX485 IC를 기반으로하는 5V MAX485 TTL to RS485 라는 모듈 이 필요합니다. 이는 1200 미터의 장거리에서 직렬 통신이 가능하고 양방향이고 반이중은 데이터 전송 속도가 2.5이기 때문입니다. Mbps. 이 모듈에는 5V의 전압이 필요합니다.
RS-485 핀 설명:
핀 이름 |
기술 |
VCC |
5V |
ㅏ |
비 반전 수신기 입력 비 반전 드라이버 출력 |
비 |
수신기 입력 반전 드라이버 출력 반전 |
GND |
GND (0V) |
R0 |
수신기 출력 (RX 핀) |
레 |
수신기 출력 (LOW-Enable) |
DE |
드라이버 출력 (HIGH 활성화) |
DI |
드라이버 입력 (TX 핀) |
RS485 모듈에는 다음과 같은 기능이 있습니다.
- 작동 전압: 5V
- 온보드 MAX485 칩
- RS485 통신을위한 저전력 소비
- 슬 루율 제한 트랜시버
- 5.08mm 피치 2P 단자
- 편리한 RS-485 통신 배선
- 칩의 모든 핀은 마이크로 컨트롤러를 통해 제어 될 수 있습니다.
- 보드 크기: 44 x 14mm
이 모듈을 STM32F103C8 및 Arduino UNO와 함께 사용하는 것은 매우 쉽습니다. 마이크로 컨트롤러의 하드웨어 직렬 포트가 사용됩니다. STM32 및 arduino UNO의 하드웨어 직렬 핀은 다음과 같습니다.
- STM32F103C8: 핀 PA9 (TX) 및 PA10 (RX)
- Arduino Uno: 핀 0 (RX) 및 1 (TX)
프로그래밍 바로 사용도 간단 Serial.print ()를 RS-485에 기록 Serial.Read () RS-485 및 핀으로부터 읽어 DE 및 RE 의 RS-485되어 데이터를 수신 LOW를 하고 제작 에 HIGH를 RS-485 버스에 데이터 를 씁니다.
필요한 구성 요소
- STM32F103C8
- Arduino UNO
- MAX485 TTL to RS485 컨버터 모듈-(2)
- 10K 전위차계
- 푸시 버튼-3
- LED-3
- 저항기
- 브레드 보드
- 전선 연결
회로도
이 튜토리얼에서 STM32F103C8은 하나의 RS-485 모듈과 함께 마스터로 사용되며 Arduino UNO는 다른 RS-485 모듈과 함께 슬레이브로 사용됩니다.
RS-485와 STM32F103C8 (마스터) 간의 회로 연결:
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE 레 |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
ㅏ |
슬레이브 RS-485의 A |
비 |
슬레이브 RS-485의 B로 |
3 개의 푸시 버튼이있는 STM32F103C8:
10k의 풀다운 저항 3 개가있는 3 개의 푸시 버튼이 STM32F103C8의 핀 PA0, PA1, PA2에 연결됩니다.
RS-485와 Arduino UNO (슬레이브) 간의 회로 연결:
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE 레 |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ㅏ |
마스터 RS-485의 A로 |
비 |
마스터 RS-485의 B로 |
330ohm의 저항을 가진 LED의 양극이 Arduino UNO의 핀 4, 7, 8에 연결되고 LED의 음극이 GND에 연결된 경우 3 개의 LED가 사용됩니다.
RS485 직렬 통신을위한 STM32F103C8 및 Arduino UNO 프로그래밍
Arduino IDE는 STM32 및 Arduino UNO와 같은 두 보드의 개발 및 프로그래밍에 사용됩니다. 그러나 확실히 당신은에서 해당 포트를 선택했는지 확인 도구 -> 포트 에서와 보드 도구 -> 보드. 어려움이나 의심스러운 점이 있으면 ARDUINO IDE에서 STM32 프로그래밍을 참조하십시오. 이 튜토리얼의 프로그래밍은 STM32F103C8 (마스터) 용 섹션 1과 Arduino UNO (슬레이브) 용 섹션 2 개로 구성됩니다. 두 코드 모두 아래에서 하나씩 설명됩니다.
마스터로 STM32F103C8마스터 측에서 푸시 버튼의 상태를 읽고 STM32F103C8의 하드웨어 직렬 포트 1 (PA9, PA10)을 통해 RS-485 버스에 해당 값을 직렬로 기록합니다. 또한 현재 필요한 외부 라이브러리가 없습니다. Arduino에는 직렬 통신에 필요한 모든 라이브러리가 있습니다.
9600의 속도로 하드웨어 직렬 핀 (PA9, PA10)을 사용하여 직렬 통신을 시작합니다.
Serial1.begin (9600);
STM32F103C8의 핀 PA0, PA1, PA2에서 푸시 버튼의 상태를 읽고 변수 button1val, button2val, button3val에 저장합니다. 버튼을 누르면 HIGH, 누르지 않으면 LOW가됩니다.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
버튼 값을 직렬 포트로 보내기 전에 RS-485의 DE & RE 핀은 STM32F103C8의 PA3 핀에 연결된 HIGH이어야합니다 (핀 PA3을 HIGH로 만들기):
digitalWrite (enablePin, HIGH);
다음으로 시리얼 포트에 해당 값을 입력하고 누름 버튼을 눌렀는지에 따라 값을 전송하려면 if else 문을 사용하고 버튼을 눌렀을 때 해당 값을 전송합니다.
첫 번째 버튼을 누르면 조건이 일치하고 값 '1'이 Arduino UNO가 연결된 직렬 포트로 전송됩니다.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
마찬가지로 버튼 2를 누르면 값 2가 직렬 포트를 통해 전송되고 버튼 3을 누르면 값 3이 직렬 포트를 통해 전송됩니다.
그렇지 않으면 (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
버튼을 누르지 않으면 0 값이 Arduino Uno로 전송됩니다.
else { int num = 0; Serial1.println (num); }
이것으로 STM32를 마스터로 구성하는 프로그래밍이 완료됩니다.
슬레이브로서의 Arduino UNOSlave 측에서 Arduino UNO는 RS-485 모듈이 연결된 Arduino UNO (P0, 1)의 하드웨어 직렬 포트에서 사용할 수 있는 Master STM32F103C8에서 전송되는 정수 값을 수신합니다.
값을 읽고 변수에 저장하기 만하면됩니다. 수신 된 값에 따라 Arduino GPIO에 연결된 해당 LED가 켜지거나 꺼집니다.
마스터로부터 값을 받으려면 RS-485 모듈의 DE & RE 핀을 LOW로 만드십시오. 따라서 Arduino UNO의 핀 2 (enablePin)는 LOW가됩니다.
digitalWrite (enablePin, LOW);
이제 직렬 포트에서 사용 가능한 정수 데이터를 읽고 변수에 저장하십시오.
int 수신 = Serial.parseInt ();
수신 된 값 (0, 1, 2, 3)에 따라 해당하는 3 개의 LED 중 하나가 켜집니다.
if (receive == 1) // 수신 된 값에 따라 해당 LED가 켜짐 또는 꺼짐 { digitalWrite (ledpin1, HIGH); } else if (receive == 2) { digitalWrite (ledpin2, HIGH); } else if (receive == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
이것으로 Arduino UNO를 슬레이브로 프로그래밍하고 구성하는 작업이 완료됩니다. 또한 이로써 Arduino UNO 및 STM32에 대한 전체 구성이 완료됩니다. 작동하는 비디오와 모든 코드는이 튜토리얼의 끝에 첨부됩니다.
STM32F103C8과 Arduino UNO 간의 RS485 통신 테스트:
1. Master STM32에 연결된 Push button-1을 누르면 Slave Arduino에 연결된 LED 1이 켜집니다.
2. Master STM32에 연결된 Push button-2를 누르면 Slave Arduino에 연결된 LED 2가 켜집니다.
3. 유사하게 Push button-3을 누르면 Slave Arduino에 연결된 LED 3이 켜집니다.
이것으로 STM32F103C8과 Arduino UNO 간의 RS485 직렬 통신 이 완료 됩니다. Arduino UNO 및 STM32 보드는 신속한 프로토 타이핑을 위해 널리 사용되는 보드이며 이러한 보드에서 많은 유용한 프로젝트를 수행했습니다. 의심스러운 점이 있거나 제안 사항이 있으면 아래에 작성하고 의견을 말하십시오.