06.ATOM Liteでスマホの写真シャッター


06.ATOM Liteでスマホの写真シャッター

Atomのボタンを押すと、Bluetoothでスマホのシャッターが切れます。ただし、音量upボタンで写真のシャッターが切れるスマホが対象です。また、私の携帯の標準カメラでは動作しなかったので、Play ストアから"Open Camera" (Mark Harman) の無料カメラアプリをインストールしました。
https://wak-tech.com/archives/1796 を参考にしています。

ESP32 BLEキーボードライブラリ

ESP32-BLE-Keyboard
https://github.com/T-vK/ESP32-BLE-Keyboard
ESP32をBluetoothキーボードとして、テキスト送信や個々のキーを押す等の機能があります。

・print: 文字列を入力
・write: 指定キーを押してすぐに離す
・press: 指定キーを押す (release するまで押したままにする)
・release: 指定キーを離す
・releaseAll: すべてのキーを離す

キーには、
・KEY_MEDIA_VOLUME_UP: 音量up
・KEY_MEDIA_VOLUME_DOWN: 音量down
等があります。

インストール

https://github.com/T-vK/ESP32-BLE-Keyboard/archive/refs/heads/master.zip
をダウンロードし、ディスクトップに置きます。

Arduino-IDE > スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール... > 先程のESP32-BLE-Keyboard-master.zipを指定 > 開く
でインストールできます。

操作方法

1.Atomを起動
2.AtomのLEDが緑色なら4へ、赤色なら3へ
3.スマホ > 設定 > Bluetooth > 利用可能なデバイスの"BLE-Shutter"を指定 > ペアリング
(Atomを再起動したら、スマホで1度ペアリングを解除し、再ペアリングが必要な場合もあります。)
4.AtomのLEDが赤色から緑色でBLE Keyboardに接続完
5.スマホ > カメラを開く
6.Atomのボタンを押す(一瞬赤色)
7.スマホのシャッターが切れます

・LEDが緑色は、BLE-Keyboardに接続できた時
・起動してLEDが赤色は、BLE-Keyboardにまだ接続できていない時
・ボタンを押してLEDが赤色は、音量upキーを送信した時
です。

解説

ESP32 BLE Keyboard library (ESP32-BLE-Keyboard)を使用することによって、ESP32をBluetoothキーボードにすることができます。私のスマホは音量ボタンを押すことでシャッターが切れるようになっていますのでそれを利用します。しかし、BLEには対応していないようなので、別アプリをダウンロードしました。BLE Keyboardから音量アップキー、つまり"KEY_MEDIA_VOLUME_UP"を送信してあげれば良いわけです。このキーをボタンに割り当てているため、リモートシャッターとして使えます。
消費は、72mA, 360mWでした。

スケッチ


// スマホのBluetoothシャッター  Atom Lite
// https://wak-tech.com/archives/1796 を参考
#include <M5Atom.h>                      // ATOMを使用
#include <BleKeyboard.h>                 // BLEキーボードを使用
BleKeyboard bleKeyboard("BLE-Shutter");  // Bluetooth名を設定
bool Connected = false;                  // 接続状態変数

void setup() {
  M5.begin(true, false, true);  // 初期化(Serial,I2C?,Display)
  Serial.begin(115200);         // Upload Speed=15200にする
  bleKeyboard.begin();          // Bluetoothキーボード開始
  Serial.println("start");  // 表示
}

void loop() {
  M5.update();                                 // ボタンの状態を更新
  if (bleKeyboard.isConnected()) {             // Bluetoothキーボードが接続されていれば
    Serial.println("Connect");                 // 表示
    if (Connected == false) {                  // 接続変数=非接続ならば
      Connected = true;                        // 接続変数=接続にする
      Serial.println("Disconnect->Connect");   // 表示
      M5.dis.drawpix(0, 0x008000);             // LED緑色
    }                                          //
    if (M5.Btn.wasPressed()) {                 // ボタンが押されていたら1回だけtrue,それ以外はfalse
      Serial.println("Btn push");              // 表示
      M5.dis.drawpix(0, 0xFF0000);             // LED赤色
      bleKeyboard.write(KEY_MEDIA_VOLUME_UP);  // 音量upキーを送信
      delay(200);                              // 赤色点灯時間
      M5.dis.drawpix(0, 0x008000);             // LED緑色
    }                                          //
  } else {                                     // Bluetoothキーボードが接続されていなければ
    Serial.println("Disconnect");              // 表示
    M5.dis.drawpix(0, 0xFF0000);               // LED赤色
    if (Connected) {                           // 接続変数=接続ならば
      Connected = false;                       // 接続変数=非接続にする
      Serial.println("Connect->Disconnect");   // 表示
    }                                          //
  }                                            //
  delay(200);                                  // 0.2秒待つ
}
* flash memory(1.3Mbyte)のうち、スケッチが83%使用。RAM(327kbyte)のうち、global変数が12%使用、local変数で288kbyte使用可能。(1000byte=1kbyteで計算)