はじめに
Arduino環境でESP32-S3をBLE-Keyboardにして使うとき、ちょっとした罠にはハマったので、メモしておく。
1. Arduino IDE
ボードマネージャに以下のURLを追加しESP32-S3ボード
を追加する。出典
https://espressif.github.io/arduino-esp32/package_esp32_index.json
+ ↓こちらのURLでダウンロードされるjsonと内容は同じ
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- ↓こちらのURLには、ESP32-S3が無い
https://dl.espressif.com/dl/package_esp32_index.json
2. ライブラリを追加
- ESP32-BLE-Keyboard <主役>
- NimBLE-Arduino
2.1 ESP32-BLE-Keyboardライブラリの追加
- 上のReleaseから
ESP32-BLE-Keyboard.zip
をダウンロード - Arduino IDEの「ZIP形式のライブラリをインストール」でダウンロードしたzipファイルを指定してインストールする
2.2 NimBLE-Arduinoライブラリの追加
ESP32-S3でESP32-BLE-Keyboardライブラリを使う場合は、NimBLE-Arduinoライブラリが必要とのこと(USE_NIMBLE)。出典
- Arduino IDEの「ライブラリを管理」にて
NimBLE-Arduino
を検索しインストールする
3. USE_NIMBLE
#define USE_NIMBLE
をソースコードの先頭に追加する。
#define USE_NIMBLE
#include <BleKeyboard.h>
4. USB-Keyboardと共存させる場合
USBにつながっている時は、USBキーボードとして動作し、USBにつながっていない時は、BLEキーボードとして動作させたい場合は、さらに以下の対応が必要。
4.1 KeyReport
が重複
USBとBLEでKeyReport
が重複してコンパイルエラーとなる場合は、BLE側の以下のソースを手修正する。
- } KeyReport;
+ } BLEKeyReport;
- KeyReport _keyReport;
+ BLEKeyReport _keyReport;
- void sendReport(KeyReport* keys);
+ void sendReport(BLEKeyReport* keys);
- void BleKeyboard::sendReport(KeyReport* keys)
+ void BleKeyboard::sendReport(BLEKeyReport* keys)
- this->inputKeyboard->setValue((uint8_t*)keys, sizeof(KeyReport));
+ this->inputKeyboard->setValue((uint8_t*)keys, sizeof(BLEKeyReport));
↓このプルリクがマスタに反映されれば不要な対応。
4.2 #define HID_SUBCLASS_NONE (0)
がエラーとなる
NimBLE-Arduino/src/HIDTypes.h:29:29: error: expected identifier before '(' token
#define HID_SUBCLASS_NONE (0)
^
arduino_tinyusb/tinyusb/src/class/hid/hid.h:63:3: note: in expansion of macro 'HID_SUBCLASS_NONE'
HID_SUBCLASS_NONE = 0, ///< No Subclass
NimBLE-Arduino
のHIDTypes.h
と、arduino_tinyusb/tinyusb/src/class/hid/hid.h
でHID_SUBCLASS_NONE
の定義が重複する(enumの名前が#defineに置き換るエラー)。
値は同じであるため、NimBLE-Arduino
の方をコメントアウトする。
- #define HID_SUBCLASS_NONE (0)
+ // #define HID_SUBCLASS_NONE (0)
5. ペアリングした後
スマホに初めてペアリングしたとき下記のエラーが出るが、キーボードの送信は正く出来ているのでそのまま使える。また、スマホ側にはエラーは見えない。
BT_GATT: GATT_INSUF_AUTHENTICATION
or
BT_GATT: GATT_INSUF_ENCRYPTION
おわりに
以上で、コンパイル&アップロード&上手く動作するはずだ。