nRF52

nRF52 Bluetooth Low Energy (BLE) Peripheral 개발 가이드

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

Bluetooth Low Energy (BLE)은 근거리 저전력 무선 통신을 지원하는 기술로, 스마트폰과 같은 BLE 중앙 장치(Central Device)와 센서, 웨어러블 기기 같은 주변 장치(Peripheral Device) 간 데이터를 송수신하는 데 자주 사용됩니다. 이번 글에서는 BLE Peripheral에 대해 설명하고, nRF52840 칩을 사용하여 BLE Peripheral 디바이스를 설정하는 방법을 자세히 알아보겠습니다.

BLE Peripheral이란?

BLE Peripheral은 주로 정보를 제공하고 데이터를 브로드캐스트하는 디바이스입니다. 이 디바이스는 BLE 중앙 장치와 통신하여 데이터를 송수신하며, 다양한 센서와 웨어러블 기기에서 자주 사용됩니다. Peripheral은 데이터를 중앙 장치에 제공하고, 중앙 장치가 데이터를 요청하거나 전송을 받을 수 있습니다.

BLE Peripheral의 주된 예는 다음과 같습니다:

  • 웨어러블 디바이스: 스마트워치, 피트니스 트래커
  • 센서: 온도, 습도, 움직임 센서
  • IoT 디바이스: 스마트 홈 장비

BLE Peripheral의 주요 특징

BLE Peripheral은 몇 가지 중요한 특징을 가지고 있습니다:

  • 저전력: BLE는 전통적인 블루투스보다 훨씬 적은 전력을 소모합니다. 이는 배터리로 구동되는 웨어러블, IoT 장치에서 매우 유용합니다.
  • GATT (Generic Attribute Profile): GATT 프로토콜을 통해 데이터 교환을 처리합니다. 이는 서비스, 특성, 디스크립터로 구성되며, BLE Peripheral이 제공하는 데이터를 효율적으로 중앙 장치에 전달합니다.
  • 브로드캐스트 기능: BLE Peripheral은 자신의 존재를 알리기 위해 브로드캐스트를 사용합니다. 이를 통해 중앙 장치가 Peripheral을 감지하고 연결 요청을 할 수 있습니다.
  • 서비스 기반 구조: BLE Peripheral은 주로 센서 데이터, 장치 정보 등을 제공하는 서비스를 제공합니다. 중앙 장치는 이러한 서비스에 액세스하여 데이터를 얻습니다.

nRF52 BLE Peripheral 설정

Nordic Semiconductor의 nRF52840은 BLE를 지원하는 저전력 마이크로컨트롤러입니다. 다음은 nRF52840을 사용하여 BLE Peripheral을 설정하고 동작시키는 방법입니다.

2.1 BLE Stack 초기화

nRF52에서 BLE Stack을 설정하려면 Nordic SoftDevice라는 BLE 프로토콜 스택을 활성화해야 합니다. SoftDevice는 BLE 및 기타 무선 통신 기능을 제공하는 펌웨어입니다. 다음 코드는 BLE 스택을 초기화하는 방법을 보여줍니다.

static void ble_stack_init(void)
{
    ret_code_t err_code;

    // SoftDevice 활성화 요청
    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // 기본 BLE 설정 구성
    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);

    // BLE 스택 활성화
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);

    // BLE 이벤트 처리 핸들러 등록
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}

2.2 GAP Parameter 설정

GAP (Generic Access Profile)은 BLE 장치의 연결 및 광고 설정을 담당합니다. GAP 설정에서 장치 이름, 연결 간격, 보안 모드를 정의합니다.

#define DEVICE_NAME                 "BLE_Device"   /**< 광고에 표시될 장치 이름. */

static void gap_params_init(void)
{
    uint32_t err_code;
    ble_gap_conn_params_t gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;

    // 보안 모드 설정: 장치 이름에 대한 보안 요구 사항이 없는 상태로 설정
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);

    // 장치 이름 설정
    err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) DEVICE_NAME, strlen(DEVICE_NAME));
    APP_ERROR_CHECK(err_code);

    // 연결 매개변수 초기화
    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;  // 최소 연결 간격
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;  // 최대 연결 간격
    gap_conn_params.slave_latency     = SLAVE_LATENCY;      // 슬레이브 지연시간
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;   // 연결 유지 시간

    // 연결 매개변수 설정
    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);
}

2.3 GATT 설정

BLE 장치는 GATT 프로파일을 통해 데이터를 주고받습니다. 이 과정에서 MTU (Maximum Transmission Unit)와 같은 설정이 중요합니다. MTU는 한 번에 전송할 수 있는 데이터의 최대 크기를 나타냅니다.

static void gatt_init(void)
{
    ret_code_t err_code;

    // GATT 초기화
    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
    APP_ERROR_CHECK(err_code);

    // MTU 크기 설정
    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, 64);
    APP_ERROR_CHECK(err_code);
}

2.4 Service 초기화

BLE Peripheral에서 제공하는 서비스는 중앙 장치와 데이터를 주고받는 구조입니다. 예를 들어, BLE NUS (Nordic UART Service)를 초기화하여 UART를 통해 데이터를 주고받는 서비스를 제공합니다.

static void services_init(void)
{
    uint32_t err_code;
    ble_nus_init_t nus_init;

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

    // 데이터 핸들러 설정
    nus_init.data_handler = nus_data_handler;

    // NUS 서비스 초기화
    err_code = ble_nus_init(&m_nus, &nus_init);
    APP_ERROR_CHECK(err_code);
}

2.5 Advertising 설정

Advertising은 BLE Peripheral이 자신의 존재를 알리는 방법입니다. 광고 데이터는 중앙 장치가 인식할 수 있는 방식으로 구성됩니다. 아래 코드는 광고 간격과 데이터를 설정하는 방법을 보여줍니다.

#define ADV_INTERVAL_MS 500    // 광고 간격
#define ADV_TIMEOUT_MS  10000  // 광고 시간

static void advertising_init(void)
{
    uint32_t err_code;
    ble_advertising_init_t init;

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

    // 광고 데이터 설정
    init.advdata.name_type               = BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance      = false;
    init.advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;

    // 광고 간격 및 시간 설정
    init.config.ble_adv_fast_enabled     = true;
    init.config.ble_adv_fast_interval    = MSEC_TO_UNITS(ADV_INTERVAL_MS, UNIT_0_625_MS);
    init.config.ble_adv_fast_timeout     = ADV_TIMEOUT_MS / 10;

    // 광고 초기화
    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);
}

2.6 Connection Parameter 설정

연결 매개변수는 BLE 연결의 동작을 조정하는 데 중요한 요소입니다. 첫 번째 연결 후, BLE Peripheral은 연결 간격 및 연결 유지 시간 등의 매개변수를 조정할 수 있습니다.

static void conn_params_init(void)
{
    uint32_t err_code;
    ble_conn_params_init_t cp_init;

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

    cp_init.p_conn_params                  = NULL;
    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
    cp_init.disconnect_on_fail             = true;

    err_code = ble_conn_params_init(&cp_init);
    APP_ERROR_CHECK(err_code);
}

2.7 Advertising 시작

이제 모든 설정이 완료되었으므로 광고를 시작하여 중앙 장치가 이 Peripheral을 검색하고 연결할 수 있도록 합니다.

static void advertising_start(void * p_context)
{
    uint32_t err_code;

    // 광고 시작
    err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
    APP_ERROR_CHECK(err_code);
}

3. BLE Peripheral 응용 분야

BLE Peripheral은 저전력 소비와 무선 통신의 특성을 이용하여 다양한 응용 분야에서 활용됩니다. 주요 응용 분야는 다음과 같습니다:

  • 스마트 홈: 스마트 전구, 온도 조절 장치 등의 제어
  • 웨어러블 기기: 스마트워치, 피트니스 트래커와 같은 개인 기기
  • 의료 기기: 심박수 모니터, 혈당 측정기 등의 의료 데이터 수집 장비
  • 산업용 IoT: 공장 내 센서 네트워크 구축 및 관리

결론

이번 글에서는 BLE Peripheral의 기본 개념과 nRF52840을 사용하여 BLE Peripheral 디바이스를 설정하는 과정을 살펴보았습니다. BLE Peripheral은 저전력 환경에서 효율적인 무선 통신을 제공하며, 웨어러블, 스마트 홈, 의료 기기와 같은 다양한 분야에서 그 중요성이 더욱 커지고 있습니다. BLE Peripheral의 장점을 잘 이해하고, 적절한 설정과 코드를 적용하면 다양한 응용 분야에 효과적으로 BLE 통신을 활용할 수 있습니다.

BLE Peripheral의 구체적인 구현 방법과 관련된 세부 사항을 숙지하는 것은 BLE 응용 프로그램을 개발하는 데 필수적이며, 앞으로의 BLE 개발에 있어 중요한 기반이 될 것입니다.

반응형