ESP-IDF ESP32でのBluetooth HIDの利用
ESP32 ESP-IDF Bluetooth BLE HIDこんばんは、kat-kaiです。最近、ESP32でBluetooth HIDデバイスのデモコードが公開されましたので、その紹介をしたいと思います。
ちなみにデモコードは、こちらの下の方https://t.co/KbFsbbXizZ
— kat-kai (@katkai3) November 7, 2017
まだ詳しく内容見れてません
ESP32 (ESP-WROOM-32)とは
Espressif Systems社によって開発されたWiFi, Bluetoothが搭載されたワイヤレスモジュールです。
1500~2000円程度で購入可能な開発ボードを使えば、PCとUSB接続するだけでESP32の開発ができます。
- 秋月電子 ESP32-DevKitC ESP-WROOM-32開発ボード
- スイッチサイエンス ESPr® Developer 32
ESP32モジュール単体だと、開発には別途USB-シリアル変換モジュールですが600~700円程度で購入可能です。
ESP32の開発環境
ESP32の開発環境として、ESP-IDF, Arduino ESP32, Micropythonなどがあります。
- ESP-IDF
- 提供されている開発環境の中でもESP32の機能を最大限利用することが出来る
- Arduino ESP32
- Arduinoライクな開発が可能
- ESP32用のArduinoライブラリが公開されていて便利
- Micropython
- Python 3.xで開発できる、らしい。
これらのうち、今回のデモコードはESP-IDFで実装されております。
ESP-IDFでのBluetooth Low Energy (BLE) HIDデバイスとしての利用について
Bluetooth Low Energy (BLE)はBluetooth 4.0以降のことであり、省電力を目的とした規格です。
BLEでHIDデバイスとして振る舞うにはHOGP (HID-over-GATT Profile)と呼ばれるプロファイルを使う必要があります。
これまでには、Bluekichen’sによって開発された外部のライブラリBTstackを使うことで
ライブラリの導入が少し面倒ではありますが、Bluetoothキーボードやマウスとして振る舞うことが出来ていました。
また過去にはBTstackを用いたHOGPのデモコードについて紹介しています。
今回、Espressif社より公式(現時点ではまだ非公式かも?)のデモが公開されました。
本デモコードでは、ライブラリを新たに導入する必要がないため、比較的容易に開発を始めることが出来ます。
- Bluetooth Low Energy (BLE)によるHID-over-GATT Profileのデモコード
[TW#13919] Bluetooth HID implementation progress?
ただ問題点として、人によってはパソコン側で認識できないこともあるそうなので
もし今回のデモコードの動作が不安定そうならBTstackを試してみるのも良いかもしれません。
今回のデモコード
今回のデモコードは、ホスト側のスマートフォンのボリュームを上げ下げするコードです。
まずESP32にデモコードを書き込み、起動してみるとAndroid側からはデバイス名”HID”として表示されます。
これをペアリングすると、ボリュームが上がって、下がってを繰り返します。
それではデモコード中のキー入力を操作する箇所を見てみます。
実際のキー入力の制御はble_hidd_demo_main.c
233行目のhid_demo_task
関数で行われています。
void hid_demo_task(void *pvParameters)
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
while(1) {
vTaskDelay(2000 / portTICK_PERIOD_MS);
if (sec_conn) {
LOG_ERROR("Send the volume");
send_volum_up = true;
//uint8_t key_vaule = {HID_KEY_A};
//esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule, 1);
esp_hidd_send_consumer_value(hid_conn_id, HID_CONSUMER_VOLUME_UP, true);
vTaskDelay(3000 / portTICK_PERIOD_MS);
if (send_volum_up) {
send_volum_up = false;
esp_hidd_send_consumer_value(hid_conn_id, HID_CONSUMER_VOLUME_UP, false);
esp_hidd_send_consumer_value(hid_conn_id, HID_CONSUMER_VOLUME_DOWN, true);
}
}
}
}
esp_hidd_send_consumer_value
関数によって音量を上げ下げしています。
ここではコメントアウトされていますが、
esp_hidd_send_keyboard_value
関数を用いることでキーボード入力できることも分かります。
またHID_KEY_A
のようなキーコードの詳細はhid_dev.h
に記載されています。
今回のデモコードでは、ある一定の間隔で単にボリュームを上下させるだけでしたが、
キースイッチを接続したESP32でGPIO割り込み処理をすることで
キーボードを作製することも出来そうですね!
おわりに
実は今回紹介したデモコードは、次回アップデートで導入される予定だったようです。ただ需要があったようで、本デモコードのみ先行公開されています。
今回のデモコードを参考にすることで、ESP32で自作Bluetoothキーボードやマウスを作ることが出来ますね!
容易にHIDデバイスを自作出来るようになると、色々と夢が広がって楽しいです!それでは!