メモ帳DPA

ぐぐってあまり引っかからないような何かがあったら書いたりする

防音室の扉に連動してPCの音声を自動制御する

PC部屋として防音室を買った。いつでも好きに音を出せて快適になった。
(防音室についての記事は別途そのうちいつか書くかと思う)

防音室の出入りの際は空いた扉から当然音が漏れるので、夜中の利用時はその都度PCをミュートしたりしていた。
開いてるタイミングと音出したくないタイミングは一致しているので、これはセンサーつければ簡単に自動化出来るのではということに気づいた。

作った

できた。磁力でドアの開閉を検出できるセンサーがあったので、Arduino(pro micro)に単純に半田付けしたらそれだけで超簡単に完成した。
f:id:de0:20210101134948j:plain

ドアの端と枠にそれぞれコマンドタブで貼り付けて、USBケーブルつないだら設置完了。
f:id:de0:20210101135638j:plain

ドアを開けたらPCの音声がミュートされ、ドアを閉じたらミュートが解除されるようになった。やったね。

ソース

digitalreadで開閉状態が取れるので、それに応じて処理を入れるだけで簡単に出来た。
USBキーボードとして認識させ、状態遷移時にホットキーを送るようにした。
本当はミュートのメディアキーを直接送るつもりでいたんだけど、用意されているサンプルで対応していたのは基本的なキーコードのみだったので、PC側でAutohotkeyを併用して妥協した。

Arduino
#include "Keyboard.h"

//ピン定義
const int buttonPin = 5;
const int ledPin =  17;

//センサ状態用変数
int buttonState = 0;
int prevState;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {
    //CloseならHIGH
    digitalWrite(ledPin, HIGH);
  } else {
    //OpenはLOW
    digitalWrite(ledPin, LOW);
  }

  if ( (buttonState == HIGH) && (prevState == LOW) ) {
     //閉じられた時の処理 - SHIFT+Alt+Ctrl+c
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.press('c');
     Keyboard.releaseAll();

  } else if ( (buttonState == LOW) && (prevState == HIGH) ) {
     //開けられた時の処理 - SHIFT+Alt+Ctrl+o
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.write('o');
     Keyboard.releaseAll();
  }

  prevState = buttonState;
  delay(10); //delayなしだと開放時に一回余分に閉じ明けが認識されるので回避
}
PC側(Autohotkeyスクリプト)
+^!c::Soundset,0,master,mute	;ドア閉まったらミュート解除
+^!o::Soundset,1,master,mute	;ドア空いたらミュート

おわり

かなりシンプルに実現できてしまった。
現状特にアイディアはないんだけど、同じ要領でArduinoで使えるあらゆるセンサーとPCが連携できそうなので、他にもいい感じの何かを思いついたら試そうと思う。

枠が空いてたので、この記事は Arduino Advent Calendar 2020 に遅刻で登録しました。
qiita.com