素早くマイクミュートとPCスリープが出来るDIYボタンを作る
公開日 更新日 2020/09/27
2020年はCOVID-19の影響で長期にわたる外出自粛が続きました。9月時点で外出自粛が緩和されているとはいえ、依然として在宅勤務(リモートワーク)が続いてます。
数か月の在宅勤務を経験してみると、一部のPC操作にストレスを感じこれを改善したらとても晴れやかな気持ちになったため、この勢いで記録したいと思います。
背景と要件
COVID-19の影響で全世界規模で在宅勤務やオンライン授業によるリモート接続作業が格段に増えると、次の操作がとても煩わしく感じるようになりました。
- ミーティング中で発言しない時に、自分のマイクをミュートするためオン・オフを切り替えるショートカット操作が多い。
※ 3人以上出席している場合、余計な音声が入ると進行の妨げになるため重要な操作だったりします。 - 作業が終わりPCのスリープ(電源オフ)をするとき、ノートパソコンの小さな電源ボタンを押す操作の頻度が上がった。
※ 補足ですが、私はUSB接続のキーボードとHDMI接続の大きいサイズの外部モニターを併設してるので、ノートパソコンなのに電源ボタンが遠い位置にあるという点も不満点でした。
この2点を一度に解決するため、各機能をこなせる専用ボタンを増設したくなり調査してみるとそれぞれ次のような感じでした。
- マイクのミュート
ヘッドセットやマイクによってオン・オフスイッチ付きモデルがあるが、特定の商品になって選択肢が限られる。
またスイッチ付きモデルの切替スイッチのサイズが小さいため使いずらそうだった。 - 電源ボタン
キーボードに搭載されたものもあるが、やはり選択肢が限られるのが難点。
意外にもシャットダウンしかできずスリープにならないものもあった。
都合の良い製品を見つけることができなかったので、最終的に今手元にある設備をそのまま使い、専用ボタンを自作してみることにしました。
要件
ボタンを自作すること自体がハードルの高い目標だと思うので、達成するポイントを以下に絞ってます。
- Arduino Pro MicroのUSBデバイス機能を体験する。
- 部品数を減らして簡単に作ってしまいたい。
- 美しさは追及しない。
- マイクのミュート機能は最低限。カスタマイズ機能を作らない。★
- PCのスリープは実現方法が2つ見つかったが簡単な方だけに絞る。★
Arduinoの中でもArduino Pro Micro(ATmega32U4コントローラー搭載モデル)は自身がUSBデバイスになってPCと通信できる機能が備わっており、今回はこの機能を使ってみます。
Arduinoを使ってUSBデバイスを作る方法としては、ほかにもV-USBライブラリを使いソフトウェアでUSB通信を実現させる選択肢もありましたが、V-USBを使うための回路には多くの電子部品が必要になるためハードルが上がってしまいます。そのため今回はArduino Pro Microを使って楽をしました。
★の2点については後半に整理します。
使用する部品
- Arduino Pro Micro ・・・400円前後
- micro USBケーブル ・・・100円前後
- いずれかのボタン装置 ・・・100円~1000円程度
Arduino Pro MicroやUSBケーブルはAliExpressで検索すると輸送時間がかかるものの安く仕入れることが可能でした。
正確にはArduino互換品ですが、特に動作上の不満はありませんでした。
ボタン装置についてはどの組み合わせで作ってもよいのですが、ボタン部品として単品で探すより既製品を改造するほうが組み立てや加工にかける時間を大幅に減らすことが可能で、私は↓こちらのおもちゃの商品の中身を改造することにしました。なお、ダイソーに売ってそうなグッズでも実現できる気がしてるので最低価格を100円としました。
このボタンの場合ですが、単3電池2個を入れるスペースがあり、ここに丁度Arduino Pro Microを格納することが可能でした。
装置自体にLEDが付いてたのでボタンを押したときに光らせる機能として活用したのと、もともとの電源スイッチ部分を使いボタンを押したときの動作を切り替える機能として活用しました。
その他、スピーカーやマイクも内蔵してましたが、使い道がないのでケーブルを切断しそのまま放置してます。価格が割高だったのは、このようなセンサー類が搭載されていたからなんですね。
回路図
回路図はLED1個とボタン2個を3つのGPIOで結線したシンプルな物。
今回使った3,14,15の3つのGPIOには特にこだわりはなくどれでもよいのですが、ATmega32U4が持つGPIOをほとんど使ってなくてかなり贅沢な回路。
※ 2日目の記事では配線しやすいようにGPIOを3,7,8を使うように変更しました。
- GPIO3がLEDの制御用。
- GPIO14の方は、押したらオン、離したらオフになるスイッチ処理用。
- GPIO15の方は、オン・オフどちらかを示す、機能選択の切替スイッチ処理用。
あとは、電動ドリル等でボタン装置にいい感じにUSBケーブルを通す穴をあけたら完成!
映ってない底面に切り替えスイッチ、ボタン内にLEDあり。
Arduinoソースコード
Arduinoプログラムには、前述のLED/ボタンのGPIOを制御する部分を実装。
どちらかというとボタン装置にArduinoを組み込む加工をする方に時間がかかってました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include "Keyboard.h" #define BTN1_PIN 14 #define BTN2_PIN 15 #define LED_PIN 3 #define LOOP_DELAY 8 #define FUNC_BORDER 3 #define KEYPUSH_TIME 10 int button_counter = 0; bool button_pressed = false; bool button_function_executed = false; void setup() { // Deactivate built-in LEDs pinMode(LED_BUILTIN_TX, INPUT); pinMode(LED_BUILTIN_RX, INPUT); pinMode(BTN1_PIN, INPUT_PULLUP); pinMode(BTN2_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); Keyboard.begin(); } void loop() { delay(LOOP_DELAY); // digitalRead(BTN1_PIN) returns LOW if pressed if (digitalRead(BTN1_PIN) != (button_pressed ? LOW : HIGH)) { button_pressed = !button_pressed; button_counter = 0; button_function_executed = false; } button_counter++; if (button_counter > FUNC_BORDER) { button_counter = FUNC_BORDER; if (!button_function_executed) { button_function_executed = true; if (button_pressed) { button_press(); } else { button_release(); } } } } void button_press() { digitalWrite(LED_PIN, HIGH); if (digitalRead(BTN2_PIN) == LOW) { macro_microphone(); } else { macro_sleep(); } } void button_release() { digitalWrite(LED_PIN, LOW); Keyboard.releaseAll(); } /** Alt + a */ void macro_microphone() { Keyboard.press(KEY_LEFT_ALT); delay(KEYPUSH_TIME); Keyboard.press('a'); delay(KEYPUSH_TIME); Keyboard.releaseAll(); } /** Win + x -> u -> s */ void macro_sleep() { Keyboard.press(KEY_LEFT_GUI); delay(KEYPUSH_TIME); Keyboard.press('x'); delay(KEYPUSH_TIME); Keyboard.releaseAll(); delay(KEYPUSH_TIME); Keyboard.press('u'); delay(KEYPUSH_TIME); Keyboard.releaseAll(); delay(KEYPUSH_TIME); Keyboard.press('s'); delay(KEYPUSH_TIME); Keyboard.releaseAll(); } |
ソースコードの補足
- 7,8,9行目
ボタンを押したときの待ち時間、および、USBキーボードのキーを押す操作の待ち時間のための制御用パラメータ。キーボードの待ち時間は検索すると諸説あるようですが動作させながら調整して決めました。 - 17,18行目
Arduino Pro Microには内蔵LEDが3つありますが、電池ボックス内で光る意味がないので、そのうち制御可能な2つ分をオフにしてます。 - 39行目
ボタンのチャタリング防止用の処理。INPUT_PULLUPに設定するとArduino内部でやってくれていそうな気もしますが念のためカウンターを使って防止する処理を加えました。 - 71~75行目、82~94行目
USBキーボードとなって、PCにキーボード入力する処理。今回はマイクのミュートの切り替えとPCのスリープを実現する処理にしました。
マイクのミュートについて
残念なことにWindowsアプリでマイクをミュートするショートカットが統一されてないようです。
例えばミーティングアプリとしてZoom、Skype、Google Meetを2つ以上使い分ける使い方の場合、マイクのミュートに複数のショートカットをアプリごとに切り替えなければなりません。
しかしArduinoをUSB接続したキーボードとして認識させていた場合、操作するアプリが何ものか知る方法がないのでArduinoプログラム上で実行するショートカットを切り替える処理を実現できません。
マイクのミュートを制御するためのユーティリティソフトをWindowsにインストールすると、すべてのアプリに共通したショートカットも実現できるのですが、今回はとりあえず自分に関係のあるZoomだけ使えればよかったので、ソースコードはシンプルにAlt+aを実行するよう実装してます。
PCのスリープについて
ソースコードに示すPCのスリープ処理は、Windowsのショートカットでスリープ機能を実現する一連のキーボード操作「Win+x ⇒ u ⇒ s」を実行してます。
真面目にスリープする方法について調べると、USBのメディアキーボード機能を使ってきちんと実装できるのですが、どうもArduino標準でこのメディアキーボード機能が扱えないようです。
検索すると、メディアキーボード機能もArduinoの既存処理を少し修正することで実現できるという記事があり時間をかければできるのですが、独自に実装すればその分だけソースコードが膨れてしまいます。
そのため今回は簡単に実現できるWindowsのショートカットで実装しました。
最後に
COVID-19の影響で在宅勤務やオンライン授業によるリモート接続作業が始まり、すでに数か月が経過し実はもうすでに自宅待機が解除されリモート接続が不要になりつつあります。
とは言え、折角ArduinoでUSBデバイスを体験したので記事としてまとめてみました。
USBデバイスって自作できるんだ、と興味を持ったら試しに作ってみてはいかがでしょうか。
Information
レスポンシブ広告
関連記事
-
「子ども見守りサービス」をDIYで自作する
最近「子ども見守りサービス」が注目されているようです。 どうも私は課金の発生する …
-
Arduinoでロータリーエンコーダーの動作確認
ロータリーエンコーダーは、よくボリューム調整のつまみに使われているようなモジュー …
-
SlackのIncoming Webhooksが失敗した時の対処
我が家のIoTとしてSlackのIncoming Webhooksを活用したサー …
-
ATmega328の書き込み装置をArduino UNO用シールドとして作成
前回、AVRマイクロコントローラーのATmega328PへのArduinoブート …
-
ドア開閉イベントをSlackへお知らせするセンサーを作る
最近Raspberry Piを手に入れてから個人的にマイコンが流行っていて、WE …
-
AndroidとiPhoneのUSB充電器の規格の違いに関する疑問を調査
先月タブレットを購入して以来、スマートフォンやタブレットをUSB接続で充電するた …
-
USBケーブルの違いから来るもろもろの比較
USBケーブルって端子の形が同じなのだから、どれを使ってもいい感じに使えるんじゃ …
-
ArduinoのPinChange割り込みライブラリとタイマーライブラリを使う
前回、素早くマイクミュートやPCスリープが行えるボタンを自作することで、とても晴 …
-
Attiny13Aの工場出荷時の書き込みエラーを対策
Attiny13Aは工場出荷時に低速の動作周波数になってる模様です。 この時Ar …
-
ATmega328へArduinoを書き込む
Arduino UNO等のArduinoボードを購入すると、USB端子に直接接続 …