ESP32-S3でBLEキーボードモードでandroidのシャッターを切る at VScode

カテゴリー: ESP32  タグ:

原典は、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スマホのシャッターは問題なく切れています

お気軽にコメントをどうぞ。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)