nRF52

nRF52를 이용한 BLE Central 가이드

임베디드 친구 2024. 9. 13. 13:00
반응형

BLE (Bluetooth Low Energy)는 저전력 무선 통신 프로토콜로, 주로 IoT 장치 간의 데이터 전송에 사용됩니다. BLE 네트워크에서는 두 가지 주요 장치 유형이 존재하는데, Central과 Peripheral입니다. 이 글에서는 nRF52840과 같은 SoC(System on Chip)를 사용하여 BLE Central 장치로서 동작하는 방법과, BLE Central이 Peripheral 장치와 어떻게 상호작용하는지를 설명합니다.

1. BLE Central이란?

BLE Central은 BLE 네트워크에서 중앙 컨트롤러 역할을 합니다. 여러 Peripheral 장치와 연결하여 데이터를 수집하고, 장치를 제어하며, 다양한 센서 및 디바이스로부터 실시간으로 데이터를 주고받을 수 있습니다. 스마트폰, 태블릿, 노트북 등과 같은 모바일 장치가 대표적인 BLE Central 장치입니다.
BLE Central의 주요 역할

  • 다수의 Peripheral 장치와 연결: BLE Central은 동시에 여러 Peripheral 장치와 연결이 가능합니다. 예를 들어, 스마트폰을 BLE Central 장치로 설정하면 다양한 스마트 기기(스마트워치, 스마트홈 장치, 건강 모니터링 장치 등)와 통신할 수 있습니다.
  • 저전력 유지: BLE Central은 장치와의 연결을 유지하면서도 전력 소모를 최소화해야 합니다. 저전력 환경에서 오래 지속되는 배터리 수명을 제공하는 것이 BLE의 중요한 장점 중 하나입니다.
  • 데이터 처리 및 전송: BLE Central은 수집된 데이터를 분석하고 필요시 외부 시스템에 전송하는 역할도 합니다. 이를 통해 데이터를 중앙에서 효율적으로 관리할 수 있습니다.

2. nRF52840 BLE Central 설정

nRF52840은 Nordic Semiconductor에서 제공하는 강력한 BLE SoC로, BLE Central 또는 Peripheral로 동작할 수 있는 기능을 제공합니다. 여기서는 nRF52 SDK를 이용해 BLE Central 장치를 설정하는 과정을 단계별로 설명합니다.

2.1 BLE 모듈 설정

BLE Central 장치 설정을 위해서는 BLE 관련 모듈을 설정해야 합니다. 이때 중요한 설정 파일 중 하나는 sdk_config.h입니다.

sdk_config.h 설정 예시

#define BLE_DB_DISCOVERY_ENABLED 1
#define NRF_BLE_GQ_ENABLED 1
#define NRF_BLE_GQ_DATAPOOL_ELEMENT_SIZE 20
#define NRF_BLE_GQ_DATAPOOL_ELEMENT_COUNT 8
#define NRF_BLE_GQ_GATTC_WRITE_MAX_DATA_LEN 16
#define NRF_BLE_GQ_GATTS_HVX_MAX_DATA_LEN 16
#define NRF_BLE_SCAN_ENABLED 1
#define NRF_BLE_SCAN_BUFFER 31
#define NRF_BLE_SCAN_NAME_MAX_LEN 32
#define NRF_BLE_SCAN_SHORT_NAME_MAX_LEN 32
#define NRF_BLE_SCAN_SCAN_INTERVAL 160
#define NRF_BLE_SCAN_SCAN_DURATION 0
#define NRF_BLE_SCAN_SCAN_WINDOW 80
#define NRF_BLE_SCAN_MIN_CONNECTION_INTERVAL 7.5
#define NRF_BLE_SCAN_MAX_CONNECTION_INTERVAL 30
#define NRF_BLE_SCAN_SLAVE_LATENCY 0
#define NRF_BLE_SCAN_SUPERVISION_TIMEOUT 4000
#define NRF_BLE_SCAN_SCAN_PHY 1
#define NRF_BLE_SCAN_FILTER_ENABLE 1
#define NRF_BLE_SCAN_UUID_CNT 1
#define NRF_BLE_SCAN_NAME_CNT 1
#define NRF_BLE_SCAN_SHORT_NAME_CNT 0
#define NRF_BLE_SCAN_ADDRESS_CNT 0
#define NRF_BLE_SCAN_APPEARANCE_CNT 0
#define BLE_NUS_C_ENABLED 1

이 설정을 통해 BLE 스캔, GATT 설정, DB Discovery 등 BLE Central이 동작하는 데 필요한 여러 기능을 활성화할 수 있습니다. 이를 통해 BLE Central 장치는 주위의 BLE Peripheral 장치를 스캔하고, 연결하며 데이터를 주고받을 수 있습니다.

2.2 주요 라이브러리 경로

nRF SDK에는 BLE Central을 설정하고 관리하는 데 필요한 여러 라이브러리가 포함되어 있습니다. 주요 라이브러리 경로는 다음과 같습니다.

./components/ble/ble_db_discovery/ble_db_discovery.c
./components/ble/nrf_ble_gq/nrf_ble_gq.c
./components/ble/nrf_ble_scan/nrf_ble_scan.c
./components/ble/ble_services/ble_nus_c/ble_nus_c.c

3. BLE Central 설정 과정

BLE Central 장치를 설정하는 기본 과정은 다음의 6단계로 구성됩니다.

  1. Discovery Init: DB Discovery 모듈을 초기화합니다.
  2. BLE Stack 초기화: BLE 기본 설정 및 BLE Stack을 활성화합니다.
  3. GATT 설정: Central 장치에서 데이터를 주고받는 방법을 설정합니다.
  4. NUS Init: BLE Stack에 NUS(Nordic UART Service) UUID를 등록합니다.
  5. Scan Init: 스캔 필터를 등록하고 BLE 스캔을 설정합니다.
  6. BLE 스캔 시작: 스캔을 시작하여 Peripheral 장치와 연결합니다.

각 단계에서의 자세한 설명과 코드는 다음과 같습니다.

3.1 BLE Discovery Init

BLE 장치가 연결할 수 있는 서비스를 탐색하기 위해 DB Discovery 모듈을 초기화하고 이벤트 핸들러를 등록합니다.

static void db_disc_handler(ble_db_discovery_evt_t * p_evt){
    ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}

/** @brief Function for initializing the database discovery module. */
static void aika_ble_discover_init(void){
    ble_db_discovery_init_t db_init;

    memset(&db_init, 0, sizeof(ble_db_discovery_init_t));

    db_init.evt_handler  = db_disc_handler;
    db_init.p_gatt_queue = &m_ble_gatt_queue;

    ret_code_t err_code = ble_db_discovery_init(&db_init);
    APP_ERROR_CHECK(err_code);
}

3.2 BLE Stack 초기화

BLE Peripheral 장치와 마찬가지로, Central 장치도 SoftDevice가 활성화되어 있어야 합니다. BLE Stack을 초기화하고 BLE 이벤트를 처리할 수 있는 핸들러를 설정합니다.

/**@brief Function for initializing the BLE stack. */
static void aika_ble_c_stack_init(void){
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);

    // Register a handler for BLE events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, esl_ble_evt_handler, NULL);
}

3.3 GATT 설정

BLE 데이터를 전송하는 GATT(Generic Attribute Profile) 설정을 초기화합니다. 여기서는 Central 장치에서 MTU (Maximum Transmission Unit)를 설정합니다.

/**@brief Function for initializing the GATT library. */
void aika_ble_c_gatt_init(void){
    ret_code_t err_code;

    err_code = nrf_ble_gatt_init(&m_gatt, esl_gatt_evt_handler);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_gatt_att_mtu_central_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
    APP_ERROR_CHECK(err_code);
}

3.4 BLE NUS Init

NUS(Nordic UART Service)는 BLE 장치 간에 UART 시리얼 데이터를 전송하기 위한 서비스입니다. 이를 사용하여 BLE 장치 간에 텍스트나 바이너리 데이터를 송수신할 수 있습니다.

/**@brief Function for initializing the Nordic UART Service (NUS) client. */
static void nus_c_init(void){
    ret_code_t         err_code;
    ble_nus_c_init_t init;

    init.evt_handler   = ble_nus_c_evt_handler;
    init.error_handler = nus_error_handler;
    init.p_gatt_queue  = &m_ble_gatt_queue;

    err_code = ble_nus_c_init(&m_ble_nus_c, &init);
    APP_ERROR_CHECK(err_code);
}

3.5 BLE Scan Init

BLE 스캔 설정을 초기화하고 스캔 필터를 등록합니다. 이 필터는 Central 장치가 원하는 Peripheral 장치만 검색할 수 있도록 도와줍니다.

/**@brief Function for initializing the scanning and setting the filters. */
static void aika_scan_init(void){
    ret_code_t            err_code;
    nrf_ble_scan_init_t init_scan;

    memset(&init_scan, 0, sizeof(init_scan));

    init_scan.connect_if_match = false; 
    init_scan.conn_cfg_tag       = APP_BLE_CONN_CFG_TAG;

    err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid[0]);
    APP_ERROR_CHECK(err_code);

    // Added Name Filter
    if(0 != m_target_periph_name){
        err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name);
        APP_ERROR_CHECK(err_code);
    }

    err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_ALL_FILTER, false);
    APP_ERROR_CHECK(err_code);
}

3.6 BLE Scan 시작

설정된 스캔 필터와 파라미터를 이용하여 BLE Peripheral 장치를 스캔합니다.

/**@brief Function to start scanning. */
static void scan_start(void){
    ret_code_t ret;

    ret = nrf_ble_scan_start(&m_scan);
    APP_ERROR_CHECK(ret);
}

스캔 결과는 BLE 스택 초기화에서 등록된 이벤트 핸들러를 통해 처리됩니다. 여기서 Peripheral 장치의 광고(Advertising) 데이터가 수신되고, 필요한 정보를 획득할 수 있습니다.

4. BLE Central의 응용 분야

BLE Central 장치는 주변의 BLE 지원 장치와 상호작용하고 데이터를 교환하는 중요한 역할을 합니다. 주로 다음과 같은 응용 분야에서 사용됩니다:

  • 스마트 홈: BLE 센서를 활용하여 온도, 습도, 조명 등을 제어하는 스마트 홈 시스템에 BLE Central 장치를 적용할 수 있습니다.
  • 헬스케어: BLE 기반 스마트 워치나 건강 모니터링 장치로부터 데이터를 수집하고 분석하여 사용자에게 피드백을 제공합니다.
  • 위치 기반 서비스: BLE 비콘을 활용한 실내 위치 추적 시스템에서 BLE Central 장치는 다양한 비콘과 통신하여 위치 데이터를 수집합니다.

5. 결론

이 글에서는 nRF52840과 같은 BLE 칩셋을 사용하여 BLE Central 장치를 설정하는 과정을 설명했습니다. BLE Central은 다양한 Peripheral 장치와의 상호작용을 통해 데이터를 수집하고 관리하는 데 필수적인 역할을 합니다. BLE의 저전력 특성을 살려 스마트홈, 헬스케어, 위치 기반 서비스 등 다양한 응용 분야에서 BLE Central을 사용할 수 있습니다.
이 글을 바탕으로 nRF52 SDK를 이용해 BLE Central 장치를 구성하는 데 필요한 지식을 쌓고, BLE 네트워크에서의 데이터 관리 및 제어에 대한 이해도를 높일 수 있기를 바랍니다.

반응형