DeskHop – Alternância rápida de desktop
(github.com/hrvach)- DeskHop é um projeto de hardware open source que, quando dois computadores compartilham um único teclado/mouse, troca rapidamente o destino de entrada por atalhos de teclado e pelo movimento do ponteiro do mouse, em vez de usar um switch USB com botão
- O dispositivo atua como USB Host/Device entre o teclado/mouse e os dois computadores, mantém as duas conexões simultaneamente e encaminha movimentos do mouse e pressionamentos de teclas para a saída selecionada
- A alternância do mouse muda o descritor de relatório HID para coordenadas absolutas e acumula internamente os movimentos relativos, fazendo o cursor aparecer na tela do outro computador na mesma altura ao cruzar a borda da tela
- Os principais destaques são ausência de latência perceptível, nenhuma instalação de software, suporte a Linux/macOS/Windows, peças por menos de 15€, case impresso em 3D e isolamento galvânico entre as saídas
- As limitações também são claras: há um problema de coordenadas absolutas em múltiplas telas após o Windows 10 KB5003637, múltiplas telas no macOS exigem uma solução de contorno experimental, e a compatibilidade com teclados avançados, mouses com muitos botões e diversos dispositivos não é garantida
Um switch de hardware para alternar rapidamente entre dois computadores
- DeskHop é um projeto que nasceu do caso de uso de pessoas que usam dois computadores diariamente e querem compartilhar um único teclado/mouse
- Ele busca resolver o problema das caixas tradicionais de switching USB, que demoram para alternar e tornam inconveniente ter de procurar o botão
- O comportamento desejado tem duas partes
- Alternância de saída por atalho de teclado
- Alternância automática ao arrastar o ponteiro do mouse entre monitores
- Foi projetado para funcionar também entre computadores com sistemas operacionais diferentes
- Um User Manual é fornecido
Principais recursos
- É totalmente gratuito e open source e recebeu a certificação Open Source Hardware
- Não há atraso perceptível durante a alternância
- É possível arrastar o ponteiro do mouse entre computadores
- Não instala software separado nos computadores
- O custo das peças é apresentado como menos de 15€
- Usa um case snap-fit que pode ser impresso em 3D
- Oferece isolamento galvânico completo entre as saídas
- Funciona em Linux, macOS e Windows
Como funciona
- O dispositivo atua como um dispositivo intermediário entre o teclado/mouse e os computadores
- Ele estabelece e mantém simultaneamente a conexão com os dois computadores
- De acordo com o estado atualmente selecionado, decide para qual computador encaminhar movimentos do mouse e entradas de teclado
- O teclado acompanha o mouse, e o mouse também acompanha o estado de alternância do teclado
- Ao arrastar o mouse para outro desktop, o destino da entrada do teclado também é alternado junto
Implementação da alternância do mouse
- Para criar a sensação de que o cursor do mouse se move entre telas, o descritor de relatório HID é alterado para o modo de coordenadas absolutas
- Os relatórios reais do mouse continuam entrando como movimentos relativos, e o dispositivo os acumula internamente para gerenciar a posição atual
- Quando o cursor tenta sair da área da tela atual na direção do outro monitor, ele mantém a coordenada Y, troca a coordenada X para a borda oposta e alterna a saída
- Com isso, o cursor aparece na mesma altura na tela do outro computador, fazendo a transição parecer natural
- A alternância real ocorre no momento em que uma seta para de se mover e a outra começa a se mover
Alternância do teclado e estado dos LEDs
- O dispositivo atua como USB Host e consulta periodicamente o teclado
- Quando encontra no relatório HID o atalho previamente configurado, passa a encaminhar os caracteres seguintes para a outra saída
- Um exemplo de uso é
Ctrl + Caps Lock
- Um exemplo de uso é
- Os LEDs do teclado podem ser reaproveitados para mostrar qual saída está em uso
- Como o estado dos LEDs é lembrado para cada computador, é possível retomar exatamente o estado anterior
Build e atualização de firmware
- Para reduzir incompatibilidades de versão e problemas de caminho, e evitar o download de SDKs grandes, o pico sdk mínimo e o tinyusb são incluídos junto
- No Debian/Ubuntu, é necessário instalar
build-essential,cmake,gcc-arm-none-eabi,libnewlib-arm-none-eabiepython3 - O build básico é feito com os comandos abaixo
cmake -S . -B buildcmake --build build
- Também é oferecido um build reproduzível usando Docker
docker-compose -f misc/docker.yml run --rm build_container
- Também é possível usar pre-built images
- A partir da versão 0.6, é fornecida uma única imagem universal
- Use copiando o arquivo
.uf2para o dispositivo
Como atualizar o firmware
- Option 1: no firmware 0.6 ou superior, entre no config mode com
left ctrl + right shift + c + o- O dispositivo do lado em que o teclado está conectado reinicia e aparece como uma unidade USB chamada
DESKHOP - Ao copiar o arquivo
.uf2, a imagem é verificada, o flash e o reboot são executados, e o upgrade da outra placa também continua - Essa unidade não é um dispositivo USB de armazenamento comum, portanto não pode ser usada para copiar arquivos
- O dispositivo do lado em que o teclado está conectado reinicia e aparece como uma unidade USB chamada
- Option 2: usando o ROM bootloader, conecte cada Pico mantendo pressionado o botão da placa e copie o
.uf2para o drive flash que aparecer - Option 3: em builds de debug feitos com
DH_DEBUG_CDC_FLASH=ON, é possível entrar em bootloader mode por um comando serial CDCecho -n 'flash' > /dev/tty.usbmodem11104
Recursos adicionais
-
Mouse slowdown
- Alterna o modo de mouse lento com
right CTRL + right ALT - Reduz bastante a velocidade do ponteiro quando é necessário fazer ajustes precisos de posição
- Alterna o modo de mouse lento com
-
Switch Lock
- Fixa na tela atual com
RIGHT CTRL + K - Evita passar acidentalmente para outra tela
- Fixa na tela atual com
-
Lock Both Screens
- Permite bloquear os dois computadores ao mesmo tempo com
RIGHT CTRL + L - É preciso configurar o sistema operacional de cada saída
- Permite bloquear os dois computadores ao mesmo tempo com
-
Gaming Mode
- Alterna com
LEFT CTRL + RIGHT SHIFT + G - Fixa na tela atual e faz o mouse funcionar como um mouse padrão de coordenadas relativas
- É um modo para lidar com jogos, máquinas virtuais e sistemas operacionais ainda não suportados que não combinam com o modo de mouse absoluto
- Alterna com
-
Screensaver
- O padrão é desligado
- Quando ativado, após um período de inatividade o ponteiro do mouse quica pela tela como uma bola de Pong
- É desligado automaticamente ao enviar entrada para essa tela
Configuração de hardware
- O circuito é baseado em duas placas Raspberry Pi Pico
- O Pico foi escolhido por custar 4,10€ cada, ser barato, permitir solda manual e ser fácil de obter
- Os dois Picos são conectados por UART
- Os dois lados são separados por isoladores digitais
- O Analog Devices
ADuM1201custa cerca de 3€ - O TI
ISO7721DRcusta cerca de 1,5€, é mais barato, mais rápido e compatível pino a pino, por isso é preferido
- O Analog Devices
- O RP2040 não oferece suporte nativo a dual USB, mas, por meio do Pico-PIO-USB, implementa USB via PIO e desempenha tanto o papel de USB Host quanto de Device
PCB e case
- Para facilitar a fabricação DIY, as trilhas da PCB ficam em um lado e o número de componentes é minimizado
- Em princípio, as linhas diferenciais USB D+/D- deveriam ter o mesmo comprimento, mas elas foram projetadas de forma intencionalmente um pouco assimétrica para compensar a diferença de comprimento das trilhas GPIO na PCB do Pico
- A meta de impedância diferencial é 90Ω, e na prática foram atingidos cerca de 107Ω
- A espessura da PCB foi projetada como 1,6mm para se ajustar ao case snap-fit
- A PCB v1.1 adiciona os seguintes itens em relação à v1.0
- Proteção ESD
TPD4E1U06DBVR - Capacitores VBUS para conectores de teclado/mouse
- Indicação de orientação em serigrafia
- Furos e melhorias de alinhamento para placas clone com headers já soldados
- Resistores USB de 27Ω
- Proteção ESD
- A v1.1 é um pouco mais difícil de soldar manualmente por causa do pequeno CI TVS e dos resistores 0805
- O case é fornecido em case, usa cerca de 33g de filamento e pode ser impresso em algumas horas
- Ele é fixado com uma estrutura snap-fit sem parafusos, e a tampa tem uma fenda que pode ser aberta com uma chave de fenda
Custo e peças
- O total da BOM da PCB v1.1 é apresentado como 11,22€
- As principais peças são as seguintes
- 2 Raspberry Pi Pico: 8,20€
- 2 conectores USB-A para PCB: 0,40€
- 1 TI ISO7721DR: 1,40€
- 2 capacitores de 100nF: 0,18€
- 4 resistores de 27Ω: 0,12€
- 2 TPD4E1U06DBVR: 0,62€
- 2 capacitores de 4.7uF: 0,14€
- 2 headers 2.54mm 1x03: 0,16€
- Além disso, é necessário fabricar a PCB, e os Gerber são fornecidos
- Também são fornecidos arquivos STL para impressão 3D
Atalhos e configurações de uso
- Considerando o firmware 0.68 ou superior, os principais atalhos são os seguintes
Left Ctrl + Right Shift + C + O: entrar no config modeRight Shift + F12 + D: remover configurações do flashRight Shift + F12 + Y: salvar offset de alternância de telaRight CTRL + Right ALT: alternar modo de mouse lentoRight CTRL + K: bloquear/desbloquear alternância de desktop pelo mouseRight CTRL + L: bloquear as duas saídas simultaneamenteLeft CTRL + Right Shift + G: alternar gaming modeLeft CTRL + Right Shift + S: ativar screensaverLeft CTRL + Right Shift + X: desativar screensaverLeft CTRL + Caps Lock: alternar saída
- O atalho foi alterado porque alguns teclados não enviam corretamente o pressionamento simultâneo dos dois Shift
Modo de configuração via web
- A partir do firmware 0.6, foi introduzido um configuration mode aprimorado
- Ao pressionar
Left Ctrl + Right Shift + C + O, o dispositivo reinicia e entra no modo de configuração - Aparece uma unidade USB chamada
DESKHOP, com um único arquivoconfig.htmdentro - Esse arquivo deve ser aberto no Chromium ou no Chrome
- O Firefox evita a implementação de WebHID, portanto não é suportado atualmente
- Depois de permitir a conexão, defina as opções e salve para gravá-las no dispositivo
- O motivo de usar um arquivo local em vez de uma página de configuração online é que carregar JavaScript que interage com dispositivos de entrada a partir de um local online arbitrário é um risco potencial de segurança
- A página web de configuração usa um método de autodescompactação por causa das limitações de armazenamento, e o código-fonte completo está incluído no repositório
Projeto de segurança
- Não há função de copiar/colar nem compartilhamento de informações entre sistemas
- É uma limitação intencional para evitar vazamento de informações
- Não há conexões recebidas dos computadores de saída
- A exceção são mensagens padrão de ligar/desligar LEDs do teclado, limitadas a 1 byte de dados
- Os computadores de saída não podem acionar um upgrade de firmware
- Apenas uma ação explícita do usuário por meio de um atalho especial de teclado é permitida
- Não expõe endpoints customizados do teclado/mouse conectado nem repassa informações para o lado do dispositivo
- Não armazena histórico de entradas
- O dispositivo não gera pressionamentos de teclas por conta própria
- Apenas o que o usuário digitou ou acionou é enviado à saída
- As saídas são fisicamente separadas e usam isolamento galvânico com tensão de isolamento de pelo menos 2kV
- Os pacotes entre dispositivos têm tamanho fixo, e as opções de configuração transmitidas são limitadas a uma lista curta
- Não há Bluetooth, Wi‑Fi, rede ou acesso à internet
- Computadores conectados nunca são considerados entidades confiáveis em nenhuma circunstância
- O modo de configuração desliga automaticamente após um período de inatividade
- O código é fornecido como open source, sem blobs binários
FAQ e compatibilidade
- Também pode funcionar apenas com dois Picos, sem PCB nem isolador, mas o uso do isolador é recomendado
- Mesmo com resoluções de monitor diferentes, o movimento do mouse é tratado em um espaço abstrato de coordenadas e o computador o mapeia para a tela física, portanto deve funcionar
- Não é um produto à venda, mas um projeto pessoal de hobby não comercial
- Há uma atualização informando que a Elecrow permite encomendar, em unidade única, PCB, PCB montada e dispositivo pronto
- Segundo relatos de usuários, a placa chega vazia e é preciso gravar o firmware manualmente
- Dizem que dongles combinados de teclado/mouse como Logitech Unifying passaram a ter suporte melhor depois de atualizações recentes de firmware
- Teclado e mouse sem fio com receptores sem fio separados funcionaram corretamente em um teste com mouse sem fio da Anker
- Para problemas de build, consulte a Troubleshooting Wiki
Alternativas de software
- Barrier: gratuito, open source
- Input Leap: gratuito, open source
- Synergy: comercial
- Mouse Without Borders: gratuito, exclusivo para Windows
- Universal Control: recurso da Apple
Limitações conhecidas e planos
- Após o Windows 10
KB5003637, o comportamento de coordenadas absolutas HID quebrou, impedindo o uso de mais de uma tela no Windows- O mouse permanece na tela principal; há uma solução de contorno experimental e uma solução melhor está em desenvolvimento
- O código precisa de limpeza e refatoração
- Como não foi testado suficientemente em vários dispositivos, pode não funcionar de imediato dependendo do hardware
- Em teclados avançados com knobs, botões extras e sliders, esse hardware adicional pode não funcionar
- Em mouses modernos com muitos botões, alguns botões podem não funcionar como esperado
- Os dois computadores precisam estar conectados e fornecer energia via USB para funcionar
- Isso ocorre porque cada placa recebe energia do computador ao qual está conectada
- O macOS tem problemas com duas ou mais telas, e o firmware mais recente fornece uma solução de contorno experimental para isso
- Os recursos planejados incluem melhorias nas soluções de contorno para múltiplas telas no Windows/macOS, modo transparente/gaming mode, suporte a mais de 2 saídas e melhorias na UI de configuração
- Também está em desenvolvimento uma versão lite que oferece a funcionalidade básica usando apenas uma única placa Pico W
- Atualmente, o polling do mouse pode operar a 1000Hz
1 comentários
Comentários do Hacker News
É legal que ele consiga detectar a borda da tela sem software cliente
Para fazer o cursor do mouse passar de forma natural, ele altera o descritor de relatório HID do mouse para coordenadas absolutas e, internamente, acumula os relatórios do mouse que na prática chegam como movimento relativo para manter a posição exata
Assim, funciona como o synergykm / Barrier, mas sem recurso de área de transferência e sem software cliente
Por exemplo, há scripts de automação ou jogos que travam o cursor no centro da tela
No YouTube, dá para avançar o vídeo quadro a quadro com as teclas
,e.mesmo sem hardware dedicadoFazer seleção fina com um slider em interface touch é realmente péssimo
Não sei quem veio primeiro, mas conheci isso no mpv e, quando apertei por acaso no YouTube, funcionou
No Windows, dá para usar o Mouse Without Borders, desenvolvido pelo Microsoft Garage e hoje incluído no Windows PowerToys
Links:
https://www.microsoft.com/en-us/garage/profiles/mouse-without-borders
https://github.com/microsoft/PowerToys
Mas agora vi que a manutenção foi interrompida, e o sucessor é o Input Leap
https://github.com/debauchee/barrier
https://github.com/input-leap/input-leap
Principalmente porque ficou fácil arrastar e soltar arquivos para copiar entre os computadores
Comprei até quatro hubs USB para alternar teclado e mouse, mas a maioria dos dispositivos é tão ruim que isso irrita
Várias vezes por dia preciso desconectar e reconectar fisicamente o hub, e fica pior ainda quando ligo webcam ou microfone USB
Uso o Synergy sem problemas, mas preciso de um KVM de verdade que lide direito com webcam, microfone e áudio, e que permita mover só o conjunto de dispositivos conectados com um atalho de teclado
Os usuários de KVM claramente não recebem suporte suficiente
Cada entrada DisplayPort tem portas USB associadas, e o USB-C cuida dos periféricos, da entrada de vídeo e até de uma alimentação razoavelmente boa
A troca é feita por um pequeno botão na mesa, e mesmo nas entradas não exibidas o monitor continua parecendo conectado, então o Windows não fica piscando ao reorganizar tudo de novo, e a troca é muito mais rápida e suave
Parece um caso de uso comum, então é uma pena
Dá para passar antes por um dock, mas uso um monitor de alta resolução, então a maioria dos docks não aguenta ou só suporta 30Hz
O Mac fica ligado com um único cabo Thunderbolt 4, e o PC com HDMI 2.1 e USB3 10Gbps no upstream
Conectei Ethernet e teclado/mouse ao monitor, e ele alterna para o dispositivo certo por atalho ou pelo OSD do monitor
Também dá para ver os dois dispositivos ao mesmo tempo com o recurso PIP
A limitação é ter apenas um controlador host USB 2, então alguns dispositivos de alta velocidade, como certas webcams, são difíceis de alternar
Se for misturar produtos Apple, como a Apple não gosta de MST, é preciso usar dois cabos USB3 físicos no Mac para separar os dois canais de vídeo
Eu conecto um drive USB para transferir arquivos rapidamente, e, se o dispositivo funciona com alimentação USB, em geral funciona
Se escolher USB 3+, DP etc., fica caro, mas também existem modelos baratos que alternam só USB
Porém, há a grande desvantagem de que alguns mouses e teclados com teclas especiais não funcionam 100%
Uso o Synergy para isso há mais de 10 anos
https://symless.com/synergy e é rápido, faz a troca instantaneamente até no Wi‑Fi e oferece suporte a Windows/Mac/Linux
Os dois últimos são gratuitos e de código aberto, e o Synergy tem uma boa forma de configurar os limites entre os dispositivos
Ainda assim, seria ótimo se qualquer solução desse suporte adequado a layouts de monitor personalizados
No meu ambiente, os monitores não ficam em linha reta e cada monitor pode alternar independentemente para cada dispositivo, então seria excelente poder definir limites por monitor e por dispositivo, mas não parece haver nada assim, nem em software nem em hardware
Perguntei recentemente ao pessoal do Synergy e disseram que isso está no roadmap como um pedido popular de recurso; espero que saia em breve
Não é preciso primeiro fazer login no computador, e dá para alternar passando pela borda da tela ou com uma combinação de teclas
Os dispositivos USB conectados também podem ser alternados independentemente do teclado e do mouse
Esse tipo de produto às vezes é chamado de boundless, borderless ou roaming KM switch
https://www.cdw.com/product/siig-4-port-roaming-km-switch-wi...
Para mim, funcionou muito melhor do que o Synergy
Migrei para ele depois que os desenvolvedores do Synergy deixaram de responder a bugs antigos e o produto ficou inviável para mim
Ex.: https://github.com/symless/synergy-core/issues/5992
A desvantagem é que, para continuar recebendo atualizações depois de 1 ano, é preciso fazer uma “renovação de manutenção”, mas mesmo sem renovar ainda continuo usando bem
Fui conferir e a configuração estava funcionando sem problemas há 4~5 anos, e está entre os softwares pagos com melhor custo-benefício
Segurança deve ser padrão e gratuita em tudo; não é luxo, é requisito mínimo
Ainda assim, se eu testar e achar bom, penso em comprar a licença premium por causa do recurso de copiar e colar
Tenho um projeto inspirado em algo parecido, https://github.com/jfedor2/screen-hopper
A versão que fiz é composta por dois programas
Um roda no desktop Linux, escuta eventos de entrada do evdev, o subsistema de entrada do Linux, e quando uma tecla específica é pressionada ele consome todos os eventos e os envia por USB serial para um RPI Pico
Ao pressionar de novo, ele volta ao modo de escuta passiva
O RPI Pico converte os eventos Linux evdev recebidos pela serial em eventos USB HID e os envia para outro PC com Windows
Na prática, isso vira um switch KM que alterna instantaneamente entre um PC Linux e um PC rodando qualquer outro sistema operacional
Foto da fiação: https://ibb.co/m0zhzgz
Usei outro Pico como adaptador USB serial, e como iniciante em hardware foi um grande alívio precisar de apenas dois fios
Os dois programas tinham menos de 100 linhas cada, e há muitos crates Rust e pacotes Python para escutar o Linux evdev
O lado do Pico também é praticamente um loop com um grande
switch, e existe crate Rust para enviar eventos USB HIDSe você usar COBS, dá para enviar pela serial sem se preocupar com framing
Acabei não liberando como open source por causa de um bug no USB serial: depois que a conexão caía, ele não reconectava corretamente ao desktop Linux
Não sei se o problema é do Linux ou do Pico, e como não desconecto o cabo sigo usando sem problemas até hoje
Como jogo muito FPS, removi de propósito a funcionalidade de coordenadas absolutas, e vinculei a tecla de alternância a um botão lateral do mouse, assim posso trocar de sistema sem tirar as mãos do teclado
Só fiquei sabendo do projeto screen-hopper ontem, e foi aquela sensação de confirmar a teoria de que, não importa o que você tente construir, alguém mais inteligente já fez algo melhor antes
Não jogo nada, então coordenadas absolutas para mim seriam ok, mas há um item na lista de afazeres para tornar isso configurável
Talvez dê para nerd-sniping alguém para investigar a sutileza que causa o bug
O código-fonte, exatamente como está, está aqui: https://github.com/null-dev/picokvm
Uma das minhas grandes irritações era alternar a entrada de mouse e teclado entre dois PCs com um switch USB 3.0
Quando eu não tinha muito o que dizer numa reunião do Teams, se alguém chamava meu nome ou mandava uma mensagem, eu acabava me atrapalhando procurando o botão para devolver a entrada ao PC com o Teams aberto
Pensei em ligar um ESP32 ou Rpi Pico W e alguns optoacopladores aos pinos do botão do switch USB, expor um endpoint HTTP e usar um script AutoHotkey com atalho para alternar a entrada entre os dois dispositivos
Mas desisti porque não consegui pensar em uma forma de determinar qual entrada está ativa no momento, e gostei desta solução
O headset Logitech que recebi da empresa tem botões de volume, encerrar chamada e mudo no cabo, então fica muito mais fácil tirar do mudo mesmo fazendo multitarefa
O Synergy lida bem com esse caso de uso com software puro
Não é gratuito nem open source, mas é relativamente barato
https://symless.com/synergy
Ambos são open source
[0] https://github.com/debauchee/barrier
[1] https://github.com/input-leap/input-leap
Também existe um fork open source separado na versão 1.9: https://github.com/debauchee/barrier#what-is-it
Por exemplo, ao usar um host macOS, ele usa a curva de aceleração do macOS para calcular a posição do cursor nos clientes Windows/Linux, mas não a usa no movimento real do cursor
Então, ao tentar trabalhar em um terço da tela do Windows que fica mais perto do host, você acaba voltando sem querer
Parece que todas as soluções só funcionam em sistemas operacionais de desktop
Nenhuma dessas tecnologias é estável, e o Synergy já chegou a travar até teclados conectados várias vezes, deixando o computador num estado em que só voltava a responder depois de desligar e ligar de novo
Isso é realmente incrível
Eu sinto isso especialmente como alguém que usa há pelo menos 20 anos uma configuração de desktop com máquinas Linux-Mac-Windows da esquerda para a direita
Se linguagens de programação podem ser poliglotas, então o hardware tem uma configuração multiplataforma
Felizmente, isso ficou mais fácil nos últimos anos com o aumento dos projetos de system-on-chip (SoC)
Minha configuração atual é composta por duas réplicas de Mac mini com SoC Ryzen de 250 dólares vindas de Shenzhen e um M1 MBP
É uma pena que o mundo das soluções KVM open source, como o Synergy, que antes eram robustas, tenha virado um pesadelo recursivo de forks, tornando difícil encontrar um software KVM multiplataforma open source que funcione de graça
No fim, agora estou usando um switch KVM tradicional, mas precisar apertar botão é algo que distrai
Quero tentar algo assim de novo algum dia
Se houver alguém disposto a trabalhar junto para comercializar isso, eu topo bancar e cuidar de injeção plástica, marketing, montagem em escala e o que mais for necessário
Meu e-mail está no perfil
Para mim, isso é impeditivo
Basta procurar por boundless, borderless, roaming KM switch