Bluetooth接続のフットスイッチを作ってZoomのミュートON/OFF切り替えに活用してみる

# はじめに
WEB会議で、他の人の発言中はマイクをOFF、自分が発言するときだけマイクをON、しようとして、操作に手間取ることありませんか？というわけで、WEB会議ツールのZoom[^zoom]を対象に、簡単にマイク（ミュート）のON/OFFを切り替えられるデバイスを作ってみました。

# 方針
WEB会議ツールによりますが、マイクのON/OFFはキーボードからのショートカットキー入力でも可能です。Zoomの場合、Macでは「Shift＋Cmd＋A」、Windowsでは「Alt＋A」です。しかも、Zoomの場合、設定画面で「グローバルショートカットを有効化」しておくと、Zoomがバックグラウンドにあっても（Zoomにフォーカスがあたってなくても）、ショートカットキーの入力によってマイクのON/OFFを切り替えられます。
<img width="817" alt="スクリーンショット 2020-05-06 14.02.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/98028e88-ec4d-4593-f24e-e37e0cc46ed3.png">
そこで今回は、このショートカットキーを入力するための専用のキーボードを作ることにしました。ただし、「キーボード」と言っても、入力するのは1つのショートカットキーだけで良いので、キー（ボタン？スイッチ？）は1つで十分です。また、両手をフリーにできると嬉しいので、足で押せるものにしてみます（ついでに、足元に置けるようBluetoothで無線化します）。

要は、「Bluetooth機能を備えたマイコン」に「足で押せるスイッチ」をつないで、ショートカットキーを1つだけ入力できるBluetoothキーボード的なものを作ることにします。

# 実装

## ハードウェア
まず、「Bluetooth機能を備えたマイコン」としては、定番のESP32[^esp32]を使います（今回はプロトタイプということで、スイッチサイエンスの開発ボード[^dev32]を使用）。Arduino[^arduino]の開発環境でソフトが書けるのが大きなメリットで、今回も、Bluetoothキーボードを作るためのESP32用ライブラリ[^esp32blekb]を見つけたので、これをそのまま活用しました。

次に、「足で押せるスイッチ」ですが、今回は、パナソニックが電化製品を足でON/OFFするための配線器具として販売しているフットスイッチ[^pana]を使ってみました。Amazonでも購入可能（購入時点では636円でした）です。分解して以下のように配線することで、普通のスイッチとして使えます。
![fp_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/061f5816-8066-9f8c-1dc9-00b8a110c36a.jpeg)
あくまで普通のスイッチなので、配線を「Bluetooth機能を備えたマイコン」のデジタル入力ピンにつなぐだけ。非常にシンプルです。
![fp_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/346f4517-6fe5-e132-e69b-a61b39cb5fbf.jpeg)

## ソフトウェア
ESP32で動かすArduinoのスケッチは以下のとおり。
Bluetoothキーボードのライブラリ[^esp32blekb]のおかげで、非常に簡単に書けてしまいました。ありがたい。。。
*パナソニックのフットスイッチがオルタネイト型[^switch]だったので、これをモーメンタリ型として使えるよう、ちょっと余計な処理が入ってます。*

```c:ZoomButton.ino
#include <BleKeyboard.h>

#define PIN_BTN 23

BleKeyboard bleKeyboard("Zoom Button", "none", 100);
int state = HIGH;

void setup() {
  pinMode(PIN_BTN, INPUT_PULLUP);
  bleKeyboard.begin();
}

void loop() {
  if(bleKeyboard.isConnected()) {
    if(digitalRead(PIN_BTN) != state){
      // Shift + Cmd + A (Mac)
      bleKeyboard.press(KEY_LEFT_SHIFT);
      bleKeyboard.press(KEY_LEFT_GUI);
      bleKeyboard.press('a');
      /**
      // Alt + A (Win)
      bleKeyboard.press(KEY_LEFT_ALT);
      bleKeyboard.press('a');
      **/
      delay(100);
      bleKeyboard.releaseAll();

      while(digitalRead(PIN_BTN) != state);
      state = (state + 1) % 2;
    }
    delay(100);
  } else {
    delay(5000);
  }
}
```
上記のコードをESP32に書き込むと、普通のBluetoothキーボードと同じように「Zoom Button」というデバイスがパソコンに認識されて、ボタンを押すたびに「Shift＋Cmd＋A」のショートカットキー入力をしてくれます。
<img width="687" alt="スクリーンショット 2020-05-06 17.00.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/a585ba03-58eb-f653-f0b2-a1418ac65802.png">

# おわりに
とっさに発言したいとき、画面操作やキーボード入力ではなく「足でボタンを押して」マイクON、って、意外と理にかなってて便利です。
![fp_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/bfc76f45-0aa6-d217-9f81-65823792a960.jpeg)


[^zoom]: [Video Conferencing, Web Conferencing, Webinars, Screen Sharing - Zoom](https://zoom.us/)
[^esp32]: [ESP32 - Wikipedia](https://ja.wikipedia.org/wiki/ESP32)
[^dev32]: [ESPr® Developer 32 - スイッチサイエンス](https://www.switch-science.com/catalog/3210/)
[^arduino]: [Arduino - Home](https://www.arduino.cc/)
[^esp32blekb]: [T-vK/ESP32-BLE-Keyboard: Bluetooth LE Keyboard library for the ESP32 (Arduino IDE compatible)](https://github.com/T-vK/ESP32-BLE-Keyboard)
[^pana]: [10Aフットスイッチ（ホワイト） WH5709KWP 商品概要 | 配線器具 | Panasonic](https://panasonic.jp/tap/p-db/WH5709KWP.html)
[^switch]: 押しボタン式のスイッチのうち、ON状態を保持するタイプのスイッチが「オルタネイト型」。ON状態を保持しないタイプは「モーメンタリ型」。