서론
우리가 세상을 살아가다 보면 주변의 많은 기술을 그것이 어떻게 만들어졌는지도 모르는 채 사용하는 경우가 많습니다. 블루투스도 그중 하나입니다. 수많은 블루투스 제품을 사용하고 있지만 직접 구현해 볼 기회는 많지 않습니다.
저는 Zephyr RTOS를 공부하면서 Bluetooth LE를 직접 구현해 보기로 했습니다. 단순한 통신 시험보다는 실제로 사용할 수 있는 것을 만들어 보고 싶어, 취미로 하고 있는 밴드를 위한 리모트 메트로놈(Remote Metronome)을 만들어 보기로 했습니다.
구성은 간단합니다. 스마트폰에서 BPM과 Start/Stop을 설정하면 Bluetooth LE를 통해 리모트 장치로 전달되고, XIAO nRF54L15가 설정된 BPM에 맞추어 LED 조명을 점멸시킵니다. 여러 밴드 멤버가 이 조명을 보면서 같은 박자에 맞추어 연주하는 것이 목적입니다.
이번 글에서는 메트로놈 애플리케이션 자체보다는 그 기반이 되는 XIAO nRF54L15 + Zephyr의 Bluetooth LE 구현에 초점을 맞춥니다.
스마트폰의 nRF Connect for Mobile을 이용하여 장치를 검색하고 연결한 후, GATT Service와 Characteristic을 확인하고 Write와 Notify 통신까지 실제로 시험해 보겠습니다. 전체 소스 코드는 다운로드할 수 있도록 별도로 제공합니다.
Bluetooth LE의 기본 구조
Bluetooth LE(Bluetooth Low Energy)는 적은 양의 데이터를 낮은 전력으로 주고받는 데 적합한 Bluetooth 통신 방식입니다. 센서, 웨어러블 장치, 리모컨과 같이 스마트폰과 간단한 데이터를 주고받는 장치에 널리 사용됩니다.
이번 프로젝트에서도 스마트폰과 메트로놈 사이에 대용량 데이터를 전송할 필요는 없습니다. BPM 값, Start/Stop 명령, 현재 동작 상태 정도만 주고받으면 되므로 Bluetooth LE가 적합합니다.
Bluetooth LE 통신을 이해하기 위해서는 먼저 Central과 Peripheral의 관계를 알아두는 것이 좋습니다.
이번 프로젝트에서는 스마트폰이 Central, XIAO nRF54L15가 Peripheral 역할을 합니다.
Smartphone
nRF Connect
(Central)
│
│ Bluetooth LE
│
▼
XIAO nRF54L15
(Peripheral)
XIAO nRF54L15 Smartphone
Peripheral Central
│ │
│────── Advertising ───────────────>│
│ │
│<──────── Connection ──────────────│
│ │
│<========= BLE 통신 =============>│
GATT에서는 장치가 제공하는 기능을 Service와 Characteristic이라는 구조로 표현합니다.
GATT
│
└── Service
│
├── Characteristic
│ └── Value
│
├── Characteristic
│ └── Value
│
└── Characteristic
└── Value
예를 들어 리모트 메트로놈에서는 하나의 Metronome Service 안에 BPM이나 Start/Stop, 현재 상태 등을 위한 Characteristic을 만들 수 있습니다.
Characteristic의 데이터는 여러 방법으로 주고받을 수 있는데, 이번 프로젝트에서는 주로 Write와 Notify를 사용합니다.
Write는 스마트폰에서 nRF54L15로 값을 전달하는 방법입니다. 스마트폰에서 BPM을 변경하거나 Start/Stop 명령을 보내는 경우가 이에 해당합니다.
반대로 Notify는 nRF54L15에서 값이 변경되었을 때 그 내용을 스마트폰으로 알려주는 방법입니다. 스마트폰이 계속 값을 읽어 확인할 필요 없이 장치가 필요한 시점에 새로운 상태를 전달할 수 있습니다.
따라서 이번 프로젝트의 기본적인 데이터 흐름은 다음과 같습니다.
Smartphone XIAO nRF54L15
BPM / Start / Stop
─────── Write ────────────>
<────── Notify ───────────
Device Status
처음에는 Bluetooth LE의 용어가 다소 복잡하게 느껴질 수 있지만, 이번 프로젝트에서는 우선 Advertising → Connection → Service → Characteristic → Write/Notify의 흐름만 이해하면 충분합니다.
이제 이 구조를 Zephyr에서 실제로 구현하고 nRF Connect를 이용하여 하나씩 확인해 보겠습니다.
개발 환경 및 하드웨어 구성
하드웨어 구성
이번 프로젝트에서는 Seeed Studio XIAO nRF54L15 보드를 사용했습니다. 보드에 대한 자세한 사양은 Seeed Studio 공식 문서에서 확인할 수 있습니다.
Seeed Studio XIAO nRF54L15 공식 문서
XIAO nRF54L15는 Nordic Semiconductor의 nRF54L15를 사용한 소형 개발 보드로 Bluetooth LE를 지원하며, Zephyr RTOS를 이용하여 애플리케이션을 개발할 수 있습니다.
아래는 하드웨어가 구성된 사진입니다.

XIAO nRF54L15의 D0 GPIO를 이용하여 TIP122 NPN 트랜지스터를 제어하고, TIP122를 통해 외부 LED 조명을 ON/OFF하도록 구성했습니다. GPIO와 TIP122의 베이스 사이에는 3.3 kΩ 저항을 사용했습니다.
Bluetooth LE를 통해 전달받은 BPM과 Start/Stop 명령에 따라 XIAO nRF54L15가 D0를 제어하고, 외부 LED 조명이 설정된 BPM에 맞추어 점멸합니다.
이번 글의 주된 목적은 LED 구동 회로 자체보다는 XIAO nRF54L15와 Zephyr를 이용한 Bluetooth LE 통신 구현에 있습니다.
소프트웨어 개발 환경
소프트웨어는 Zephyr RTOS를 기반으로 작성했습니다. Zephyr에서는 Bluetooth LE Stack과 GATT API를 제공하므로 이를 이용하여 Peripheral 장치를 구현할 수 있습니다.
이번 프로젝트의 개발 환경은 다음과 같습니다.
| 항목 | 사용 환경 |
|---|---|
| 개발 보드 | Seeed Studio XIAO nRF54L15 |
| RTOS | Zephyr RTOS |
| 개발 도구 | Visual Studio Code |
| 언어 | C |
| 무선 통신 | Bluetooth LE |
| BLE 시험 | nRF Connect for Mobile |
| 시험 장치 | Android Smartphone |
펌웨어는 Visual Studio Code의 Zephyr 개발 환경에서 작성하고 빌드한 후 XIAO nRF54L15에 다운로드했습니다.
스마트폰에서는 nRF Connect for Mobile을 사용했습니다. nRF Connect를 이용하면 별도의 스마트폰 애플리케이션을 만들지 않아도 주변의 BLE 장치를 검색하고 연결하여 GATT Service와 Characteristic을 확인할 수 있습니다.
또한 Characteristic에 직접 값을 Write하거나 장치에서 전송되는 Notify를 확인할 수 있기 때문에 BLE 펌웨어를 개발하고 시험하는 데 매우 유용합니다.
이번 프로젝트에서는 먼저 nRF Connect를 이용하여 nRF54L15의 Bluetooth LE 기능을 충분히 확인한 후, 이후 단계에서 실제 메트로놈용 스마트폰 애플리케이션으로 확장하는 방법을 사용했습니다.








