nRF52

nRF52 BLE Advertising Interval 설정과 최적화

임베디드 친구 2024. 9. 11. 15:55
반응형

BLE(Bluetooth Low Energy)는 저전력 통신을 지향하는 무선 기술로, 특히 IoT(Internet of Things) 기기에서 많이 사용됩니다. BLE의 작동 원리 중 하나는 Advertising입니다. 이는 Peripheral(주변) 디바이스가 Central(중앙) 디바이스에게 자신의 존재를 알리는 메커니즘입니다. 이때 Advertising Interval은 이러한 알림을 얼마나 자주 보내는지 결정하는 중요한 매개변수입니다.

이 글에서는 BLE Advertising Interval의 개념과 그 설정 방법, 전력 소모 최적화 방법을 다룹니다. 또한, nRF52840을 사용하여 Peripheral 디바이스에서 Advertising Interval을 업데이트하고 관리하는 방법을 실제 코드 예제와 함께 살펴봅니다.

1. BLE Advertising Interval 이란?

BLE의 Advertising은 Peripheral 디바이스가 Central 디바이스에게 자신의 존재를 알리는 과정입니다. 이는 일반적으로 디바이스가 주변에 있는 Central 기기에게 데이터를 송신하거나, 연결 가능 상태를 알리는 데 사용됩니다.

Advertising Interval은 이러한 알림을 얼마나 자주 보내는지를 결정하는 시간 간격입니다. 이 간격은 밀리초(ms) 단위로 설정되며, 일반적으로 20ms에서 10초까지의 범위에서 선택할 수 있습니다. 이 값이 짧으면 더 자주 신호를 보내게 되고, 길면 신호를 덜 자주 보내게 됩니다.

2. Advertising Interval이 중요한 이유

Advertising Interval은 디바이스 성능과 전력 소모에 큰 영향을 미칩니다. 주요한 이유는 다음과 같습니다:

2.1 전력 소모 관리

BLE의 가장 큰 장점 중 하나는 저전력이라는 점입니다. 그러나 Advertising Interval이 짧으면, 디바이스는 더 자주 송신을 하게 되어 배터리를 더 많이 소모하게 됩니다. 반대로 Interval을 길게 설정하면, 전력 소모를 줄일 수 있습니다. 예를 들어, 디바이스가 100ms마다 Advertising을 보내는 것과 1초마다 보내는 것은 전력 소모에 큰 차이를 만듭니다.

  • 짧은 Interval: 빠른 응답 속도, 높은 전력 소모
  • 긴 Interval: 느린 응답 속도, 낮은 전력 소모

2.2 응답 시간 최적화

BLE 통신에서는 응답 속도도 중요합니다. 예를 들어, 실시간 데이터 전송이 중요한 애플리케이션에서는 짧은 Advertising Interval이 요구됩니다. 실시간 센서 데이터 전송이나 긴급 알림 같은 경우에는 Advertising Interval이 짧을수록 응답 시간이 빨라지기 때문에 매우 유리합니다.

3. nRF52에서 Advertising Interval 설정 방법

nRF52840과 같은 Nordic의 SoC(System on Chip)는 BLE Peripheral 디바이스로 자주 사용되며, Advertising Interval을 포함한 다양한 BLE 설정을 제공합니다. 기본적으로 이 Interval은 BLE 스택 초기화 과정에서 설정할 수 있습니다. 아래는 Advertising Interval을 설정하는 코드 예시입니다.

#define TAG_ADV_INTERVAL_MS(ms) (ms * 1.6)
#define TAG_APP_ADV_TIMEOUT_MS(ms) (ms / 10)

/**@brief Function for initializing the Advertising functionality.
 */
static void advertising_init(void)
{
    ret_code_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      = true;
    init.advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.advdata.uuids_complete.p_uuids  = m_adv_uuids;

    // Advertising interval 및 timeout 설정
    init.config.ble_adv_fast_enabled  = true;
    init.config.ble_adv_fast_interval = TAG_ADV_INTERVAL_MS(1000); // 1초 간격
    init.config.ble_adv_fast_timeout  = TAG_APP_ADV_TIMEOUT_MS(0); // 계속 Advertising

    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);

    ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

이 코드는 nRF52840에서 BLE Advertising을 설정하는 초기화 함수입니다. 여기서 ble_adv_fast_interval을 통해 Advertising Interval을 설정할 수 있으며, 1000ms(1초)로 설정되어 있습니다.

4. Advertising 및 전력 소모 최적화

BLE Peripheral 디바이스는 Central 디바이스에 비해 일반적으로 전력 소모가 적습니다. 그러나 Advertising이 빈번하게 발생하면, 전류 소모가 급격히 증가할 수 있습니다. BLE는 다양한 장치 간에 Time Slot을 사용하여 효율적인 통신을 지원하는데, 여러 장치가 동일한 Slot을 사용할 경우 Advertising 충돌이 발생할 수 있으며, 이는 신호 손실로 이어질 수 있습니다.

이를 방지하면서 전력 소모를 최소화하기 위한 몇 가지 방법이 있습니다.

4.1 Interval 조절 및 Timeout 최적화

다음은 Advertising Interval과 Timeout을 조정하여 소모 전류를 최적화하는 방법입니다.

#define TAG_ADV_INTERVAL_MS(ms) (ms * 1.6)
#define TAG_APP_ADV_TIMEOUT_MS(ms) (ms / 10)

void advertising_interval_update(void)
{
    ble_adv_modes_config_t adv_modes_config = m_advertising.adv_modes_config;

    adv_modes_config.ble_adv_fast_enabled  = true;

    // 표준 모드에서 Advertising Interval 설정
    if(0 == tag_config->advertising_mode){
        adv_modes_config.ble_adv_fast_interval = TAG_ADV_INTERVAL_MS(1000); // 1초 간격
        adv_modes_config.ble_adv_fast_timeout  = TAG_APP_ADV_TIMEOUT_MS(0); // 계속 Advertising
    }else{
        // 빠른 응답이 필요한 모드에서 Interval 설정
        adv_modes_config.ble_adv_fast_interval = TAG_ADV_INTERVAL_MS(100); // 100ms 간격
        adv_modes_config.ble_adv_fast_timeout  = TAG_APP_ADV_TIMEOUT_MS(500); // 500ms 후 종료
    }

    ble_advertising_modes_config_set(&m_advertising, &adv_modes_config);
}

4.2 전력 소모 관리 기법

  • 짧은 Interval을 설정할 때는 Timeout을 짧게: 100ms 간격으로 Advertising을 짧은 시간 동안 여러 번 보내면, 전력 소모는 줄이면서도 중요한 데이터를 놓치지 않을 수 있습니다.
  • 긴 Interval과 Timer 사용: 장시간 연결이 필요하지 않은 경우 Timer를 사용해 특정 시간에만 Advertising을 보내도록 설정하여 전력 소모를 더 줄일 수 있습니다.

5. 전력 소모 최적화를 위한 Best Practices

  • 애플리케이션 요구에 맞는 Interval 설정: 응답 속도가 중요한 애플리케이션에서는 짧은 Interval, 전력 소모가 중요한 경우에는 긴 Interval을 설정하는 것이 좋습니다.
  • Timeout 설정: Timeout 값을 적절하게 설정하여 불필요한 전력 소모를 줄이는 것이 중요합니다. 필요 없는 상태에서 무한정 Advertising을 하지 않도록 주의해야 합니다.
  • 광범위한 테스트: Central 디바이스와의 연결 성능을 최적화하기 위해 여러 시나리오에서 Advertising Interval을 테스트하고 최적의 값을 찾아야 합니다.

6. 주의사항

  • Invalid State 에러: Advertising이 시작된 상태에서 ble_advertising_modes_config_set()을 호출하면 Invalid State 오류가 발생할 수 있습니다. 이 경우, sd_ble_gap_adv_stop()을 먼저 호출해 Advertising을 중지한 후, 설정을 변경해야 합니다.
  • BLE Stack의 한계: BLE 스택은 한 번에 너무 많은 신호를 처리하지 못할 수 있습니다. 너무 짧은 Advertising Interval 설정은 시스템에 부담을 줄 수 있으며, 이를 방지하려면 Interval 값을 신중하게 선택해야 합니다.

7. 결론

BLE Advertising Interval은 Peripheral 디바이스의 전력 소모와 통신 성능을 좌우하는 매우 중요한 요소입니다. nRF52840과 같은 디바이스에서 이를 효과적으로 설정하고 최적화하는 것은 전력 효율성을 극대화하고, 성능을 유지하는 데 매우 중요합니다. 본 글에서 설명한 방법을 바탕으로 자신의 애플리케이션에 맞는 최적의 설정을 찾아 적용해보세요.

반응형