본문으로 바로가기

개발 보드에서 블루투스 HID를 사용하는 여러가지 방법

 사실 흔히 알려진 ATmega MCU를 사용한 아두이노나, 다른 ATmega MCU나 ARM 기반 MPU를 사용한 다른 여러 개발보드들을 사용할 때에 블루투스 HID를 이용할 일은 그렇게 많지 않을 거 같습니다. 키보드나 마우스, 컨트롤러 등 의 장치를 만들려는 경우, 이 HID 인터페이스를 쓰기에, 보통 개발자가 아니라 일반인들이 많이 사용할 법한 부분입니다. 이하가 일반적으로 많이 쓰일법한 블루투스 HID 모듈 및 MPU입니다.

  • 노르딕 사(Nordic)의 nRF 칩셋 (nRF51, nRF52 등)
  • FirmTech 사의 FB155BC HID프로파일 내장 블루투스 모듈
  • Mouser 사의 Microchip RN42 모듈 (혹은 그 카피 모듈)
  • Espressif Systems 사의 ESP32

 

 ESP32는 32비트를 지원하는 프로세서 2코어에 240MHz라는 매우 고클럭으로 동작하는 프로세서입니다. 520KB SRAM 메모리에 448KB ROM, 4MB 플래시 메모리와 많은 인터페이스를 지원하고, 무엇보다 와이파이와 블루투스를 지원한다는 것이 가장 큰 이점입니다. 와이파이는 802.11 b/g/n 2.4GHz까지, 블루투스는 4.2 버전에 2.4~2.5GHz까지 지원합니다. 이 둘은 서로 주파수를 공유합니다.

 

ESP32 블록 다이어그램 (출처 lastminuteengineers.com)

 또한 칩셋 내부에 ULP 코프로세서(Ultra Low Power Coprocessor)가 탑재되어 슬립 모드에서 즉각적인 반응을 처리할 수 있는 등 절전 기능에도 굉장히 신경 쓴 MCU입니다. 그래서, 어째서 ESP32를 선택했냐 묻는다면, 역시 가격입니다. 위에서 언급한 nRF 칩셋은 프로그래밍 방법이 복잡할 뿐만 아니라 다른 여러 부수 기재와 지식이 필요하고, FB155BC나 RN42는 그나마 간편하지만, 가격이 비쌉니다. RN42의 카피판인 HC-05/06의 경우 싸게 구할 수 있지만, RN42의 펌웨어를 플래싱해야 하는 불편함이 있습니다. 하지만 EPS32는 아두이노 사용하듯 코딩하면 되고, 성능도 막강합니다. 가격도 매우 착합니다. 알리 익스프레스(https://ko.aliexpress.com/)에서 ESP32를 검색해보면 기껏해야 몇천 원 선이면서 있을 것은 다 있습니다.

 

ESP32로 블루투스 HID를 사용하는 방법

 무려 이미 라이브러리가 존재합니다. T-vK라는 분이 만든 라이브러리로 ESP32-BLE-Keyboard, ESP32-BLE-Mouse, ESP32-BLE-Gamepad 이렇게 세 가지 라이브러리가 존재합니다.

 

 

키보드 지원 기능
마우스 지원 기능
게임패드 지원 기능

 

 

/**
 * This example turns the ESP32 into a Bluetooth LE keyboard that writes the words, 
 * presses Enter, presses a media key and then Ctrl+Alt+Delete
 */
#include <BleKeyboard.h>

BleKeyboard bleKeyboard;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();
}

void loop() {
  if(bleKeyboard.isConnected()) {
    Serial.println("Sending 'Hello world'...");
    bleKeyboard.print("Hello world");

    delay(1000);

    Serial.println("Sending Enter key...");
    bleKeyboard.write(KEY_RETURN);

    delay(1000);

    Serial.println("Sending Play/Pause media key...");
    bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);

    delay(1000);

    Serial.println("Sending Ctrl+Alt+Delete...");
    bleKeyboard.press(KEY_LEFT_CTRL);
    bleKeyboard.press(KEY_LEFT_ALT);
    bleKeyboard.press(KEY_DELETE);
    delay(100);
    bleKeyboard.releaseAll();

  }
  Serial.println("Waiting 5 seconds...");
  delay(5000);
}

 사용법도 매우 간단합니다. 키보드 라이브러리를 예제로 들겠습니다. 일단 라이브러리를 불러온 후, BleKeybaord를 생성한 후, begin하기만 하면 됩니다. 이후는 아두이노의 Keyboard 라이브러리와 거의 동일하므로 해당 문서를 참조하여 작성하면 됩니다. 또한 위 라이브러리는 GATT(Generic Attribute Profile)를 지원합니다. 만약 배터리 잔량이 50%가 남아있다면 bleKeyboard.setBatteryLevel(50); 을 작성하면 하면 됩니다.

 

 위 라이브러리 링크에 들어가면 더 자세하게 설명이 되어 있습니다. 만약 궁금하시면 라이브러리 깃허브에 접속하여 확인해 보세요

 

참조하면 좋은 링크

https://hackaday.com/2020/02/13/emulating-a-bluetooth-keyboard-with-the-esp32/

 

Emulating A Bluetooth Keyboard With The ESP32

Most people associate the ESP family of microcontrollers with WiFi, which makes sense as they’ve become the solution of choice for getting your project online quickly and easily. But while th…

hackaday.com

https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/

 

Keyboard Modifiers - Arduino Reference

Description The Keyboard.write() and Keyboard.press() and Keyboard.release() commands don’t work with every possible ASCII character, only those that correspond to a key on the keyboard. For example, backspace works, but many of the other non-printable c

www.arduino.cc