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 를 검색해서 접속 할 수 있다.
등록후 스위치 값에 따라 키가 눌러지는 것을 확인 할 수 있다.
반응형