Ya, saya menelepon Zoom setiap hari. Ya, saya punya anak yang sering mengganggu panggilan ini. Algoritme pengiriman iklan Instagram, Anda menang, saya butuh tombol ini.
Tapi saya punya prasangka. Instagram mengiklankan proyek dengan Kickstarter. Plus, saya tidak ingin berkontribusi pada pendapatan iklan Facebook bahkan dengan mengklik video ini. Ungkapan Jenny Odell “Tidak ada jam bebas” sepenuhnya menggambarkan sudut pandang saya tentang kualitas produk di iklan Instagram. Selain itu, batas pendanaan saya untuk proyek Kickstarter hampir habis.
Saya telah mendukung banyak proyek di Kickstarter, dan terkadang hasil dari proyek ini mengingatkan saya pada hamburger yang didapat Michael Douglas dalam film "I'll Enough!"
Jadi mari kita buat sendiri tombol seperti itu.
Hal pertama yang harus saya pikirkan adalah tombol mana yang ingin saya tekan?
Saya suka keyboard dengan sakelar Cherry MX. Ada tiga jenis sakelar mekanis: linier, taktil, dan klik. Linear - Jenis sakelar paling sederhana yang bergerak naik dan turun hampir tanpa umpan balik. Sakelar taktil memiliki tonjolan di tengah kayuhan yang memungkinkan Anda merasakan saat tombol ditekan. Dan sakelar yang dapat diklik memiliki umpan balik taktil yang lebih kuat DAN menghasilkan bunyi klik yang terdengar saat ditekan.
Biasanya, kami akan membeli penguji sakelar untuk mengetahui jenis mana yang merespons kami. , dan kami juga akan bertanya kepada kolega kami tentang suara apa yang harus dibuat keyboard agar mereka tidak membunuh kami. Tapi kami sedang dalam pandemi COVID, jadi tidak ada rekan kerja! Pilih sakelar Cherry MX Blue dengan umpan balik sentuhan nyaman yang sangat keras. Situs web Cherry MX menyebut sakelar ini "dapat diklik dan terlihat", tetapi ini masih sangat sedikit yang dikatakan.
Terlihat cantik, tapi Anda bisa memikirkan sesuatu yang lebih baik. Jika saya senang menekan tombol Cherry MX Blue, bukankah akan lebih baik jika menekan tombol Cherry MX Blue yang besar dan lucu?
Dan ini adalah Saklar Besar Novelkeys .
Ini adalah 4 kali lebih besar di setiap dimensi dan 64 kali lebih besar dalam volume daripada sakelar konvensional. Ia bahkan memiliki topi yang besar!
Sayangnya, Big Switch tidak dijual di perumahan, jadi saya harus menggunakan pencetakan 3D. Sebuah case cantik ditemukan di Thingiverse: NovelKeys Big Switch Case . Mencari remix selalu layak untuk berjaga-jaga jika seseorang ingin memperbaiki desain aslinya. Dalam hal ini, ada remix yang menambahkan kompartemen untuk Pro Micro, dan sakelar lebih pas, jadi saya mencetaknya.
Sekarang kita memiliki kasing, kita membutuhkan papan yang kita masukkan ke dalamnya dan pasang ke sakelar.
The Pro Micro memiliki chip ATmega32U4 untuk meniru perangkat USB HID seperti keyboard USB. Plus, papan ini kecil.
Ada dua kontak logam di bagian bawah Sakelar Besar.
Ketika tombol ditekan di dalam sakelar, sirkuit ditutup di antara dua kontak ini.
Mari kita lihat tata letak pin Pro Micro:
Anda dapat menghubungkan GND ke satu pin logam dan Pin 2 ke yang lain. Pin 2 adalah pin I / O digital yang bertuliskan HIGH saat tombol ditekan dan LOW jika tidak.
Sebaiknya juga memiliki semacam indikator visual status Bisu, sehingga Anda dapat menambahkan LED.
Saya memesan LED 10mm:
Dan resistor 220 ohm:
Kaki panjang LED terhubung ke PWR dan kaki pendek terhubung ke GND. Kami akan memasukkan resistor di antara kaki panjang dan pin lainnya untuk mengurangi jumlah arus. Saya memilih Pin 9 di bagian bawah papan. Saya menghubungkan kaki pendek ke GND. Saya menemukan halaman tentang LED dan resistor ini berguna .
Saya menyolder kabel 20 AWG ini antara papan dan sakelar:
Hasilnya adalah konstruksi berikut:
Mari kita masukkan semuanya ke dalam kotak cetak kita:
Sekarang kita perlu menulis kodenya.
Saya mulai dengan kode yang ditulis Sparkfun untuk membuat Tombol Simpan yang besar dan sedikit memodifikasinya.
Prinsipnya adalah sebagai berikut: saat Anda menekan tombol, pintasan keyboard akan dikirim Zoom untuk menghidupkan dan mematikan suara (di Mac menggunakan Cmd-Shift-A). Anda perlu mengubah pengaturan Zoom agar pintasan keyboard ini dikenali bahkan saat Zoom tidak fokus. Centang kotak Aktifkan Pintasan Global :
Kami juga ingin menyalakan atau mematikan LED setelah setiap tombol ditekan. Saya memutuskan bahwa LED akan serupa dengan lampu "On Air" - saat LED biru menyala, suara saya menyala dan orang-orang mendengar apa yang saya katakan.
Tetapi jika Anda hanya menyalakan dan mematikan LED setiap kali Anda menekan tombol, lalu bagaimana cara tetap sinkron dengan status Bisu di Zoom itu sendiri?
Kenyamanan dari Pro Micro adalah bahwa ia juga memiliki koneksi serial. Biasanya digunakan untuk mencetak informasi debug di Arduino IDE, tetapi kami dapat menggunakannya untuk tetap sinkron dengan audio pada status Zoom.
Berikut kode yang kami muat ke Pro Micro itu sendiri:
#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);
}
}
Selanjutnya, kita dapat menambahkan Applescript untuk melaporkan status Zoom saat ini. Saya menemukan plugin Zoom Streamdeck yang berisi Applescript asli, dan memodifikasinya untuk melaporkan jika Zoom terbuka dan bagaimana status suaranya. Saya juga mengubah skrip menjadi keluaran 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
Jika kita sekarang menjalankannya selama panggilan ke Zoom, maka itu akan menghasilkan sesuatu seperti ini:
$ osascript get-zoom-status.scpt
{"mute":"muted","status":"call"}
Kemudian saya menulis aplikasi kecil di Node, digunakan sebagai perantara antara Pro Micro dan skrip ini:
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);
Skrip ini melakukan dua hal. Saat tombol ditekan, ia mengirimkan perintah "ditekan" ke papan Pro Micro melalui port serial, yang menjalankan Applescript untuk menentukan status audio saat ini di Zoom. Kemudian mengirimkan perintah "bip mati" atau "bip aktif" ke papan Pro Micro, menyebabkan LED beralih ke status yang sesuai. Saya juga membuat pengatur waktu yang menjalankan skrip setiap 30 detik jika saya tidak sengaja menonaktifkan atau mengaktifkan suara melalui antarmuka Zoom daripada tombol, jika tidak, status hanya akan diperbarui saat tombol ditekan.
Seperti inilah tampilan tombol saat digunakan dalam panggilan melalui Zoom:
Mohon dukung Kickstarter saya - bercanda saja, saya tidak punya Kickstarter, tapi semoga sekarang Anda bisa membuatnya sendiri.
Periklanan
Pesan server dan mulai bekerja sekarang juga! Pembuatan VDS konfigurasi apa pun dalam satu menit. Epik :)