M5Stick-Cでスマホ用のリモートシャッターを自作してみた

M5Stick-Cを使って、遠くにあるスマホのシャッターを切るボタンを作ったのでプログラムを紹介します。

参考にしたサイト

動作の様子


接続時

非接続時

プログラム(コピペで動く)

#include <M5StickC.h>
#include <BleKeyboard.h>

BleKeyboard bleKeyboard("wak-BLEshutter");

// バッテリー更新用
unsigned long nextVbatCheck = 0;
// 接続確認用
bool Connected = false;
// バッテリー残量取得
int getVlevel() {
  float vbat = M5.Axp.GetBatVoltage();
  int vlevel = ( vbat - 3.2 ) / 0.8 * 100;
  if ( vlevel < 0 ) {
    vlevel = 0;
  }
  if ( 100 < vlevel ) {
    vlevel = 100;
  }
  return vlevel;
}

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(9);
  setCpuFrequencyMhz(80);
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 20);
  M5.Lcd.println("BLE Shutter");
  M5.Lcd.setCursor(0, 40);
  M5.Lcd.println("BtnA :Shutter");
  M5.Lcd.println("     wak-tech");

  // 起動時にしかバッテリー残量は設定できない
  bleKeyboard.setBatteryLevel(getVlevel());
  bleKeyboard.begin();
}

void loop() {
  // ボタン状態更新
  M5.update();
  M5.Lcd.setCursor(0, 0);
  // キー操作
  if (bleKeyboard.isConnected()) {
    if (Connected==false){
      M5.Lcd.fillScreen(GREEN);
      M5.Lcd.printf("Connected");
      Connected = true;      
    }
    if ( M5.BtnA.wasPressed() ) {
      // 音量アップキーを送信
      bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
    }
  } else {
    if (Connected){
      Connected = false;
      M5.Lcd.fillScreen(RED);
      M5.Lcd.printf("Disconnect");
    }
  }

  // バッテリー残量更新(1分毎)
  if (nextVbatCheck < millis()) {
    M5.Lcd.setCursor(112, 0);
    M5.Lcd.printf("%3d%%", getVlevel());

    nextVbatCheck = millis() + 60000;
  }
  // Wait
  delay(100);
}

使い方

  1. M5stick-Cを起動する
  2. スマホでBluetoothをオンにして「wak-BLEshutter」に接続
  3. 画面が緑色になったら接続完了
  4. カメラを起動して、M5Stick-Cの真ん中のボタンを押す
  5. シャッターが切れる!

これで遠くにスマホを置いて、自分の姿を撮影できますね!便利。

若干解説

今回使用した技術はBLE keyboardです。M5Stick-Cに入っているESP32Bluetoothの機能を有しており、Bluetoothキーボードにすることもできます。

最近のカメラは音量ボタンを押すことでシャッターが切れるようになっていますので、逆にそれを利用します。Bluetoothキーボードから音量アップキー、つまり「KEY_MEDIA_VOLUME_UP」を送信してあげれば良いわけです。

この音量アップキーをメインのボタンに割り当てているため、リモートシャッターとして使えます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です