Arduinoで作るテレワーク向けマイクミュート切替ボタン



# はじめに
初Qiita投稿です。

Web会議中に話しかけられた時に「マイクミュートされてる！解除どこだ！」って焦ることありませんか？
こっそり別の作業していたりすると特に困りますよね。
ショートカットキーもありますが、アプリによって違ったり、片手で押せない組み合わせだったりで、慌ててしまいます。
ハードウェアのボタンあると良いなって思いません？思いますよね。

# 検討
Arduinoを使うとUSBキーボードに出来るらしいので、ボタン押したらキー情報を送信するハードウェアを作れば良さそうですね。注意点としてUSBデバイス(HID)に対応する**Leonardo系ATmega32U4を搭載したArduino**が必要です。LeonardoボードはUNOと同じサイズなので、ノートPCの隣において使うにはちょっと大きいですね。ここでは小サイズの**Arduino Pro Micro**を使うことにしました。

# 用意するもの

- Arduino Pro Micro
    - Sparkfunの公式ボードが2千円くらいのようですが、互換品がAmazonで数百円で買えます。5V 16MHz版と3.3V 8MHz版の２種類があるようですが、今回の用途だとどちらでも可。
- プッシュスイッチ
    - 押している間だけONになるモーメンタリスイッチであれば何でも良いです
    - マイクのミュートだけなら１個で良いですが、せっかくなので他のショートカットも登録出来るように数個使いましょう。
    - 主スイッチには秋月のこれを使いました。 http://akizukidenshi.com/catalog/g/gP-04581/
- ケース
    - ブレットボードでも良いですが、やっぱりケースに入れたいですね。
    - 今回は手元にあったタカチのMB型アルミケースの小さいやつを使用。
- ユニバーサル基板の切れ端
    - これもケースに固定する方法があれば無くても問題なし。

Amazonで買ったPro Microの互換品。ピンヘッダが付属しているところが良心的。
<img width="480" alt="promicro" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/8b34fd0e-0cc6-0b06-dd5a-a7823cb9c05d.jpeg">

# ハードウェア制作

プルアップ抵抗は内蔵のものを使うので、デジタルピンとグラウンドの間にスイッチを付けるだけ。
基板左側にGNDと2pin～が並んでいる部分があるので、そこを使いましょう。

こんな感じにケース加工して部品を取り付けました。
<img width="480" alt="button" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/42ff18d8-f67e-aaf7-2251-152440109bc6.jpeg">

出来上がりはこんな感じ。なんか自爆スイッチみたい。
<img width="480" alt="button" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/964825d3-b799-6679-f6f7-f44ae3f6463f.jpeg">

# プログラム作成

Arduino IDEの使い方は他に分かり易い記事がたくさんあるのでそちらを参照。
プログラムはこんな感じ。

```c:usbkey.ino
#include "Keyboard.h"

#define BTN 4

const uint8_t btnArray[BTN]  = {2,3,4,5};
const uint8_t btnSmplNum   = 10;
uint8_t btnCount[BTN];

void setup() {
  Keyboard.begin();
  for(uint8_t i=0; i<BTN; i++) {
    pinMode(btnArray[i], INPUT_PULLUP);
    btnCount[i] = btnSmplNum;
  }
}

void loop() {
  for(uint8_t i=0; i<BTN; i++) {
    if(digitalRead(btnArray[i]) == LOW) {
      if(btnCount[i] != 0) {
        btnCount[i]--;
      }
    } else {
      if(btnCount[i] == 0) {
        switch(i) {
          case 0: // Lync Mute
            Keyboard.press(KEY_LEFT_GUI);
            Keyboard.press(KEY_F4);
            Keyboard.releaseAll();
            break;
          case 1: // Launch Explorer
            Keyboard.press(KEY_LEFT_GUI);
            Keyboard.press('e');
            Keyboard.releaseAll();
            break;
          case 2: // Show Desktop
            Keyboard.press(KEY_LEFT_GUI);
            Keyboard.press('d');
            Keyboard.releaseAll();
            break;
          case 3: // Screenshot
            Keyboard.press(KEY_LEFT_GUI);
            Keyboard.press(KEY_LEFT_SHIFT);
            Keyboard.press('s');
            Keyboard.releaseAll();
            break;
          default:
            break;
        }
      }
      btnCount[i] = btnSmplNum;
    }
  }
  delay(10); // Sampling間隔(10ms)
}
```

特に工夫したところもないですが、大き目のスイッチ使っているので、
チャタリング対策で10ms間隔でキーをサンプリング。
10回連続でLOWを検出した後に、HIGHを検出したら（指を離したら）キーイベントを送信してます。

caseの中身はやりたいことに合わせて適宜変更を。
主目的はLyncのミュート切替のため、Alt+F4 を黒いボタンにアサインしています。
Zoomなら Alt+A、Skypeなら Alt+M ですかね？

# 動作確認

プログラムを書き込んで、パソコンにつないでみましょう。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/2e95f51d-60c2-c657-13e9-7af541d71ce1.png)
お、USBデバイスとして認識開始？

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/46515202-8919-277f-121f-13f8c6b77b59.png)
デバイスマネージャーからも見えるようになりました。

アプリ立ち上げて黒いボタン押すとミュート切替も無事動きました。

# おしまい

こんな感じで活用されています。1000円以下で作れて便利です。
プログラム自由なマクロキーボードなので、使い方は無限大ですね。
オススメです。

<img width="480" alt="button" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558348/b390be6f-f3d3-b6dc-46ae-36fd30ba2d2f.jpeg">