Sí, llamo a Zoom todos los días. Sí, tengo un hijo que a menudo interfiere con estas llamadas. Algoritmo de publicación de anuncios de Instagram, ganaste, necesito este botón.
Pero tengo prejuicios. Instagram anuncia un proyecto con Kickstarter. Además, no quiero contribuir a los ingresos publicitarios de Facebook ni siquiera haciendo clic en este video. La expresión de Jenny Odell "No hay horas libres" describe completamente mi punto de vista sobre la calidad del producto en los anuncios de Instagram. Además, mi límite de financiación para los proyectos de Kickstarter está casi agotado.
He apoyado muchos proyectos en Kickstarter y, a veces, el resultado de estos proyectos me recordó la hamburguesa que consiguió Michael Douglas en la película "¡Tengo suficiente!"
Así que armamos ese botón nosotros mismos.
Lo primero en lo que pensar es ¿qué botón me gustaría presionar?
Me encantan los teclados con interruptores Cherry MX. Hay tres tipos de interruptores mecánicos: lineales, táctiles y de clic. Lineal: el tipo de interruptor más simple que se mueve hacia arriba y hacia abajo casi sin retroalimentación. Los interruptores táctiles tienen una protuberancia en el medio de la carrera que le permite sentir cuando se presiona una tecla. Y los interruptores en los que se puede hacer clic tienen una respuesta táctil más fuerte Y producen un clic audible cuando se presionan.
Normalmente, compraríamos un probador de interruptores para averiguar qué tipo nos responde . , y también les preguntaríamos a nuestros compañeros qué sonido debe hacer el teclado para que no nos maten. Pero estamos en medio de la pandemia de COVID, ¡así que no hay colegas! Opte por un interruptor Cherry MX Blue con una cómoda respuesta táctil que es extremadamente ruidosa. El sitio web de Cherry MX llama a este conmutador "visible y en el que se puede hacer clic", pero todavía se dice muy poco.
Se ve bonito, pero podrías pensar en algo mejor. Si estoy feliz de presionar el interruptor Cherry MX Blue, ¿no sería aún mejor presionar el Cherry MX Blue, cómicamente grande?
Y este es el Big Switch de Novelkeys .
Es 4 veces más grande en cada dimensión y 64 veces más grande en volumen que un interruptor convencional. ¡Incluso tiene una gorra enorme!
Desafortunadamente, el Big Switch no se vende en una carcasa, por lo que tuve que usar la impresión 3D. Se encontró un hermoso estuche en Thingiverse: NovelKeys Big Switch Case . Siempre vale la pena buscar remezclas en caso de que alguien quiera mejorar el diseño original. En este caso, hubo una remezcla que agregó un compartimento para el Pro Micro, y el interruptor se ajusta más, así que lo imprimí.
Ahora que tenemos un estuche, necesitamos una placa que insertamos en él y conectamos al interruptor.
El Pro Micro tiene un chip ATmega32U4 para emular un dispositivo USB HID como un teclado USB. Además, esta placa es pequeña.
Hay dos contactos de metal en la parte inferior del interruptor grande.
Cuando se presiona una tecla dentro del interruptor, se cierra un circuito entre estos dos contactos.
Echemos un vistazo a la disposición de los pines de Pro Micro:
Puede conectar GND a un pin de metal y el Pin 2 al otro. El pin 2 es un pin de E / S digital que se lee ALTO cuando se presiona una tecla y BAJO cuando no.
También sería genial tener algún tipo de indicador visual del estado de Silencio, para que pueda agregar un LED.
Pedí un LED de 10 mm:
Y una resistencia de 220 ohmios:
La pata larga de los LED se conecta a PWR y la pata corta se conecta a GND. Insertaremos una resistencia entre la pata larga y el otro pin para reducir la cantidad de corriente. Seleccioné el Pin 9 en la parte inferior del tablero. Conecté la pata corta a GND. Encontré útil esta página sobre LED y resistencias.
Soldé este cable de 20 AWG entre la placa y el interruptor:
El resultado es la siguiente construcción:
Vamos a meterlo todo en nuestro estuche impreso:
Ahora necesitamos escribir el código.
Comencé con el código que Sparkfun escribió para crear un enorme botón Guardar y lo modifiqué un poco.
El principio es el siguiente: cuando presionas una tecla, envía un atajo de teclado Zoom para encender y apagar el sonido (en Mac es Cmd-Shift-A). Deberá cambiar la configuración de Zoom para que este atajo de teclado sea reconocido incluso cuando el Zoom esté desenfocado. Marque la casilla Habilitar acceso directo global :
También queremos encender o apagar el LED después de cada pulsación de tecla. Decidí que el LED sería análogo a la luz "On Air": cuando el LED azul está encendido, mi sonido está encendido y la gente escucha lo que estoy diciendo.
Pero si simplemente enciende y apaga el LED cada vez que presiona una tecla, ¿cómo mantenerse sincronizado con el estado de silencio en el zoom mismo?
La conveniencia del Pro Micro es que también tiene una conexión en serie. Por lo general, se usa para imprimir información de depuración en el IDE de Arduino, pero podemos usarlo para mantenerlo sincronizado con el estado de audio activado en Zoom.
Aquí está el código que cargamos en el propio Pro Micro:
#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);
}
}
A continuación, podemos agregar un Applescript para informar el estado actual del Zoom. Encontré un complemento de Zoom Streamdeck que contenía el Applescript original y lo modifiqué para informar si Zoom está abierto y cuál es el estado de su sonido. También modifiqué el script para generar 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
Si ahora lo ejecutamos durante una llamada a Zoom, generará algo como esto:
$ osascript get-zoom-status.scpt
{"mute":"muted","status":"call"}
Luego escribí una pequeña aplicación en Node, utilizada como intermediario entre Pro Micro y este script:
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);
Este guión hace dos cosas. Cuando se presiona el botón, envía un comando "presionado" a la placa Pro Micro a través del puerto serie, que ejecuta Applescript para determinar el estado actual del audio en Zoom. Luego envía un comando de "bip apagado" o "bip encendido" a la placa Pro Micro, lo que hace que el LED cambie al estado apropiado. También creé un temporizador que ejecuta un script cada 30 segundos en caso de que accidentalmente silencie o active el sonido a través de la interfaz de Zoom en lugar del botón; de lo contrario, el estado solo se actualizará cuando se presione el botón.
Así es como se ve el botón cuando se usa en una llamada a través de Zoom:
Por favor, apoye mi Kickstarter, es broma, no tengo ningún Kickstarter, pero espero que ahora pueda crear uno usted mismo.
Publicidad
¡Solicite un servidor y comience a trabajar de inmediato! Creación de VDS de cualquier configuración en un minuto. Épico :)