原典は、garretlabさんの「Arduinoで遊ぶページ:スマホカメラのシャッターを切る」です。ESP32-WROOM-32Eで試したら、あっさり動作OK。同じ音量キーでカメラのシャッター切れるタイプならandroidだけでなくiPhoneなどにも応用できそうな有用な情報です。
ただ、ESP32-S3ではそのままOKとはいかなかったので、その顛末です
ESP32-S3ではコード追加が必要
今回も環境はVScode+PlatformIOです。ArduinoIDEのデモを移植するときは、先頭に
#include <auduino.h>
を加えています
ESP32-S3でBLEを使うにはNimBLEライブラリが必要らしい
Web検索でたどり着いた対策です。とりあえず、イニシャルで以下のコードを加えます
#if defined(USE_NIMBLE)
BLEDevice::setSecurityAuth(true, true, true);
#else
BLESecurity* pSecurity = new BLESecurity();
pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND); // S3では必要
#endif // USE_NIMBLE
当然USE_NIMBLEはdefineされてないので#else以降の2行が重要と思います
要は、
pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND);
を
pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND);
に置き換えるということです
というわけで、garretlabさんのコードに付加する
コード原典はgarretlabさんの著作権である旨を明示して掲載させていただきます
#include <Arduino.h> // VScode用に追加
#include "BleKeyboard.h"
BleKeyboard bleKeyboard;
void setup() {
Serial.begin(115200);
bleKeyboard.begin();
Serial.println("Press enter to take a picture.");
// 以下S3用に追加
#if defined(USE_NIMBLE)
BLEDevice::setSecurityAuth(true, true, true);
#else
BLESecurity* pSecurity = new BLESecurity();
pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND); // S3では必要
#endif // USE_NIMBLE
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == '\n') {
if (bleKeyboard.isConnected()) {
bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
Serial.println("Took a picture.");
} else {
Serial.println("Not connected.");
}
}
}
}
接続時にはESP32側のターミナルには、メッセージがでますが、androidスマホのシャッターは問題なく切れています