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版の2種類があるようですが、今回の用途だとどちらでも可。
  • プッシュスイッチ
    • 押している間だけONになるモーメンタリスイッチであれば何でも良いです
    • マイクのミュートだけなら1個で良いですが、せっかくなので他のショートカットも登録出来るように数個使いましょう。
    • 主スイッチには秋月のこれを使いました。 http://akizukidenshi.com/catalog/g/gP-04581/
  • ケース
    • ブレットボードでも良いですが、やっぱりケースに入れたいですね。
    • 今回は手元にあったタカチのMB型アルミケースの小さいやつを使用。
  • ユニバーサル基板の切れ端
    • これもケースに固定する方法があれば無くても問題なし。

Amazonで買ったPro Microの互換品。ピンヘッダが付属しているところが良心的。

ハードウェア制作

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

こんな感じにケース加工して部品を取り付けました。

出来上がりはこんな感じ。なんか自爆スイッチみたい。

プログラム作成

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

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 ですかね?

動作確認

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


お、USBデバイスとして認識開始?


デバイスマネージャーからも見えるようになりました。

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

おしまい

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