- DeskHop es un proyecto de hardware open source que, cuando dos computadoras comparten un solo teclado/mouse, permite cambiar rápidamente el destino de entrada mediante atajos de teclado y movimiento del puntero, en lugar de usar un switch USB con botón
- El dispositivo actúa como USB Host/Device entre el teclado/mouse y las dos computadoras; mantiene ambas conexiones al mismo tiempo y envía el movimiento del mouse y las pulsaciones de teclas a la salida seleccionada
- Para el cambio con el mouse, modifica el descriptor de reportes HID a coordenadas absolutas y acumula internamente los movimientos relativos, de modo que al cruzar el borde de la pantalla el cursor aparece a la misma altura en la pantalla de la otra computadora
- Sus principales características son: sin latencia perceptible, sin instalación de software, soporte para Linux/macOS/Windows, componentes por menos de 15€, carcasa impresa en 3D y aislamiento galvánico entre salidas
- Sus límites también son claros: desde Windows 10 KB5003637 hay un problema con coordenadas absolutas en configuraciones multipantalla; en macOS multipantalla se necesita una solución alternativa experimental; y no se garantiza compatibilidad con teclados avanzados, mouse con muchos botones ni todo tipo de dispositivos
Un switch de hardware para moverse rápidamente entre dos computadoras
- DeskHop nació de un caso de uso: usar a diario dos computadoras compartiendo un solo teclado/mouse
- Busca resolver el problema de las cajas USB de conmutación tradicionales, que tardan en cambiar y resultan incómodas porque hay que encontrar el botón
- El comportamiento deseado es doble
- Cambiar la salida con un atajo de teclado
- Cambiar automáticamente al arrastrar el puntero del mouse entre monitores
- Está diseñado para funcionar incluso entre computadoras con distintos sistemas operativos
- Se ofrece un User Manual
Funciones principales
- Es completamente gratis y open source, y cuenta con certificación Open Source Hardware
- No hay latencia perceptible al cambiar
- Permite arrastrar el puntero del mouse entre computadoras
- No requiere instalar software adicional en las computadoras
- El costo de componentes se presenta como menos de 15€
- Usa una carcasa snap-fit imprimible en 3D
- Ofrece aislamiento galvánico completo entre salidas
- Funciona en Linux, macOS y Windows
Cómo funciona
- El dispositivo opera como un dispositivo intermediario entre el teclado/mouse y las computadoras
- Establece y mantiene simultáneamente las conexiones con ambas computadoras
- Según el estado seleccionado, decide a qué computadora enviar el movimiento del mouse y las pulsaciones de teclas
- El teclado sigue al mouse, y el mouse también sigue el estado de cambio del teclado
- Si arrastras el mouse a otro escritorio, también cambia el destino de entrada del teclado
Implementación del cambio con el mouse
- Para crear la sensación de que el cursor se mueve entre pantallas, el descriptor de reportes HID se cambia al modo de coordenadas absolutas
- Los reportes reales del mouse siguen llegando como movimientos relativos, y el dispositivo los acumula internamente para gestionar la posición actual
- Cuando se intenta salir del área de la pantalla actual hacia otro monitor, mantiene la coordenada Y, cambia la coordenada X al borde opuesto y luego cambia la salida
- Con este método, el cursor aparece a la misma altura en la pantalla de la otra computadora y el cambio se ve natural
- El cambio real ocurre en el momento en que una flecha deja de moverse y la otra empieza a hacerlo
Cambio de teclado y estado de LED
- El dispositivo actúa como USB Host y consulta periódicamente el teclado
- Si encuentra en el reporte HID el atajo previamente configurado, envía los caracteres posteriores a la otra salida
- Un ejemplo de uso es
Ctrl + Caps Lock
- Un ejemplo de uso es
- Los LED del teclado pueden reutilizarse para indicar qué salida se está usando
- Como recuerda el estado de LED de cada computadora, puede continuar exactamente desde el estado anterior
Build y actualización de firmware
- Para reducir problemas de incompatibilidad de versiones y rutas, y evitar descargas grandes de SDK, se incluyen versiones mínimas de pico sdk y tinyusb
- En Debian/Ubuntu se requiere instalar
build-essential,cmake,gcc-arm-none-eabi,libnewlib-arm-none-eabiypython3 - El build básico se realiza con los siguientes comandos
cmake -S . -B buildcmake --build build
- También se ofrece un build reproducible con Docker
docker-compose -f misc/docker.yml run --rm build_container
- También pueden usarse pre-built images
- Desde la versión 0.6 se ofrece una única imagen universal
- Se usa copiando el archivo
.uf2al dispositivo
Cómo actualizar el firmware
- Option 1: en firmware 0.6 o superior, se entra a config mode con
left ctrl + right shift + c + o- El dispositivo del lado donde está conectado el teclado se reinicia y aparece como una unidad USB llamada
DESKHOP - Al copiar el archivo
.uf2, se verifica la imagen, se flashea y se reinicia; luego continúa la actualización de la otra placa - Esta unidad no es un almacenamiento USB normal, por lo que no puede usarse para copiar archivos
- El dispositivo del lado donde está conectado el teclado se reinicia y aparece como una unidad USB llamada
- Option 2: usar el ROM bootloader; conectar cada Pico manteniendo presionado el botón de la placa y copiar el
.uf2a la unidad flash que aparece - Option 3: en un build de debug compilado con
DH_DEBUG_CDC_FLASH=ON, se puede entrar a bootloader mode mediante un comando serial CDCecho -n 'flash' > /dev/tty.usbmodem11104
Funciones adicionales
-
Mouse slowdown
- Alterna el modo de mouse lento con
right CTRL + right ALT - Reduce mucho la velocidad del puntero cuando se necesita ajustar la posición con precisión
- Alterna el modo de mouse lento con
-
Switch Lock
- Fija el mouse en la pantalla actual con
RIGHT CTRL + K - Evita pasar accidentalmente a otra pantalla
- Fija el mouse en la pantalla actual con
-
Lock Both Screens
- Permite bloquear ambas computadoras al mismo tiempo con
RIGHT CTRL + L - Es necesario configurar el sistema operativo de cada salida
- Permite bloquear ambas computadoras al mismo tiempo con
-
Gaming Mode
- Se alterna con
LEFT CTRL + RIGHT SHIFT + G - Queda fijado en la pantalla actual y el mouse se comporta como un mouse estándar de coordenadas relativas
- Es un modo pensado para manejar problemas con juegos, máquinas virtuales y sistemas operativos aún no soportados que no funcionan bien con el modo de mouse absoluto
- Se alterna con
-
Screensaver
- Está desactivado por defecto
- Al activarlo, después de un tiempo de inactividad el puntero del mouse rebota por la pantalla como una pelota de Pong
- Se desactiva automáticamente al enviar entrada a esa pantalla
Configuración de hardware
- El circuito se basa en dos placas Raspberry Pi Pico
- Las Pico fueron elegidas porque cuestan 4.10€ cada una, son baratas, se pueden soldar a mano y son fáciles de conseguir
- Las dos Pico se conectan por UART
- Ambos lados se separan con un aislador digital
- El
ADuM1201de Analog Devices cuesta alrededor de 3€ - El
ISO7721DRde TI cuesta alrededor de 1.5€ y se prefiere porque es más barato, más rápido y compatible pin a pin
- El
- El RP2040 no soporta dual USB de forma nativa, pero mediante Pico-PIO-USB implementa USB con PIO para cumplir los roles de USB Host y Device
PCB y carcasa
- Para facilitar la fabricación DIY, las pistas del PCB se colocan en una sola cara y se minimiza la cantidad de componentes
- En principio, las líneas diferenciales USB D+/D- deberían tener la misma longitud, pero se diseñaron deliberadamente con una ligera asimetría para compensar la diferencia de longitud de las pistas GPIO en el PCB de la Pico
- El objetivo de impedancia diferencial es 90Ω, y en la práctica se alcanzan aproximadamente 107Ω
- El grosor del PCB está diseñado en 1.6mm para ajustarse a la carcasa snap-fit
- El PCB v1.1 agrega lo siguiente respecto de v1.0
- Protección ESD
TPD4E1U06DBVR - Capacitores VBUS para los conectores de teclado/mouse
- Indicadores de orientación en la serigrafía
- Agujeros y mejoras de alineación para placas clon con headers ya soldados
- Resistencias USB de 27Ω
- Protección ESD
- La v1.1 es un poco más difícil de soldar a mano por el pequeño IC TVS y las resistencias 0805
- La carcasa está disponible en case, usa unos 33g de filamento y puede imprimirse en unas horas
- Se fija con una estructura snap-fit sin tornillos, y la tapa tiene una ranura para abrirla con un destornillador
Costos y componentes
- El total del BOM del PCB v1.1 se presenta como 11.22€
- Los componentes principales son los siguientes
- 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 resistencias de 27Ω: 0.12€
- 2 TPD4E1U06DBVR: 0.62€
- 2 capacitores de 4.7uF: 0.14€
- 2 headers 2.54mm 1x03: 0.16€
- Además se requiere fabricar el PCB, y se ofrecen archivos Gerber
- También se ofrecen archivos STL para impresión 3D
Atajos de uso y configuración
- En firmware 0.68 o superior, los principales atajos son los siguientes
Left Ctrl + Right Shift + C + O: entrar a config modeRight Shift + F12 + D: eliminar configuración de flashRight Shift + F12 + Y: guardar offset de cambio de pantallaRight CTRL + Right ALT: alternar modo de mouse lentoRight CTRL + K: bloquear/desbloquear el cambio de escritorio con el mouseRight CTRL + L: bloquear simultáneamente ambas salidasLeft CTRL + Right Shift + G: alternar gaming modeLeft CTRL + Right Shift + S: activar screensaverLeft CTRL + Right Shift + X: desactivar screensaverLeft CTRL + Caps Lock: cambiar salida
- Algunos teclados no envían correctamente la pulsación simultánea de ambas teclas Shift, por lo que se cambiaron los atajos
Modo de configuración web
- Desde firmware 0.6 se introdujo un configuration mode mejorado
- Al presionar
Left Ctrl + Right Shift + C + O, el dispositivo se reinicia y entra en modo de configuración - Aparece una unidad USB llamada
DESKHOPque contiene un único archivoconfig.htm - Este archivo debe abrirse en Chromium o Chrome
- Firefox evita implementar WebHID, por lo que actualmente no está soportado
- Después de permitir la conexión, se configuran las opciones y, al guardar, se escriben en el dispositivo
- La razón para usar un archivo local en vez de una página de configuración online es que cargar JavaScript que interactúa con dispositivos de entrada desde una ubicación online arbitraria representa un riesgo potencial de seguridad
- La página web de configuración usa un método de autodescompresión por límites de almacenamiento, y el código fuente completo está incluido en el repositorio
Diseño de seguridad
- No hay función de copiar/pegar ni de compartir información entre sistemas
- Es una limitación intencional para evitar filtraciones de información
- No hay conexiones entrantes desde las computadoras de salida
- La excepción son los mensajes estándar de encendido/apagado de LED del teclado, limitados a 1 byte de datos
- Las computadoras de salida no pueden disparar una actualización de firmware
- Solo se permite una acción explícita del usuario mediante un atajo especial de teclado
- No expone endpoints personalizados del teclado/mouse conectado ni transmite información hacia el dispositivo
- No guarda historial de entrada
- El dispositivo no genera pulsaciones de teclas arbitrarias
- Solo se emite lo que el usuario escribe o dispara
- Las salidas están físicamente separadas y usan aislamiento galvánico con al menos 2kV de tensión de aislamiento
- Los paquetes entre dispositivos tienen longitud fija, y las opciones de configuración transmitidas se limitan a una lista corta
- No hay Bluetooth, Wi-Fi, red ni acceso a Internet
- Las computadoras conectadas no se consideran confiables bajo ninguna circunstancia
- El modo de configuración se desactiva automáticamente tras un período de inactividad
- El código se ofrece como open source y sin blobs binarios
FAQ y compatibilidad
- Puede funcionar solo con dos Pico, sin PCB ni aislador, pero se recomienda usar aislador
- Incluso con monitores de distintas resoluciones, el movimiento del mouse se procesa en un espacio de coordenadas abstracto y la computadora lo mapea a la pantalla física, por lo que debería funcionar
- No es un producto a la venta, sino un proyecto personal de hobby no comercial
- Hay una actualización que indica que en Elecrow se pueden pedir de a una unidad el PCB, el PCB ensamblado o el dispositivo completo
- Según reportes de usuarios, la placa llega vacía y hay que flashear el firmware manualmente
- Se dice que los dongles combinados de teclado/mouse, como Logitech Unifying, tienen mejor soporte después de actualizaciones recientes de firmware
- Los mouse y teclados inalámbricos con receptores inalámbricos separados funcionaron correctamente en una prueba con un mouse inalámbrico Anker
- Para problemas de build, se puede consultar la Troubleshooting Wiki
Alternativas de software
- Barrier: gratis, open source
- Input Leap: gratis, open source
- Synergy: comercial
- Mouse Without Borders: gratis, solo Windows
- Universal Control: función de Apple
Límites conocidos y planes
- Desde Windows 10
KB5003637, el comportamiento de coordenadas absolutas HID se rompió y no se puede usar más de una pantalla en Windows- El mouse permanece en la pantalla principal; hay una solución alternativa experimental y se está desarrollando una mejor
- El código necesita limpieza y refactorización
- No se probó lo suficiente con una gran variedad de dispositivos, por lo que puede no funcionar de inmediato según el hardware
- En teclados avanzados con perillas, botones adicionales o sliders, ese hardware adicional podría no funcionar
- En mouse modernos con muchos botones, algunos botones podrían no funcionar como se espera
- Para funcionar, ambas computadoras deben estar conectadas y suministrar alimentación USB
- Esto se debe a que cada placa recibe energía de la computadora a la que está conectada
- macOS tiene problemas con 2 o más pantallas, y el firmware más reciente ofrece una solución alternativa experimental para ello
- Las funciones planeadas incluyen mejores soluciones alternativas para multipantalla en Windows/macOS, modo transparente/gaming mode, soporte para más de 2 salidas y mejoras en la UI de configuración
- También se está trabajando en una versión lite que ofrece funciones básicas con una sola placa Pico W
- El polling del mouse actualmente puede funcionar a 1000Hz
1 comentarios
Opiniones de Hacker News
Me gusta que pueda detectar los bordes de la pantalla sin software cliente.
Para que el cursor del mouse pase de forma natural, cambia el descriptor de reporte HID del mouse a coordenadas absolutas y, en la práctica, acumula internamente los reportes del mouse que llegan como movimientos relativos para mantener la posición exacta.
Así funciona como synergykm / Barrier, sin función de portapapeles ni software cliente.
Por ejemplo, scripts de automatización o juegos que fijan el cursor en el centro de la pantalla.
En YouTube, incluso sin hardware adicional, se puede avanzar el video cuadro por cuadro con las teclas
,y..Hacer selecciones finas con un slider en una interfaz táctil es realmente pésimo.
No sé quién fue primero, pero los conocí en mpv y, al probarlos por casualidad en YouTube, funcionaron.
En Windows se puede usar Mouse Without Borders, desarrollado por Microsoft Garage y ahora incluido en Windows PowerToys.
Enlaces:
https://www.microsoft.com/en-us/garage/profiles/mouse-without-borders
https://github.com/microsoft/PowerToys
Pero ahora veo que el mantenimiento se detuvo, y su sucesor es Input Leap.
https://github.com/debauchee/barrier
https://github.com/input-leap/input-leap
En especial, facilitaba arrastrar y soltar archivos entre computadoras para copiarlos.
Compré hasta 4 hubs USB para alternar el teclado y el mouse, pero la mayoría de los dispositivos son tan malos que desesperan.
Hay veces que tengo que desconectar y volver a conectar físicamente el hub varias veces al día, y se pone peor si también conecto una webcam o un micrófono USB.
Uso Synergy sin problemas, pero necesito un KVM de verdad que pueda manejar correctamente webcam, micrófono y audio, y que permita mover solo el conjunto de dispositivos conectados con un atajo de teclado.
Los usuarios de KVM claramente no reciben suficiente soporte.
Cada entrada DisplayPort tiene puertos USB asociados, y el USB-C se encarga de los periféricos, la entrada de video y hasta una salida de energía bastante decente.
Se cambia con un pequeño switch sobre el escritorio, y el monitor hace que incluso la entrada que no se está mostrando parezca seguir conectada, así que Windows no parpadea mientras reorganiza todo; el cambio es mucho más rápido y fluido.
Parece un caso de uso común, así que es una lástima.
También podría sacarlo primero mediante un dock, pero la resolución del monitor que uso es alta, así que la mayoría de los docks no dan abasto o solo soportan 30 Hz.
La Mac se conecta con un solo cable Thunderbolt 4, y la PC con HDMI 2.1 y USB3 de 10 Gbps como upstream.
Al monitor conecté Ethernet y teclado/mouse, y cambia al equipo correcto con un atajo o desde el OSD del monitor.
Con la función PIP también se pueden ver ambos equipos al mismo tiempo.
La limitación es que solo tiene controlador host USB 2, así que es difícil conmutar algunos dispositivos de alta velocidad, como ciertas webcams.
Si hay que mezclar productos Apple, como a Apple no le gusta MST, en la Mac hay que usar dos cables USB3 físicos para distinguir los dos canales de pantalla.
Le conecto una unidad USB para mover archivos rápido, y en general funciona con dispositivos alimentados por USB.
Si eliges USB 3+, DP, etc., sale caro, pero también hay modelos baratos que solo conmutan USB.
Eso sí, tiene la gran desventaja de que algunos mouse y teclados con teclas especiales no funcionan al 100%.
Llevo más de 10 años usando Synergy para esto
Es https://symless.com/synergy, es rápido, cambia al instante incluso por Wi‑Fi y soporta Windows/Mac/Linux
Las dos últimas son gratuitas y de código abierto, y Synergy tiene una buena forma de configurar los límites entre dispositivos
Pero me gustaría que cualquiera de estas soluciones soportara bien las distribuciones de monitores personalizadas
En mi entorno, los monitores no están en una sola línea y cada monitor puede cambiarse de forma independiente a cada dispositivo, así que sería genial poder definir límites por monitor y por dispositivo, pero no parece existir ni en software ni en hardware
Hace poco les pregunté a los de Synergy y dijeron que está en el roadmap como una solicitud popular; ojalá salga pronto
No hace falta iniciar sesión primero en la computadora, y puedes cambiar al cruzar el borde de la pantalla o con una combinación de teclas
Los dispositivos USB conectados también se pueden cambiar independientemente del teclado y el mouse
A estos productos también se les llama boundless, borderless o roaming KM switch
https://www.cdw.com/product/siig-4-port-roaming-km-switch-wi...
Personalmente me funcionó mucho mejor que Synergy
Me cambié después de que los desarrolladores de Synergy no respondieran a bugs de hace años y ya no pudiera seguir usándolo
Ejemplo: https://github.com/symless/synergy-core/issues/5992
La desventaja es que, si quieres seguir recibiendo actualizaciones después de un año, tienes que hacer una “renovación de mantenimiento”, pero todavía lo uso bien sin haber renovado
Al revisar, vi que la configuración había estado funcionando sin problemas durante 4 o 5 años, y está entre el software de pago que más valor me ha dado
La seguridad debería ser básica y gratuita en todo; no es un lujo, es un requisito mínimo
Aun así, si lo pruebo y me gusta, estoy considerando comprar la licencia premium por la función de copiar y pegar
Hay un proyecto que hice inspirado en un proyecto similar, https://github.com/jfedor2/screen-hopper
Mi versión consta de dos programas
Uno se ejecuta en el escritorio Linux y escucha eventos de entrada de evdev, el subsistema de entrada de Linux; cuando se presiona una tecla específica, consume todos los eventos y los envía por USB serie a un RPI Pico
Al presionarla de nuevo, vuelve al modo de escucha manual
El RPI Pico convierte los eventos evdev de Linux recibidos por serie en eventos USB HID y los envía a otra PC con Windows
En la práctica, termina siendo un switch KM que cambia al instante entre una PC Linux y una PC con cualquier sistema operativo
Foto del cableado: https://ibb.co/m0zhzgz
Usé otro Pico como adaptador USB serie y, como principiante en hardware, fue un gran alivio que solo hicieran falta 2 cables
Ambos programas tenían menos de 100 líneas, y hay muchos crates de Rust y paquetes de Python para escuchar evdev en Linux
El lado del Pico también es casi un loop con un gran switch, y hay un crate de Rust para enviar eventos USB HID
Si usas COBS, puedes enviar por serie sin preocuparte por el framing
Al final no lo publiqué como open source por un bug de USB serie: después de desconectarse, no se reconectaba correctamente al escritorio Linux
No sé si era por Linux o por el Pico, y como no desconecto el cable, todavía lo uso sin problemas
Como juego mucho FPS, omití a propósito la función de coordenadas absolutas, y asigné la tecla de cambio a un botón lateral del mouse para poder cambiar de sistema sin tocar el teclado
Recién ayer me enteré del proyecto screen-hopper, y sentí que confirmaba la teoría de que, intentes construir lo que intentes, alguien más inteligente ya lo hizo mejor
Como no juego nada, las coordenadas absolutas me vienen bien, pero en mi lista de pendientes está hacer que eso sea configurable
Podrías hacer nerd sniping para que alguien investigue la sutileza que causa el bug
El código fuente, tal como está, está aquí: https://github.com/null-dev/picokvm
Una de mis grandes molestias era cambiar la entrada del mouse y el teclado entre dos PC con un switch USB 3.0
Cuando estoy en una reunión de Teams y no tengo mucho que decir, si alguien dice mi nombre o me manda un mensaje, termino manoteando para encontrar el botón y devolver la entrada a la PC donde está Teams
Había pensado conectar un ESP32 o un Rpi Pico W y algunos optoacopladores a los pines del botón del switch USB, y exponer un endpoint HTTP para alternar la entrada entre los dos equipos con un script de AutoHotkey y un atajo de teclado
Pero abandoné la idea porque no se me ocurrió cómo determinar cuál entrada está activa actualmente; esta solución me gusta
El headset Logitech que me dieron en el trabajo tiene botones de volumen, colgar y silencio en el cable, así que es mucho más fácil quitar el silencio mientras hago multitarea
Synergy maneja bien este caso de uso con software puro
No es gratis ni de código abierto, pero es relativamente económico
https://symless.com/synergy
Ambos son de código abierto
[0] https://github.com/debauchee/barrier
[1] https://github.com/input-leap/input-leap
También hay un fork de código abierto que se separó en la versión 1.9: https://github.com/debauchee/barrier#what-is-it
Por ejemplo, al usar un host macOS, en clientes Windows/Linux usa la curva de aceleración de macOS para calcular la posición del cursor, pero no para el movimiento real del cursor
Por eso, al intentar trabajar en el tercio de la pantalla de Windows más cercano al host, terminas volviendo sin querer
Todas las soluciones parecen funcionar solo en sistemas operativos de escritorio
Ninguna de estas tecnologías es estable, y Synergy incluso me ha dejado varias veces el teclado conectado completamente congelado, al punto de tener que apagar y encender la computadora para que volviera a responder
Realmente impresionante
Lo siento especialmente como alguien que durante al menos 20 años ha usado una configuración de escritorio con máquinas Linux-Mac-Windows de izquierda a derecha
Si en los lenguajes de programación existe ser políglota, en hardware existe la configuración multiplataforma
Por suerte, en los últimos años se ha vuelto más fácil con el aumento de diseños system-on-chip (SoC)
Mi configuración actual son dos clones de Mac mini con Ryzen SoC de 250 dólares venidos de Shenzhen y una MBP M1
Es una lástima que el mundo de soluciones KVM open source como Synergy, que antes era sólido, se haya convertido en una pesadilla recursiva de forks, haciendo difícil conseguir un KVM de software open source multiplataforma que funcione gratis
Ahora terminé usando un switch KVM tradicional, pero tener que presionar un botón me distrae
Algún día me gustaría volver a intentar algo como esto
Si hay alguien que quiera colaborar para comercializar esto, estoy dispuesto a cubrir los costos y encargarme del moldeo por inyección de plástico, marketing, ensamblaje masivo y cualquier otra cosa necesaria
Mi correo está en el perfil
Para mí es un dealbreaker
Hay que buscar boundless, borderless, roaming KM switch