¿Cómo puedo construir un dispositivo de señalización USB simple?

Me gustaría construir un dispositivo simple que se conecte a un puerto USB y envíe una señal a la computadora (es decir, solo un 1) cuando un usuario presiona el botón o el interruptor, etc.

Me imagino que debe haber alguna forma de tomar un cable USB y modificar el lado que no se conecta a la computadora para que envíe una señal cuando se activa, tal vez tocando una batería o algo así.

Mi objetivo es crear un botón simple que pueda usar para realizar una serie regular de acciones con solo presionarlo. Sé que venden cosas como esta, pero sería más genial y quizás más barato si hubiera una forma de bricolaje.

¿Cuál es la latencia deseada de su botón? En otras palabras, ¿qué tan pronto su software host permite detectar el botón para su proyecto? ¿Y cuál es el tiempo mínimo para presionar el botón y volver a presionarlo que necesita para su propósito ("serie de acciones")?
Hay un montón de respuestas, algunas basadas en suposiciones diferentes. Uno de los criterios de discriminación es "¿Qué va a 'leer' la señal del botón USB?", Entonces, ¿qué es? Además, ¿qué sistema operativo estás usando?
@gbulmer Estoy técnicamente abierto a un montón de plataformas, así que me alegra que la gente esté haciendo suposiciones diferentes, ya que quiero elegir la mejor combinación de frescura y facilidad en general. Tengo Windows y Linux, y tengo un Arduino
Gracias. ¿Desea algo que pueda leer fácilmente en un script, por ejemplo, un '1' de algo que parece un teclado, o está de acuerdo con escribir un programa para abrir un dispositivo en serie y verificar su estado con un ioctl, o ¿Está de acuerdo con profundizar en las API de registro para detectar fallas de USB? ¿O está feliz de escribir un controlador de dispositivo kernel? ¿Puedes estimar con qué rapidez o frecuencia podrías estar presionando el interruptor?
@gbulmer No quiero escribir un controlador que sea seguro. Quiero escribir un script que pueda leer la entrada, no necesariamente como un teclado sino como un nuevo dispositivo. Estaba pensando en escuchar en el puerto USB específico al que está conectado

Respuestas (6)

Aparte de las soluciones prácticas anteriores, hay más formas diy hacky. Desmonte un teclado USB y retire la matriz de teclas. Reemplace una combinación de matriz específica con un solo botón (por ejemplo, uno sin usar como f8). Luego use un programa de teclas de acceso rápido de software para llevar a cabo el resto en función de ese teclado específico y la pulsación de tecla.

La otra forma sería desmontar un ratón y hacer lo mismo. Pero un teclado es más simple y con cualquier uno barato reciente, la placa de circuito impreso tendría aproximadamente el tamaño de una unidad flash.

Pero una solución de microcontrolador se puede hacer completamente sin necesidad de ningún software del lado de la computadora. Pura bondad del teclado USB HID.

Creo que este es el mejor consejo para un pulsador "más barato", quizás no el "más genial". Tome un mouse de plástico, envuélvalo en algo con, digamos, cinta adhesiva :-), y deje solo un botón (¿lado derecho?) expuesto. Hecho. Es probable que algunos "ratones para juegos" con controlador dedicado proporcionen una latencia de respuesta de 8 ms en promedio, según algunos estudios de "latencia de movimiento a fotón".
@alichen se puede obtener una placa de microcontrolador usb por menos de un mouse, envío incluido.
Sí @Passerby, pero luego te queda enumerar los dispositivos USB y manejarlos en el sistema operativo host. Más barato, sí, pero mucho más complicado de hacer de una manera no pirateada.
@rdtsc usb hid funciona sin problemas y sin controladores en el host, y existen tantos ejemplos y proyectos para el microcontrolador usb que es casi trivial en este punto. Como hola mundo trivial.

ATTiny + V-USB actuando como teclado HID. ATMega32U4 (por ejemplo, Arduino Leonardo) actuando como teclado HID. PIC18F14K50 actuando como, sí, un dispositivo USB HID. Hay una gran cantidad de otros microcontroladores habilitados para USB, esos son solo tres que puedo pensar en la parte superior de mi cabeza.

Necesitará algún microcontrolador de alguna descripción capaz de interactuar con USB. No puede simplemente cortar el extremo del cable y esperar simplemente conectar los cables y hacer que imprima números sin algún tipo de procesador.

USB es un protocolo bastante complejo, por lo que la mejor opción es encontrar algo que haga lo que usted quiere (como un teclado) o un microcontrolador con una pila USB HID preescrita para la que luego puede personalizar el código para enviar información de pulsación de tecla. cuando se presiona un botón.

Ciertamente, hay códigos de muestra disponibles para la placa Leonardo que se pueden usar para enviar pulsaciones de teclas a la PC.

Me ofende la omisión del usb msp430 actuando como un dispositivo usb hid.
@Passerby Lo siento si herí tus sentimientos ;)

Le recomendaría que use un cable USB a serie (o adaptador, como se les suele llamar). Los controladores son fáciles de conseguir y, por lo general, se instalan automáticamente. Luego puede alternar el estado de uno de los pines de control, como CTS o RI, usando su interruptor. Esto le permitirá leer fácilmente las líneas con un programa simple en su sistema. Puede alternar las líneas de salida a su circuito de manera similar, si lo necesita.

Hice esto yo mismo para monitorear un relé magnético montado en una puerta para monitorear y marcar las entradas al laboratorio.

usb a cable serie

Me gusta eso, siempre que el OP pueda ejecutar un programa para obtener esa información. Lindo.

Supongo que desea trabajar con los controladores de dispositivos USB existentes en los sistemas operativos comunes, por ejemplo, Windows (varias versiones), OS X y Linux. Esto permitiría que un programa que se ejecuta en la PC host abra un archivo y lea el archivo 1.

Para enviar un mensaje 1que sea reconocido por la PC host, deberá intercambiar varios paquetes de mensajes. No es una señal simple de un bit, ni siquiera fija de varios bits.

En su lugar, el sistema operativo host solicitará suficiente información de su dispositivo de "botón" USB para averiguar qué tipo de dispositivo USB es e iniciar el controlador de dispositivo correspondiente.

Necesita entender cómo funciona el USB. Este tutorial de USB USB en pocas palabras puede ayudar. Describe el protocolo con suficiente detalle para que sea comprensible cómo la PC host interactuará con el dispositivo USB.

Para que sea fácil de usar, probablemente implementará un dispositivo HID, que parece un teclado para la PC host. La pulsación del botón se podría hacer para que se vea exactamente como un teclado 1. Hay varios proyectos que puedes encontrar buscando en la web. Todos utilizan un microcontrolador para gestionar la compleja interacción con el host.

Un ejemplo, que implementa USB totalmente en software usando un microcontrolador de bajo costo es V-USB .

Hay varios otros proyectos, algunos que hacen lo que estás describiendo, como Teensy de PJRC y digispark.

Hay muchas MCU que incluyen una interfaz USB de hardware. Por lo general, cuestan más de 1 GBP. Si desea seguir este camino, la mayoría de los fabricantes de MCU habilitados para USB proporcionan algún tipo de biblioteca, y también es la biblioteca USB de código abierto 'LUFA' .

Resumen : el protocolo USB es tan complejo que necesitará un microcontrolador para implementar cualquier cosa útil. USB no es un patrón de bits binario simple.

Editar:
este pedal V-USB parece una solución ajustada, si mis otras suposiciones son correctas. Tiene un solo botón, emula un teclado y está construido sobre una pieza de stripboard (veroboard) con un ATtiny y algunos componentes.

Podría usar su Arduino para hacer un programador AVR ISP. Eso le permitiría cargar el firmware en el ATtiny, por lo que podría ser un proyecto bastante rápido y de bajo costo.

De hecho, es una buena idea leer sobre cómo funciona el USB... ya que al hacerlo, sería evidente que en realidad no necesita nada de esto para enviar "una señal" reconocida por la PC.
@ChrisStratton - ¿En serio? ¿ Cómo enviaría un correo electrónico 1sin emular un dispositivo HID? ¿O al menos emulando un dispositivo bien definido?
@gbulmer Short V+ y GND, ¿detecta el evento de sobrecorriente en el software? (Este comentario es una broma, obviamente)
@immibis: lo consideré brevemente ; no es un punto muerto, pero lo suficiente como para desencadenar una sobrecorriente. Sin embargo, he realizado talleres con personas que usan computadoras portátiles Sony y necesitaban enfriarse y reiniciarse. Windows puede ser muy lento en 'conectar/desconectar', a veces incluso necesita reiniciarse. Así que rechacé ambos. Sin embargo, mientras uno solo quiera una solución frágil o específica, no una solución de propósito general, entre sistemas operativos, entonces sí, vale la pena considerar cualquiera de las dos. Leí la pregunta del OP como querer enviar un código o carácter de 1 tecla, que sería fácil de detectar y usar en cualquier sistema operativo común. Costaría menos de $ 2
@gbulmer no hay necesidad de acortar nada. Simplemente es necesario seguir los consejos que dio y leer sobre cómo funciona el USB : hay algún mecanismo en el que se basa el USB que lo hace posible con solo un cable y una resistencia.
@ChrisStratton: he leído su respuesta y estoy familiarizado con esos mecanismos. Basado en dispositivos que bajan/suben la resistencia USB-data-pull-up (para forzar la reenumeración), mi experiencia es que no funciona de manera confiable, a veces no funciona en absoluto, en Windows (8 y anteriores). He pedido más información del OP.
Si ese mecanismo no funciona, el USB no funciona; no puede conectar y desconectar dispositivos, ya que hacerlo depende de esto. Dado que USB obviamente funciona en general, es más una cuestión de tiempo, o si esos dispositivos realmente están haciendo lo que crees que están haciendo.
@ChrisStratton: fue muy 'confiable'. El dispositivo se conectaba por primera vez cuando se enchufaba y permanecía conectado sin problemas (durante muchos minutos, tal vez horas) hasta que dejaba caer la resistencia Rup. El dispositivo desapareció y no volvió. Desconecte y vuelva a conectar y todo estaba bien de nuevo. El mismo dispositivo funcionó en la versión de OS X y IIRC Ubuntu. Las máquinas con Windows pertenecían a escuelas donde nunca tocaba fondo de lo que estaba pasando.
Parece que está describiendo una ausencia de la resistencia demasiado corta para el sistema operativo en cuestión, un problema de tiempo que ya se ha comentado ampliamente . Dado que describe el funcionamiento de la reconexión, obviamente el mecanismo subyacente es viable. O bien, el periférico realmente no estaba haciendo lo que creías que era.
@ChrisStratton: ¿dónde se ha comentado extensamente el tiempo ? ¿Tal vez publicar un enlace?
En cada una de las publicaciones que he hecho en esta página, además de la de los chips FTDI y la inicial que señala que la existencia de opciones niega su respuesta.
@ChrisStratton: no creo que la pregunta del OP sea lo suficientemente clara; No creo que la señalización de bajo nivel sea adecuada. Lo leí como si quisiera enviar un 1, un carácter o un código clave. En segundo lugar, no entiendo qué nivel de control o acceso tiene el OP a la máquina, por lo que asumo un programa simple, por ejemplo, un archivo por lotes/script de shell en una PC estándar. En tercer lugar, el OP no ha aclarado la pregunta, por lo que no pasaré más tiempo hasta que la aclaren. La señalización de bajo nivel puede ser completamente adecuada o inútil, pero solo el OP puede decirlo.

Podría usar algo como esta placa de conexión FTDI que le permite interactuar fácilmente a través del protocolo en serie a través de USB.

Hay protocolos mucho mejores para indicar que se presiona un botón a través de USB que CDC o ACM. Como, digamos, HID.
@IgnacioVazquez-Abrams: en realidad, lo que es mejor depende de factores que no se mencionan aquí. Para muchos, la disponibilidad en la caja de repuestos y la familiaridad serán clave. En otros casos, pueden dominar los obstáculos que varios sistemas operativos todavía están lanzando durante dos décadas, e incluso aparte del aspecto USB, no es un hecho que un sistema operativo multiusuario haga que sea más fácil conectar la entrada de "usuario" que algunos otra forma de entrada.

USB tiene una señalización compleja de hecho. Pero lo que muchos pasan por alto es que el USB también emplea una señalización muy simple . Si controla completamente el software en la computadora, dependiendo de sus objetivos, todo lo que realmente necesitará es hacer que su botón conecte una resistencia entre cualquiera de las líneas de datos y VBUS.

Tal resistencia pull-up es la forma en que los periféricos USB señalan su presencia y cuál de las dos velocidades base utilizan. La pila USB del sistema operativo normalmente intentaría hablar con el dispositivo utilizando la señalización USB diferencial de estado complejo normal y leer información básica como VID/PID para determinar qué controlador se necesita. Por supuesto, en el caso de un cambio simple, esto fallará, pero el intento y la falla se pueden detectar en los mensajes de registro del sistema o mediante el código del kernel personalizado y, por lo tanto, puede satisfacer su necesidad.

Espere algo de latencia y una baja tasa de repetición si usa la pila USB estándar, pero los controladores de modo kernel personalizados probablemente puedan hacer esto a velocidades que se sentirían rápidas en términos humanos.

La latencia de esta propuesta será horrible. La latencia de conexión en Windows es de aproximadamente 1 s o más. En cualquier caso, la latencia de conexión no puede ser menor que el "intervalo de eliminación de rebotes" de 100 ms (obligado por las especificaciones de USB) y, por lo general, es de 200 a 500 ms, sin contar los cuatro intentos de no enumeración antes de que el sistema operativo genere algún mensaje de error.
Estos serían problemas con una pila USB estándar, y señalé que sería lento si se hiciera a través de eso. Sin embargo, una pila USB personalizada no está sujeta a la especificación USB en términos de lo que puede optar por informar al software personalizado interno, especialmente si estos informes son independientes de lo que hace con el propio bus USB. Es posible que algún hardware de host USB imponga algunas limitaciones, pero cosas como los intervalos de 100 ms se realizan mejor mediante software, por lo que no es tan probable. Esto se publica más para señalar lo que la multitud de "necesita un chip" está pasando por alto que como una recomendación.
He usado tableros que usan 'desconectar/reconectar', dejando caer la resistencia de extracción USB 'Rup' en una de las líneas de datos; los dispositivos lo hacen para intentar obligar al sistema operativo a 'volver a enumerar' el dispositivo. No funcionan de manera confiable en varias versiones de Windows en máquinas comunes (en escuelas del Reino Unido). He tenido máquinas que 'se niegan' a volver a conectarse y tuve que reiniciarlas. ¿Quizás actualice su respuesta para incluir las condiciones en sus comentarios?
Si no funcionan de manera confiable después de estar en estado de desconexión durante un período de tiempo razonable, el host o su sistema operativo están dañados. Pero si la inserción y extracción de periféricos USB normales funciona, entonces estos dispositivos son demasiado rápidos o no flotan realmente en la línea. Nuevamente, no estamos hablando de algo automático como en ese caso aquí, sino de algo hecho manualmente, que es a lo que está diseñada la detección USB para responder.
@ChrisStratton, entonces todas las variantes de Windows están rotas.
Bueno, como cuestión de opinión, generalmente estoy de acuerdo en que todas las variantes de ventanas están fatalmente rotas. Pero mi experiencia personal ha sido que si coloca una resistencia pullup en una línea de datos (en la forma de un dispositivo USB común), incluso Windows eventualmente se preguntará si podría haber un dispositivo allí, y si lo quita (por desenchufando dicho dispositivo), eventualmente llegan a la conclusión de que ya no lo hay. Sería el primero en estar de acuerdo en que Windows es un dolor de cabeza escandaloso, pero ¿no ha tenido ningún éxito en absoluto para que reconozca esta funcionalidad USB ordinaria?