В статье "OneBox - устройство для управления программами видеоконференций (Google Meet, Teams, Zoom)" было рассмотрено устройство для физического управления различными программам для проведения видеоконференций. Пульт управления позволяет управлять звуком, камерой и рядом других функций. Хорошее устройство, но возможно избыточно сложное, если задачи не такие масштабные. В этой статье мастер расскажет нам, как сделать подобное устройство, но с минимумом функций и одной или двумя кнопками. Нажмите кнопку, чтобы отключить звук, или удерживайте кнопку, чтобы покинуть собрание (или завершить его, если вы являетесь организатором).
В этом устройстве, впрочем, как и в предыдущем, есть одна замечательная особенность: оно работает, даже если ваше окно Zoom не активно. Если оно скрыто под кучей электронных таблиц и окон браузера - нет проблем - оно выводит окно на передний план и включает или выключает звук, или сессию.
Шаг первый: как работает устройство Это устройство просто имитирует клавиатуру, когда вы подключаете ее к компьютеру. Сочетание клавиш CTRL + ALT + SHIFT переводит фокус в окно масштабирования. ALT + A управляет состоянием звука, если звук включен, он выключает его, а если он выключен, он включает его ALT + Q покидает встречу или завершает ее, если вы являетесь организатором Это сочетания клавиш для версии приложения для Windows, но мастер уверен, что аналогичная вещь будет работать и на Mac, возможно, с изменением настроек, если нажатия клавиш разные. В сделанном устройстве короткое нажатие кнопки выполняет команду CTRL + ALT + SHIFT, затем ALT + A, а долгое нажатие выполняет команду CTRL + ALT + SHIFT, затем ALT + Q, затем ENTER. В устройстве мастер использовал клонированную плату Digispark (микроконтроллер attiny85) и построил на основе примера скетча из библиотеки Digikeyboard. Он также использовал эту библиотеку для работы с кнопкой. Для прошивки используется стандартная IDE Arduino. Код можно скачать ниже.
//Elliotmade 4/22/2020<br>//https://elliotmade.com/2020/04/23/physical-mute-button-for-zoom-meetings/
//https://www.youtube.com/watch?v=apGbelheIzg
//Used a digispark clone
//this will switch to the zoom application and mute it or exit on long press
//momentary button on pin 0 with pullup resistor
//https://github.com/mathertel/OneButton
//button library
#include "OneButton.h"
int button1pin = 0;
#include "DigiKeyboard.h"
//set up buttons
OneButton button1(button1pin, true);
void setup() {
// put your setup code here, to run once:
//set up button functions
button1.attachClick(click1);
button1.attachLongPressStart(longPressStart1);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(500);
}
void loop() {
// put your main code here, to run repeatedly:
//monitor buttons
button1.tick();
}
// This function will be called when the button1 was pressed 1 time (and no 2. button press followed).
void click1() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);
// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT);
DigiKeyboard.delay(100);
DigiKeyboard.sendKeyStroke(KEY_A, MOD_ALT_LEFT);
} // click1
// This function will be called once, when the button1 is pressed for a long time.
void longPressStart1() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);
// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_Q, MOD_ALT_LEFT);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
} // longPressStart1
Шаг второй: сборка Сначала мастер изготавливает корпус из профильной трубы. По центру полки трубы сверлит отверстие для кнопки. Торцы трубы будут закрываться фанерными стенками. Выбор трубы в качестве корпуса довольно оригинален. При желании можно сделать корпус из любого подходящего материала или приспособить готовую.
Схему мастер не приводит, но монтаж не сложен. Резистор 10 кОм припаивается между контактами 5 В и P0. Припаивается провод между GND и контактом переключателя. Припаивается провод между P0 и вторым контактом переключателя. Ну а дальше есть два варианта, первый - подключить плату напрямую в USB порт компьютера (что не совсем удобно) или припаять к контактным площадкам USB-кабель.
Затем нужно кнопку и микроконтроллер установить в корпус, естественно приняв меры к изоляции, и установить торцевые заглушки.
Дальше нужно просто подключить устройство к компьютеру. Драйвера для работы устройства не нужны.
Шаг третий: двойная кнопка и альтернативная кнопка Помимо управления звуком можно сделать дополнительно кнопку управляющую видео. В этом случае нужна еще одна кнопка, подтягивающий резистор на P2 и другой код.
//Elliotmade 4/27/2020
//https://elliotmade.com/2020/04/23/physical-mute-button-for-zoom-meetings/
//https://www.youtube.com/watch?v=apGbelheIzg
//Used a digispark clone
//this will switch to the zoom application and mute it or exit on long press
//momentary button on pin 0 with pullup resistor
//momentary button on pin 0 with pullup resistor
//https://github.com/mathertel/OneButton
//button library
#include "OneButton.h"
int button1pin = 2;
int button2pin = 0;
#include "DigiKeyboard.h"
//set up buttons
OneButton button1(button1pin, true);
OneButton button2(button2pin, true);
void setup() {
// put your setup code here, to run once:
//set up button functions
button1.attachClick(click1);
button1.attachLongPressStart(longPressStart1);
button2.attachClick(click2);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(500);
}
void loop() {
// put your main code here, to run repeatedly:
//monitor buttons
button1.tick();
button2.tick();
}
// This function will be called when the button1 was pressed 1 time (and no 2. button press followed).
void click1() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);
// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT);
DigiKeyboard.delay(100);
DigiKeyboard.sendKeyStroke(KEY_A, MOD_ALT_LEFT);
} // click1
// This function will be called when the button2 was pressed 1 time (and no 2. button press followed).
void click2() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);
// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT);
DigiKeyboard.delay(100);
DigiKeyboard.sendKeyStroke(KEY_V, MOD_ALT_LEFT);
} // click2
// This function will be called once, when the button1 is pressed for a long time.
void longPressStart1() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);
// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_Q, MOD_ALT_LEFT);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
} // longPressStart1
В качестве альтернативы, если нет желания возиться с изготовлением устройства, можно установить утилиту AutoHotkey на компьютер и прописать кнопку F12 для выполнения подобной функции.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
f12::
Send {Ctrl Down}{Shift Down}{Alt Down}{Ctrl Up}{Shift Up}{Alt Up}
Sleep 100
Send !a
Return