Zoomでハードウェアミュートボタンを作成する

最近、Instagramは専用のズームミュートボタンの広告を見せてくれましたが、それは私に非常に関連していることがわかりました。







はい、私は毎日ズームに電話します。はい、私にはこれらの電話をしばしば妨害する子供がいます。 Instagramの広告配信アルゴリズム、あなたが勝った、私はこのボタンが必要です。



しかし、私には偏見があります。 InstagramはKickstarterでプロジェクトを宣伝しています。さらに、このビデオをクリックしてもFacebookの広告収入に貢献したくありません。ジェニー・オデルの「空き時間はありません」という表現 、Instagram広告の製品品質に関する私の見解を完全に説明しています。さらに、Kickstarterプロジェクトに対する私の資金制限はほとんど使い果たされています。



私はKickstarterで多くのプロジェクトをサポートしてきましたが、これらのプロジェクトの結果から、マイケル・ダグラスが映画「I'veEnough!」で手に入れたハンバーガーを思い出すことがありました。





それでは、そのようなボタンを自分たちで組み立てましょう。



最初に考えるべきことは、どのボタンを押したいかということです。



CherryMXスイッチ付きのキーボードが大好きです。メカニカルスイッチには、リニア、触覚、クリックの3種類があります。線形-フィードバックがほとんどない状態で上下に移動する最も単純なタイプのスイッチ。触覚スイッチはストロークの途中に突起があり、キーを押したときに感じることができます。また、クリック可能なスイッチは、より強力な触覚フィードバックを備えており、押すとクリック音が聞こえます。



通常、スイッチテスター購入して、 どのタイプが応答しているかを把握します。 、そして私たちはまた、彼らが私たちを殺さないようにキーボードがどのような音を出すべきかを同僚に尋ねます。しかし、私たちはCOVIDの大流行の真っ只中にいるので、周りに同僚はいません!非常に大きな音で快適な触覚フィードバックを備えたCherryMXBlueスイッチを選択してください。Cherry MXのWebサイトでは、このスイッチを「クリック可能で表示可能」と呼んでいますが、これについてはまだほとんど言及されていません。





きれいに見えますが、もっと良いものを考えることができます。Cherry MX Blueスイッチを押してよければ、コミカルな大きさのCherry MXBlueを押したほうがいいのではないでしょうか。



そしてこれが NovelkeysBigSwitchです。





従来のスイッチの4倍、体積は64倍です。それも巨大なキャップを持っています!





残念ながら、Big Switchは住宅で販売されていないため、3Dプリントを使用する必要がありました。Thingiverseで美しいケースが見つかりました: NovelKeys Big SwitchCase誰かが元のデザインを改善したい場合に備えて、リミックスを探す価値は常にあります。この場合、Pro Microのコンパートメントを追加しリミックスがあり、スイッチがぴったりとフィットするので、それを印刷しました。





ケースができたので、それに挿入してスイッチに取り付けるボードが必要です。 プロマイクロは、このようなUSBキーボードなどのUSB HIDデバイスをエミュレートするATmega32U4チップを持っています。さらに、このボードは小さいです。









ラージスイッチの下部には2つの金属接点があります。





スイッチ内でキーを押すと、これら2つの接点間の回路が閉じます。





ProMicroのピンレイアウトを見てみましょう。





GNDを一方の金属ピンに接続し、ピン2をもう一方のピンに接続できます。ピン2は、キーが押されたときにHIGHを読み取り、押されていないときにLOWを読み取るデジタルI / Oピンです。



LEDを追加できるように、ミュートステータスの何らかの視覚的インジケータがあると便利です。



10mmのLEDを注文しました:





そして220オームの抵抗器:





LEDの長いレッグはPWRに接続し、短いレッグはGNDに接続します。長い脚ともう一方のピンの間に抵抗を挿入して、電流量を減らします。ボードの下部にあるピン9を選択しました。ショートレッグをGNDに接続しました。LEDと抵抗器に関するこのページが役に立ちました



ボードとスイッチの間にこの20AWGワイヤをはんだ付けしました。





結果は次の構造になります。





印刷されたケースにすべてを詰め込みましょう。





次に、コードを作成する必要があります。



私はSparkfunが巨大な保存ボタンを作成するために書いたコードから始めて、 それを少し修正しました。



原理は次のとおりです。キーを押すと、キーボードショートカットのズームが送信され、サウンドのオンとオフが切り替わります(MacではCmd-Shift-Aです)。ズームの焦点が合っていない場合でも認識されるように、このキーボードショートカットのズーム設定を変更する必要があります。 [グローバルショートカットを有効にする]チェックボックスをオンにします





また、キーを押すたびにLEDをオンまたはオフにします。 LEDは「オンエア」ライトに類似していると判断しました。青いLEDがオンのとき、私の音がオンになり、人々は私の言っていることを聞きます。



しかし、キーを押すたびにLEDをオン/オフするだけの場合、ズーム自体のミュート状態と同期を保つにはどうすればよいでしょうか。



Pro Microの便利な点は、シリアル接続も備えていることです。通常、Arduino IDEでデバッグ情報を印刷するために使用されますが、Zoomのオーディオオン状態と同期させるために使用できます。



ProMicro自体にロードするコードは次のとおりです。



#include "Keyboard.h"

// OS parameters
typedef enum {
  LINUX,
  WINDOWS,
  MAC
} os_types;

// Change this to your operating system
const os_types OS = MAC;

// Pins
const int btn_pin = 2;
const int led_pin = 9;

// Constants
const int debounce_delay = 50;              // ms

// Globals
int btn_state = HIGH;
int btn_prev = HIGH;
unsigned long last_debounce_time = 0;
int os_ctrl;
int led_state = LOW;

void setup() {

  Serial.begin(57600); // opens serial port, sets data rate to 57600 bps
  
  // Set up LED and button pins
  pinMode(btn_pin, INPUT_PULLUP);  // Set the button as an input
  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, led_state);

  // Begin keyboard
  Keyboard.begin();

  // Switch to correct control/command key
  switch(OS){
    case LINUX:
    case WINDOWS:
      os_ctrl = KEY_LEFT_CTRL;
      break;
    case MAC:
      os_ctrl = KEY_LEFT_GUI;
      break;
    default:
      os_ctrl = KEY_LEFT_CTRL;
      break;
  }

  // Get initial timestamp

  Serial.println("started");
  
}

void loop() {

  // Read current state of the button
  int btn_read = digitalRead(btn_pin);

  // Remember when the button changed states
  if ( btn_read != btn_prev ) {
    last_debounce_time = millis();
  }

  // Wait before checking the state of the button again
  if ( millis() > (last_debounce_time + debounce_delay) ) {
    if ( btn_read != btn_state ) {
      btn_state = btn_read;
      if ( btn_state == LOW ) {

        // Send cmd+shift+a
        Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.press(os_ctrl);
        Keyboard.press('a');
        delay(100);
        Keyboard.releaseAll();

        Serial.println("pressed");

        if (led_state == LOW) {
          led_state = HIGH;
        } else {
          led_state = LOW;
        }
        digitalWrite(led_pin, led_state);

      }
    }
  }

  // Remember the previous button position for next loop()
  btn_prev = btn_read;

  if (Serial.available() > 0) {

    String incomingString = Serial.readStringUntil('\n');

    if (incomingString == "muted") {
      led_state = LOW;
    } else if (incomingString == "unmuted") {
      led_state = HIGH;      
    }

    digitalWrite(led_pin, led_state);
    
  }
  
}
      
      





次に、Applescriptを追加して、ズームの現在の状態を報告できます。オリジナルのApplescriptを含むZoomStreamdeckプラグインを見つけ、 Zoomが開いているかどうか、およびそのサウンドの状態を報告するように変更しました。また、JSONを出力するようにスクリプトを変更しました。



set zoomStatus to "closed"
set muteStatus to "disabled"
tell application "System Events"
	if exists (window 1 of process "zoom.us") then
		set zoomStatus to "open"
		tell application process "zoom.us"
			if exists (menu bar item "Meeting" of menu bar 1) then
				set zoomStatus to "call"
				if exists (menu item "Mute audio" of menu 1 of menu bar item "Meeting" of menu bar 1) then
					set muteStatus to "unmuted"
				else
					set muteStatus to "muted"
				end if
			end if
		end tell
	end if
end tell

copy "{\"mute\":\"" & (muteStatus as text) & "\",\"status\":\"" & (zoomStatus as text) & "\"}" to stdout
      
      





Zoomの呼び出し中に実行すると、次のように出力されます。



$ osascript get-zoom-status.scpt
{"mute":"muted","status":"call"}
      
      





次に、ProMicroとこのスクリプトの間の仲介として使用される小さなアプリケーションをNodeで作成しました。



const { exec } = require('child_process');

const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('/dev/tty.usbmodemHIDPC1', {
    baudRate: 57600
});

var checkStatus = function() {
    console.log('Checking status...');
    exec('osascript get-zoom-status.scpt', (error, stdout, stderr) => {

        if (error) {
            console.error(`exec error: ${error}`);
            return;
        }

        var status = JSON.parse(stdout);
        if (status.mute == 'unmuted') {
            port.write('unmuted');
        } else {
            port.write('muted');
        }

    });
}

const parser = port.pipe(new Readline({ delimiter: '\r\n' }))
parser.on('data', function (data) {
    if (data == "pressed") {
        console.log('Button pressed.');
        checkStatus();
    }
})

checkStatus();
setInterval(checkStatus, 30000);
      
      





このスクリプトは2つのことを行います。ボタンが押されると、シリアルポートを介して「押された」コマンドがPro Microボードに送信され、Applescriptが実行されてZoomのオーディオの現在の状態が判別されます。次に、「ビープオフ」または「ビープオン」コマンドをPro Microボードに送信し、LEDを適切な状態に切り替えます。また、ボタンではなくズームインターフェイスを介して誤ってサウンドをミュートまたはミュート解除した場合に備えて、30秒ごとにスクリプトを実行するタイマーを作成しました。そうしないと、ボタンが押されたときにのみ状態が更新されます。



ズームを介した通話でボタンを使用すると、次のようになります。





私のキックスターターをサポートしてください-冗談です、私はキックスターターを持っていませんが、うまくいけば、あなたは自分でキックスターターを作成することができます。






広告



サーバーを注文して、すぐに作業を開始してください!1分以内任意の構成VDSを作成し ます。大作 :)






All Articles