본문 바로가기

Nordic/nRF52

nRF52832 SSM - BLE HID Key Board 테스트

 

Bluefruit 라이브러리에 BLEHidAdafruit 클래스를 이용하면 쉽게 BLE HID Keyboard를 구현 할 수 있다.

제공예제에서 필요한 부분만 이용해서 가장 간단하게 테스트 할 수 있는 코드를 작성하고 테스트 해 보자

#include <bluefruit.h>

#define LED1_PORT       22
#define SW1_PORT        21

BLEHidAdafruit blehid;
bool hasKeyPressed = false;

void setup() 
{
  pinMode(SW1_PORT, INPUT_PULLUP);
  pinMode(LED1_PORT, OUTPUT);
  digitalWrite(LED1_PORT, 1);

  Serial.begin(115200);
  while ( !Serial ) delay(10);   // for nrf52840 with native usb

  Serial.println("nRF52 HID Keyboard Test");
  
  Bluefruit.begin();
  Bluefruit.setName("nRF52 Keyboard");
  Bluefruit.setTxPower(4);

  blehid.begin();

  // Set callback for set LED from central
  blehid.setKeyboardLedCallback(set_keyboard_led);

  // Set up and start advertising
  startAdv();
}

void startAdv(void)
{  
  // Advertising packet
  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
  Bluefruit.Advertising.addTxPower();
  Bluefruit.Advertising.addAppearance(BLE_APPEARANCE_HID_KEYBOARD);
  
  // Include BLE HID service
  Bluefruit.Advertising.addService(blehid);

  // There is enough room for the dev name in the advertising packet
  Bluefruit.Advertising.addName();
  
  // Start Advertising 
  Bluefruit.Advertising.restartOnDisconnect(true);
  Bluefruit.Advertising.setInterval(32, 244);    // in unit of 0.625 ms
  Bluefruit.Advertising.setFastTimeout(30);      // number of seconds in fast mode
  Bluefruit.Advertising.start(0);                // 0 = Don't stop advertising after n seconds
}

void loop() 
{
  if(!digitalRead(SW1_PORT))
  {
    if(hasKeyPressed == 0)
    {
      hasKeyPressed = 1;
      Serial.println("Key Press");
      blehid.keyPress('a');
    
      // Delay a bit after a report
      delay(5);      
    }
  }
  else {
    if(hasKeyPressed == 1)
    {
      hasKeyPressed = 0;
      Serial.println("Key Release");
      blehid.keyRelease();
      delay(5);
    }
  }
}

/**
 * Callback invoked when received Set LED from central.
 * Must be set previously with setKeyboardLedCallback()
 *
 * The LED bit map is as follows: (also defined by KEYBOARD_LED_* )
 *    Kana (4) | Compose (3) | ScrollLock (2) | CapsLock (1) | Numlock (0)
 */
void set_keyboard_led(uint16_t conn_handle, uint8_t led_bitmap)
{
  (void) conn_handle;
  
  // light up Red Led if any bits is set
  if ( led_bitmap )
  {
    digitalWrite(LED1_PORT, 0);
  }
  else
  {
    digitalWrite(LED1_PORT, 1);
  }
}

 

 

프로그램 다운로드 후 nRF52 Keyboard 를 검색해서 접속 할 수 있다.

등록후 스위치 값에 따라 키가 눌러지는 것을 확인 할 수 있다.

 

반응형