블루투스 기초 및 STM32 개발 준비
1.1 블루투스 기술 개요
블루투스는 주로 짧은 거리(보통 10-100m)에서 데이터를 전송하기 위한 글로벌 무선 통신 표준입니다. 현대의 블루투스 기술은 크게 두 가지로 나뉩니다:
- 클래식 블루투스(BR/EDR): 오디오 전송, 파일 공유 등에 사용됩니다. 예: HC-05 모듈
- 저전력 블루투스(BLE): IoT 장치에 최적화되어 있으며 매우 낮은 전력을 소비합니다. 예: nRF51822 모듈
STM32 마이크로컨트롤러는 다양한 방식으로 블루투스 개발을 지원합니다:
- 외부 모듈 연결: UART/SPI를 통해 블루투스 모듈(HC-05, JDY-31 등)을 연결합니다.
- 내장 무선 솔루션: STM32WB 시리즈는 BLE 5.0 RF를 내장하고 있습니다.
1.2 개발 환경 설정
하드웨어 준비:
- STM32 보드 (예: STM32F103C8T6 또는 STM32F407 Discovery)
- 블루투스 모듈 (HC-05/HC-06 - 클래식 블루투스, nRF51 시리즈 - BLE)
- USB to TTL 모듈 (AT 명령어 설정용)
- 다양한 도프트 선
소프트웨어 도구 체인:
- IDE 선택:- STM32CubeIDE (공식 추천, CubeMX 통합) - Keil MDK (기존 ARM 개발 환경) - IAR Embedded Workbench
- 핵심 소프트웨어 컴포넌트:- STM32CubeMX: 그래픽 설정 도구 - HAL/LL 라이브러리: 하드웨어 추상화 레이어 드라이버 - BLE 스택 (예: BlueNRG-MS)
- 디버깅 도구:- 시리얼 디버깅 도우미 (SSCOM, Putty) - BLE 디버깅 앱 (nRF Connect, LightBlue)
하드웨어 연결 및 설정
2.1 블루투스 모듈 하드웨어 인터페이스
HC-05 모듈의 일반적인 연결 방법:
HC-05 STM32
VCC → 3.3V
GND → GND
TXD → USART_RX (예: PA10)
RXD → USART_TX (예: PA9)
KEY → 제어 핀 (AT 모드 전환용)
주의 사항:
- 전압 매칭: 일부 블루투스 모듈은 3.3V에서 작동하며, 이를 5V 시스템에 직접 연결하면 모듈이 손상될 수 있습니다.
- 신호 레벨: 5V MCU를 사용하는 경우 레벨 변환 회로가 필요할 수 있습니다.
- 플로우 컨트롤: 고속 전송 시 RTS/CTS 하드웨어 플로우 컨트롤을 활성화하는 것이 좋습니다.
2.2 CubeMX 프로젝트 설정
- 클럭 설정:
- 칩셋 모델에 따라 주 클럭(HSE/MSI) 설정
- USART 클럭 활성화 확인
- USART 파라미터:
- 보레이트: 9600/115200 등 (모듈과 일치해야 함)
- 데이터 비트: 8비트
- 정지 비트: 1비트
- 검사 비트: 없음
- 인터럽트/DMA 설정:
- USART 전역 인터럽트 활성화
- DMA 채널 설정 (선택사항, 효율적인 데이터 전송용)
- GPIO 설정:
- KEY 핀을 GPIO 출력으로 설정
- 상태 핀 초기화 (예: STATE)
예제 코드:
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart1);
}
블루투스 모듈 초기화 및 AT 명령어
3.1 AT 모드 진입 방법
HC-05 모듈에는 두 가지 작업 모드가 있습니다:
- 명령 모드(AT 모드):
- 보레이트는 고정된 38400bps
- 모듈 전원을 켜기 전 KEY 핀을 HIGH로 설정해야 합니다.
- 상태 LED는 천천히 깜빡입니다(1초에 1회).
데이터 모드(패스스루 모드):
- 설정된 보레이트로 통신합니다.
- 상태 LED는 빠르게 깜빡입니다(1초에 2회).
모드 전환 프로세스:
// AT 모드 진입
HAL_GPIO_WritePin(KEY_GPIO_Port, KEY_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(KEY_GPIO_Port, KEY_Pin, GPIO_PIN_RESET);
3.2 일반적인 AT 명령어 집합
시리얼 포트를 통해 AT 명령어를 보내 모듈 설정을 변경합니다:
| 명령 | 기능 | 예시 |
|---|---|---|
| AT | 연결 테스트 | AT\r\n |
| AT+NAME | 장치 이름 설정 | AT+NAME=MyDevice\r\n |
| AT+PSWD | 페어링 비밀번호 설정 | AT+PSWD=1234\r\n |
| AT+UART | 보레이트 설정 | AT+UART=115200,0,0\r\n |
| AT+ROLE | 마스터/슬레이브 모드 설정 | AT+ROLE=0\r\n (0=슬레이브) |
AT 명령어 전송 코드:
void Send_AT_Command(char *cmd)
{
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY);
HAL_Delay(100);
uint8_t response[100];
HAL_UART_Receive(&huart1, response, sizeof(response), 100);
printf("응답: %s\n", response);
}
데이터 통신 실전
4.1 기본 송수신 구현
데이터 송신:
char message[] = "Hello Bluetooth!";
HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
인터럽트 수신:
uint8_t rx_data;
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
printf("받음: %c\n", rx_data);
HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 다시 수신 재개
}
}
저전력 블루투스(BLE) 개발
5.1 STM32WB 시리즈 개발
STM32WB 시리즈는 Cortex-M4 애플리케이션 코어와 Cortex-M0+ 무선 코어를 포함한 듀얼 코어 아키텍처를 가지고 있으며, BLE 5.0을 지원합니다.
개발 과정:
- STM32CubeWB 펌웨어 패키지 설치
- 무선 코프로세서(RFU) 설정
- BLE 프로토콜 스택 API 사용
핵심 API:
// BLE 프로토콜 스택 초기화
aci_hal_init();
// 장치 주소 설정
aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
CONFIG_DATA_PUBADDR_LEN,
bdaddr);
// 광고 시작
aci_gap_set_discoverable(ADV_IND,
ADV_INTERVAL_MIN,
ADV_INTERVAL_MAX,
PUBLIC_ADDR,
NO_WHITE_LIST_USE,
dev_name_len,
dev_name,
0, NULL, 0, 0);