Microchip RN487x 블루투스 모듈 마스터하기: 저전력 주변장치 구현
Microchip RN487x 패밀리 블루투스 모듈을 저전력 주변장치 프로젝트에 맞게 설정하는 방법 배우기
콤팩트하고 에너지 효율적인 기기를 만든다면 블루투스는 거의 항상 통신 표준 선택지입니다. 수년간 표준이 성숙해 오늘날 다양한 레디투유즈 모듈이 많은 주변장치 니즈를 충족하는 완전한 시스템온칩(SoC)을 제공합니다. 인기 예로 Nordic의 nrf52840이 있습니다. 32비트 프로세서, 멀티프로토콜 블루투스 라디오, GPIO, PWM, USB, SPI, I²S 등 완전한 I/O 인터페이스를 결합합니다.
강력하지만 이런 SoC는 벅찰 수 있습니다: 임베디드 펌웨어 통합에 필요한 학습 곡선과 개발 시간이 상당합니다. 단 몇 개의 아날로그/디지털 채널만 있는 원격 감지나 제어 같은 많은 일반 유스케이스에는 더 단순하고 집중된 솔루션이 바람직합니다.
Microchip의 RN487x 패밀리가 그 대안입니다. 이 패밀리의 두 모듈(RN4870, RN4871)은 다중 동시 양방향 디지털/아날로그 채널을 제공하면서 설계 풋프린트와 펌웨어 노력을 최소화합니다. 각 모듈은 논볼러틸 RAM에 콤팩트한 설정을 저장해 주변장치 기능을 정확한 요구사항에 맞게 조정할 수 있습니다. 중요하게, 모듈은 블루투스 저에너지(BLE) 표준을 완벽 준수해 최신 스마트폰과 기타 BLE 클라이언트와 원활한 페어링을 보장합니다.
이 3부작 시리즈에서 네 가지 대표적 작업을 위한 완전한 블루투스 지원 주변장치 생성을 실습합니다: 디지털 센서, 디지털 제어, 아날로그 센서, 아날로그 제어. 각 예제는 레퍼런스 회로, 정확한 RN487x 설정 단계, 리눅스 호스트에서 주변장치와 상호작용하는 방법을 보여주는 간단한 Python 스크립트를 포함합니다. 스크립트는 철저히 문서화돼 있어 주변장치를 더 큰 설계의 서브시스템으로 쉽게 임베드할 수 있습니다.
설계 개요
아래는 '아날로그 센서' 예제의 그래픽 예시로, 핵심 인터페이스를 빨간색으로 강조했습니다.

리눅스 시스템이 주변장치와 통신하는 모습 표현
이 예제를 위해 세 가지 핵심 구성요소를 만듭니다:
- 센서 신호를 제공하는 주변장치 하드웨어 – 이 경우 가변 전압을 생성하는 아날로그 트랜스듀서
- 사용자에게 데이터를 제시하는 호스트 애플리케이션 – 우리 Python 스크립트
- 물리적 신호를 호스트가 사용하는 GATT 데이터베이스에 매핑하는 RN487x 설정
부품 선택
RN487x 패밀리는 RN4870과 RN4871 두 가지 변형이 있습니다. 주로 핀 수와 사용 가능한 I/O 유형에서 차이가 있습니다. 아래 재구성된 핀 예산 표로 프로젝트에 가장 적합한 칩을 결정하십시오.
모듈에는 세 가지 I/O 핀 카테고리가 있습니다:
| 유형 |
설명 |
| ADC |
아날로그 입력: 전압을 숫자 값으로 변환 |
| PWM |
아날로그 출력: 두 숫자로 주파수와 듀티 사이클이 설정된 사각파 생성 |
| DIO |
디지털 입력 또는 출력: 하이/로우 레벨이 논리 1/0 표현 |
RN4870

RN487x 데이터시트 이미지
| 핀 이름/기능 |
P1_0 |
P1_1 |
P1_2 |
P1_3 |
P2_2 |
P2_3 |
P2_4 |
P2_5 |
| ADC |
x |
x |
x |
x |
|
|
|
|
| PWM |
|
|
|
|
x |
x |
|
|
| DIO |
|
|
x |
x |
x |
|
x |
x |
RN4871

RN487x 데이터시트 이미지
| 핀 이름/기능 |
P1_2 |
P1_3 |
| ADC |
x |
|
| PWM |
|
|
| DIO |
x |
x |
이 표들로 볼 때, 단일 아날로그 입력만 필요하고 PWM 출력이 없다면 RN4871이 가장 간결한 선택입니다. 다중 신호나 PWM이 필요한 프로젝트에는 RN4870이 적절합니다. 아날로그 센서 예제에서는 RN4871을 사용해 센서를 핀 P1_2에 연결합니다.
BLE 프로토콜 스택의 GATT(Generic Attribute) 프로파일 계층
호스트 애플리케이션 작성 전, 호스트와 주변장치 간 통신을 중재할 GATT API를 이해하는 것이 필수적입니다.
모든 BLE 디바이스는 주변장치(서버)가 채우는 GATT 데이터베이스를 노출합니다. 호스트(클라이언트)는 GATT 호출로 핸들이나 이름으로 식별되는 값을 읽거나 씁니다. 전형적인 Python GATT 연산은 이렇게 보입니다:
gatt_rq.connect() # 특성 핸들에 값 쓰기 gatt_rq.write_by_handle(vh_light, str(bytearray([8])))
첫 호출로 연결을 맺고, 두 번째로 데이터가 주변장치 출력에 즉시 반영됩니다. GATT API는 iOS, Android, Windows, Linux에서 지원됩니다. 광범위한 호환성을 위해 예제들은 리눅스에서 Python을 사용합니다.
모듈 설정
물리적 신호를 GATT 데이터베이스에 연결하려면, RN487x의 NVRAM에 두 가지 핵심 설정 블록을 프로그래밍해야 합니다:
- 특성 정의: 각 값에 대해 데이터베이스 공간을 할당하고 고유 식별자 부여
- 핀 바인딩: 물리적 I/O 핀을 데이터베이스 특성에 매핑해 자동 데이터 변환 활성화
RN487x는 설정을 위한 경량 명령 언어를 사용합니다. 콘솔 연결 수립과 설정 명령 발행에 대한 자세한 내용은 부록을 참조하십시오. 프로그래밍 후 모듈 NVRAM은 이렇게 보일 수 있습니다:

모든 설정 값은 서비스와 특성의 2단계 계층 내에 위치하며, 멀티 센서/제어 설계로 확장 시 유용합니다.
RN487x 튜토리얼 시리즈 1부가 여기서 끝납니다. 2부와 3부에서 디지털 입력, 디지털 제어, 아날로그 센서, 아날로그 제어 구현을 다룹니다. 4부에서는 모든 예제에 적용 가능한 고급 주제를 논의합니다.
아래는 예제들에 들어가기 전 모듈을 설정하는 방법을 개요한 부록입니다.
콘솔 연결로 RN487x 설정하기
모듈에 전원 공급하고 워크스테이션과 시리얼 링크를 맺으십시오. 각 데모 회로에는 RX, TX, GND를 노출하는 3핀 'prog' 점퍼가 포함됩니다. 가이드가 필요하면 여기 훌륭한 자료가 있습니다.
터미널 에뮬레이터를 실행하십시오. 많은 Python 배포판에 포함된 miniterm 유틸리티가 좋은 선택입니다. 셸에서 이렇게 시작하십시오:
python -m serial.tools.miniterm --eol LF /dev/ttyUSB0 115200
115200 기본 보드레이트는 RN487x에 적합합니다.
세 달러 기호("$$$")를 입력해 DATA에서 COMMAND 모드로 전환하십시오. 문자는 보이지 않지만 프롬프트가 바뀝니다:
CMD>
d를 누르고 Enter를 치면 모듈이 상태를 에코합니다:
CMD> BTA=D88039F80080 Name=RN_BLE Connected=no Authen=2 Features=0000 Services=00 CMD>
타이핑한 키를 보고 싶으면 에코를 켜십시오: +와 Enter를 누르십시오:
CMD> ECHO ON CMD>
새 GATT 서비스 생성은 단일 PS 명령으로 간단합니다:
CMD> PS,59c88760536411e7b114b2f933d5fe66 AOK
프로젝트 설정에는 멀티라인 스크립트도 필요합니다. WW로 스크립트를 시작하고, 각 줄을 입력한 뒤 Esc로 커밋하십시오:
CMD> ww @CONN |O,08,72 AOK CMD>
모듈 공통 초기화
RN487x 모듈을 프로젝트 간 재사용할 때 이전 설정이 새 용도에 간섭할 수 있습니다. 각 예제 전 다음 정리 단계를 수행하십시오:
- 기존 스크립트 지우기
- 스크립트 처리 활성화
- 기존 서비스/특성 정의 지우기
- 사용할 핀(예: P1_2)에서 특수 기능 제거
- 모듈 재부팅
아래 명령 시퀀스를 실행하십시오:
CMD> WC AOK CMD> SR,0040 AOK CMD> PZ AOK CMD> SW,0A,00 AOK CMD> R,1 Rebooting
예제 Python 스크립트 실행을 위한 리눅스 설정
하드웨어
호스트 시스템에 BLE 하드웨어(블루투스 4.0 이상)가 있는지 확인하십시오. USB 어댑터가 필요하면 Qualcomm CSR8510 기반 것을 추천합니다. 여기서 구매 가능합니다.
소프트웨어
예제 스크립트는 Debian 10에서 테스트됐으며 Ubuntu 같은 다른 Debian 계열 배포판에서도 작동해야 합니다. 기본 설치되지 않은 두 Python 패키지가 필요합니다:
python-bluez – 블루투스 스택 접근 제공
gattlib – GATT 연산용 Python 바인딩 제공(pip로 설치)
gattlib 설치 시 ELF 라이브러리가 빌드되므로 빌드 도구와 라이브러리가 필요합니다. 모든 의존성을 설치하는 도우미 스크립트가 여기 있습니다. 다운로드 후 실행 가능하게 만들어 실행하십시오.
참고자료
- RN487x 데이터시트
- RN487x 사용자 가이드
- Windows GATT API
- iOS GATT API
- Python GATT API
이 시리즈 다음 파트들에서 완전한 디지털 입력과 디지털 제어 예제를 구축할 예정이니 기대해 주십시오.
프로젝트 1과 2로 이동: 디지털 입력과 디지털 제어 구축.