본문 바로가기

STM32

STM32: MAX485 모듈을 사용한 RS485 통신

반응형

 

STM32: MAX485 모듈을 사용한 RS485 통신

 

RS485는 산업 및 임베디드 시스템에서 가장 널리 사용되는 통신 표준 중 하나로, 안정적인 장거리 및 다중 장치 통신을 지원합니다. 단거리 지점 간 통신으로 제한되는 UART와 달리, RS485는 차동 신호를 지원하여 잡음에 강하고 긴 케이블에서도 작동할 수 있습니다.

 

이 튜토리얼에서는 RS485 MAX485 모듈을 STM32 마이크로컨트롤러와 연결합니다 . 배선 연결, CubeMX 구성, 그리고 UART를 사용하여 RS485 통신을 활성화하는 방법을 배웁니다. 튜토리얼을 마치면 STM32와 다른 RS485 장치 간의 데이터 전송을 보여주는 예제 프로젝트를 완성하게 됩니다.

 

추천 자료:

 

RS485 통신은 STM32의 UART 주변 장치를 사용하여 수행됩니다. UART 주변 장치에 대한 내용은 이미 시리즈로 다루었으므로, 계속하기 전에 관련 튜토리얼을 먼저 확인해 보세요.

 

 

이 튜토리얼에서는 RS485-TTL 변환기 모듈을 STM32 마이크로컨트롤러와 연결하는 방법을 보여드립니다. 이 설정에는 두 개의 STM32 보드, 특히 STM32F103과 STM32F446이 사용됩니다. 이 보드들은 RS485 모듈을 통해 서로 통신하며, 반이중 직렬 통신의 실제 구현을 보여줍니다.

 

이 가이드를 마치면 MQTT 통신을 위해 STM32와 ESP8266을 함께 사용하는 방법을 이해하고, 센서 데이터 전송, 토픽 구독, 메시지 처리를 위한 RTOS 사용 등 보다 고급 IoT 프로젝트를 위한 견고한 기반을 구축할 수 있습니다.

 

STM32 RS485 통신 비디오 튜토리얼

 

이 튜토리얼은 RS485 MAX485 모듈을 STM32 마이크로컨트롤러와 연결하는 방법을 보여줍니다. 자세한 설명서와 실습용 비디오 튜토리얼을 모두 준비했습니다. 코드를 따라가면서 비디오를 시청하면 RS485 통신을 위한 배선, CubeMX 설정, 그리고 UART 구성을 실시간으로 명확하게 이해할 수 있습니다.

 

 

목차

  • RS485 통신 소개
  • RS485 MAX485 모듈 개요
  • RS485 모듈 핀아웃
  • STM32 및 RS485 배선 연결
  • RS485를 위한 STM32 CubeMX 구성
  • STM32용 RS485 통신 코드
  • STM32를 이용한 RS485 통신 결과
  • 결론

 

RS485 통신 소개

 

RS485란 무엇이고 STM32 프로젝트에서 왜 사용해야 하나요?

 

RS485는 차등 신호를 사용하여 데이터를 송수신하는 직렬 통신 표준 입니다. 단거리 및 두 장치 간에만 적합한 단순 UART 통신과 달리, RS485는 장거리, 신뢰성 있는 다중 장치 통신을 위해 설계되었습니다 . 최대 1,200m의 케이블 길이를 지원하며, 여러 장치(최대 32대 이상)가 동일한 통신 버스를 공유할 수 있습니다.

 

STM32 프로젝트에서 RS485는 산업 자동화, 센서 네트워크, 모터 컨트롤러, 스마트 에너지 계량기 등 전기적으로 노이즈가 많은 환경에서 여러 장치가 장거리에 걸쳐 안정적으로 통신해야 하는 경우에 자주 사용됩니다. STM32 마이크로컨트롤러는 MAX485 모듈 과 같은 외부 트랜시버와 결합되어 익숙한 UART 주변장치를 사용하면서도 RS485 통신을 쉽게 구현할 수 있도록 합니다 .

 

UART 통신보다 RS485 통신의 장점

 

UART는 단거리 지점간 통신에 간단하고 효과적이지만, 거리, 잡음 내성, 장치 수 측면에서 한계가 있습니다 . RS485는 다음과 같은 기능을 제공하여 이러한 문제를 해결합니다.

 

  • 장거리 통신 – RS485는 최대 1200m 까지 안정적인 데이터 전송을 지원하는 반면, UART는 일반적으로 몇 미터로 제한됩니다.
  • 멀티드롭 기능 – 두 개의 장치만 연결하는 UART와 달리 RS485는 여러 장치(마스터-슬레이브 또는 멀티 마스터)가 동일한 버스를 공유할 수 있도록 합니다.
  • 잡음 내성 – RS485는 차동 신호 방식을 사용합니다 . 즉, 데이터가 두 선(A선과 B선) 사이의 전압 차이로 전송됩니다. 따라서 잡음에 대한 내성이 뛰어나 산업 환경에 적합합니다.
  • 더 높은 데이터 무결성 – RS485는 잡음 저항성과 차동 신호 전송 기능을 갖추고 있어 UART에 비해 데이터 전송 오류가 적습니다. 특히 혹독한 전기적 조건에서 더욱 그렇습니다.

 

간단히 말해, RS485는 더 먼 거리, 견고하고 확장 가능한 통신을 가능하게 함으로써 UART의 기능을 확장합니다. 이것이 STM32 기반 산업 및 임베디드 프로젝트 에서 널리 사용되는 이유입니다 .

 

RS485 MAX485 모듈 개요

 

RS485 -TTL 변환기는 STM32와 같은 마이크로컨트롤러가 RS485 프로토콜을 사용하여 장거리 통신을 할 수 있도록 하는 통신 인터페이스 모듈입니다. 이 변환기는 차동 RS485 신호를 표준 TTL 레벨 직렬 데이터로 변환하여 마이크로컨트롤러의 UART 주변 장치에서 읽을 수 있도록 합니다. RS485는 견고성, 잡음 내성, 그리고 동일 버스에서 여러 장치를 지원하는 기능으로 잘 알려져 있어, 산업 및 임베디드 시스템 애플리케이션에 이상적입니다.

 

이러한 모듈은 종종 반이중 통신을 지원하고 높은 신뢰성으로 긴 케이블 길이를 구동할 수 있는 MAX485 트랜시버 칩을 사용합니다.

 

RS485-TTL 변환기의 주요 기능:

 

  • 장거리 통신을 위한 차등 신호 전송 : 차등 신호 전송을 사용하여 노이즈를 줄이고 최대 1200m의 거리에 걸쳐 데이터를 전송할 수 있습니다.
  • 다중 장치 버스 지원 : RS485는 동일한 통신 회선에서 최대 32개의 장치를 지원하여 단일 네트워크에서 다중 노드 통신을 구현합니다.
  • 폭넓은 전압 호환성 : 5V 전원 공급 장치에서 작동하며 3.3V 또는 5V 마이크로컨트롤러와 호환되는 TTL 레벨 출력을 제공합니다.
  • 드라이버/수신기 활성화 핀(DE/RE) : DE 및 RE 핀은 장치 간 하프 듀플렉스 통신을 구현하는 데 필수적인 데이터 방향을 정밀하게 제어할 수 있습니다.

 

RS485 통신 방식에서 사용되는 신호 레벨은 일반적으로 -7V에서 +12V까지입니다. 마이크로컨트롤러 핀은 일반적으로 이러한 레벨을 처리하도록 설계되지 않았습니다. 따라서 이러한 신호를 저전압(예: ±3V)으로 변환해야 합니다. 이 모듈에는 MAX485 칩이 내장되어 있어 대부분의 변환 작업을 수행합니다.

 

RS485 모듈 핀아웃

 

모듈의 핀아웃은 아래와 같습니다.

 

 

RS485 모듈(MAX485) 핀아웃

 

모듈의 왼쪽에는 RO 핀이 UART의 RX 핀에 연결되고, DI 핀은 TX 핀에 연결됩니다.

 

RE 및 DE 핀 은 모듈을 수신기 또는 송신기 모드로 설정하는 역할을 합니다.

 

  • RE 핀이 LOW이고 DE 핀이 LOW일 때 모듈은 수신기 모드 로 설정됩니다 .
  • DE 핀이 HIGH이고 RE 핀이 HIGH일 때 모듈은 송신기 모드 로 설정됩니다.

 

핀 A 와 핀 B 는 전송 신호를 전달하는 출력 핀입니다.

 

모듈에 0x95 (10010101) 데이터를 제공하는 예를 들어 보겠습니다 . 모듈에 5V 전원이 공급되면 A핀과 B핀의 출력은 아래와 같습니다.

 

 

핀 A에 RS485 데이터 출력

 

핀 B에 RS485 데이터 출력

 

 

RS485 결합 데이터 출력

 

  • A는 비반전 핀 이므로 출력은 입력과 동기화됩니다. 출력 전압은 0V에서 +5V까지 변합니다.
  • B는 반전 핀이므로 출력은 반전되어 -5V에서 0V 사이에서 변합니다.
  • 두 번째 모듈이 이를 입력으로 받으면 전압 차이에 따라 데이터를 디코딩합니다.
  • 전압 차이가 최대이면 비트는 1이고, 차이가 0이면 비트는 0입니다.
  • 이 데이터는 MCU 요구 사항에 맞게 낮은 전압(0~3V)으로 변환됩니다.

 

STM32 및 RS485 배선 연결

 

아래는 STM32F103C8 컨트롤러 와 모듈의 연결 다이어그램입니다 . F446에도 동일한 연결이 적용되므로 여기서는 그중 하나만 보여드리겠습니다.

 

 

MAX485 STM32 연결

 

위에서 설명한 바와 같이, MAX485 모듈의 RO(수신기 출력) 핀은 STM32의 UART1 RX 로 작동하는 PA10 에 연결됩니다. DI(드라이버 입력) 핀은 UART1 TX 로 설정된 PA9 에 연결됩니다 .

 

RE (수신기 활성화) 와 DE(드라이버 활성화) 핀은 서로 연결되어 STM32의 디지털 출력 으로 설정된 PA8 에 연결됩니다 . 이러한 설정을 통해 마이크로컨트롤러는 모듈의 송신 모드 또는 수신 모드를 제어할 수 있습니다.

 

MAX485 Pin Function STM32 Pin Notes
RO Receiver Output PA10 UART1 RX
DI Driver Input PA9 UART1 TX
RE Receiver Enable PA8 Tied with DE, output control
DE Driver Enable PA8 Tied with RE, output control
VCC Power Supply 5V/3.3V According to module specs
GND Ground GND Common ground

MAX485 핀 기능 STM32 핀 노트

 

RS485를 위한 STM32 CubeMX 구성

 

RS485 통신을 위한 코드를 작성하기 전에 CubeMX를 사용하여 STM32 주변 장치를 올바르게 구성하는 것이 필수적입니다 .

 

CubeMX의 UART 구성은 아래와 같습니다.

 

 

STM32 UART 구성 RS485

 

UART1은 기본 설정으로 구성되어 있으며, 통신 속도는 115200 이고 8-N-1 형식 (8 데이터 비트, 패리티 없음, 1 정지 비트)입니다. 또한, STM32가 두 번째 컨트롤러로부터 비동기적으로 데이터를 수신할 수 있도록 UART 수신 인터럽트가 활성화되었습니다.

 

이 프로젝트에 사용된 핀은 아래와 같습니다.

 

 

STM32 RS485 핀 구성

 

PA8 핀은 디지털 출력 으로 설정 되고 TX_EN 으로 이름이 변경됩니다 . 이 핀은 MAX485 모듈의 모드를 제어합니다. 송신 모드는 High , 수신 모드는 Low로 설정하여 STM32가 RS485 버스를 통해 데이터를 송수신할 수 있도록 합니다.

 

STM32용 RS485 통신 코드

 

앞서 언급했듯이, 목표는 두 마이크로컨트롤러 간의 통신을 구축하는 것입니다. STM32F103은 메시지를 전송하여 통신을 시작하고, STM32F446은 이 메시지를 수신하면 그에 따라 응답합니다. 이 설정은 RS485를 이용한 간단한 요청-응답 메커니즘을 보여줍니다.

 

F103의 코드

 

uint8_t TxData[16];
uint8_t RxData[16];
int indx = 0;

int main ()
{
  HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
  while (1)
  {
    sprintf(TxData, "F103 %d", indx++);
    sendData (TxData);
    HAL_Delay(1000);
  }
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
}

 

  • 여기 메인 함수에서 먼저 UART를 설정하여 데이터를 수신합니다.
  • 이 함수는 ReceiveToIdle_IT들어오는 데이터를 수신하여 Idle 라인이 감지될 때까지 RxData 버퍼에 저장합니다.
  • RX 핀이 일정 시간 동안 유휴 상태가 되면 인터럽트가 발생하고, 결국에는 .을 호출합니다 RxEventCallbak.
  • 이 콜백 안에서는 receive to idle 인터럽트를 활성화합니다. HAL이 각 호출 후 인터럽트를 비활성화하기 때문에, 인터럽트가 발생할 때마다 다시 활성화해야 합니다.
  • while 루프에서는 indx 변수의 증가된 값을 사용하여 보내고자 하는 문자열을 업데이트합니다.
  • 그리고 우리는 이 업데이트된 문자열을 1초마다 계속 전송합니다.

 

위에서 사용된 sendData 함수는 아래와 같습니다.

 

void sendData (uint8_t *data)
{
	// Pull DE high to enable TX operation
	HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_SET);  
	HAL_UART_Transmit(&huart1, data, strlen (data) , 1000);
	// Pull RE Low to enable RX operation
	HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_RESET);  
}

 

  • 데이터를 전송하기 전에 RS485 모듈을 송신기 모드로 전환해야 합니다.
  • 이를 위해서는 DE(드라이버 활성화) 핀을 HIGH로 설정해야 합니다.
  • 그런 다음 함수를 사용하여 데이터를 전송합니다 HAL_UART_Transmit.
  • 데이터가 전송되면 RE(수신 활성화) 핀을 LOW로 당겨서 수신기 모드를 활성화합니다.

 

DE와 RE는 같은 핀(PA8, TX_EN)에 연결되어 있으므로 같은 핀을 사용하여 모듈을 송신기 또는 수신기 모드로 설정할 수 있습니다.

 

수신 데이터의 시간을 알 수 없으므로 모듈은 항상 수신 모드로 유지됩니다. 데이터를 전송하기 직전에 송신 모드로 전환했다가 다시 수신 모드로 전환합니다.

 

전송된 데이터는 F446에 의해 수신되고 응답을 보냅니다.

 

F446의 코드

 

F446이 데이터를 수신하면 RxEventCallback이 호출되고, 우리는 그 안에 코드를 작성합니다.

 

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	RxData[0] = 'F';
	RxData[1] = '4';
	RxData[2] = '4';
	RxData[3] = '6';
	sendData(RxData);
	HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 64);
//	memset (RxData, '\0',64);
}

 

 

여기서는 처음 4바이트('F' '1' '0' '3')를 'F' '4' '4' '6'으로 바꾸고 데이터를 첫 번째 컨트롤러로 다시 보냅니다.

 

이는 단지 응답일 뿐이며, 이렇게 하면 데이터가 F446 자체에서 나온다는 것을 알 수 있습니다.

 

나머지 코드는 F103에서 본 코드와 비슷합니다.

 

STM32를 이용한 RS485 통신 결과

 

아래는 F103 컨트롤러의 TxData 및 RxData 버퍼 이미지입니다 .

 

 

F103 TxData 버퍼

 

 

F103 RxData 버퍼

 

보시다시피 F103에서 전송된 데이터와 수신된 데이터는 처음 몇 바이트를 제외하고는 거의 동일합니다.

 

그래서 F103 컨트롤러에서 "F103 46"을 전송했습니다. F446이 이를 수신하여 처음 몇 바이트를 변경하고 "F446 46"을 F103 컨트롤러로 다시 전송했습니다.

 

결론

 

이 튜토리얼에서는 RS485 모듈을 STM32와 성공적으로 연동하고 , 두 마이크로컨트롤러 간의 안정적인 반이중 UART 통신을 시연했습니다. DE/RE 제어 핀 과 함수를 함께 사용하여 HAL_UARTEx_ReceiveToIdle_IT()데이터 손실 없이 원활한 데이터 송수신을 보장했습니다.

 

RS485 통신은 장거리 및 멀티드롭 네트워크 에 이상적이며 , 산업 자동화, Modbus 통신, 센서 네트워크 등에서 널리 사용됩니다 . UART 주변 장치 구성, TX 활성화 핀 관리, 유휴 라인 인터럽트 처리 방법을 이해하면 이 설정을 동일한 RS485 버스에 연결된 여러 장치로 확장할 수 있습니다.

 

데이터 전송을 위한 DMA 구현 , 오류 처리 추가 또는 실제 응용 프로그램을 위한 Modbus RTU 프로토콜을 지원하도록 코드 확장을 통해 이 프로젝트를 더욱 향상시킬 수 있습니다 .

 

위 프로젝트의 다운로드 링크입니다.

 

튜토리얼의 원문을 보시려면 늘 그렇듯이 이 링크를 따라가세요.

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩