Tengo un pequeño controlador dedicado construido alrededor de un Arduino que acepta comandos de una PC a través de USB (serie). La comunicación es unidireccional: el controlador nunca envía datos a la PC.
Ahora necesito extender el controlador para manejar más tareas, pero no hay espacio físico ni programático, así que estoy agregando una segunda caja con otro Arduino que aceptará los comandos extendidos.
No puedo modificar la aplicación de control de la PC ni agregar otro puerto USB a la PC. La aplicación controla el hardware y, a su vez, está controlada por un script. Solo puede hablar con un puerto serie (físico o virtual) a la vez. Podemos modificar el script, pero no el hardware o la aplicación. Así que mi esperanza es que pueda cruzar las líneas D+/- para alimentar el segundo controlador.
Si esto fuera una serie directa, no tendría ningún problema, pero con USB en el medio veo problemas más adelante, porque la PC querrá enumerar ambos Arduino USB, ¿verdad?
¿Hay una solución aquí que estoy pasando por alto? ¿Puedo usar USB de forma pasiva, solo como oyente, con el segundo controlador?
La serie USB CDC es un protocolo bastante complicado. Incluso si solo envía comandos en serie de una manera, hay tráfico USB que va y viene todo el tiempo. Incluso cuando el bus serie virtual está en silencio, el host USB pregunta continuamente al dispositivo USB "¿tiene algo para enviar?" y el dispositivo dice "no".
Considere enviar la frase "hola" a un arduino y obtener "hola" de vuelta. En el bus USB, se verá así:
Anfitrión: ¿Tienes un mensaje?
Dispositivo : No.
Anfitrión: Tengo un mensaje para ti
Dispositivo : OK
Anfitrión: hola\n
Dispositivo : OK
Anfitrión: ¿Tienes un mensaje?
Dispositivo : No.
Anfitrión: ¿Tiene un mensaje?
Dispositivo : hel
Host: ¿Tiene un mensaje?
Dispositivo : llo\n
Host: ¿Tiene un mensaje?
Dispositivo : No.
etc. etc.
Estos mensajes también se mezclarán con los mensajes enviados a otros dispositivos en el mismo concentrador (incluso si no tiene un concentrador USB en el sistema, es posible que haya uno dentro de la computadora. Así que podría ver fácilmente los mensajes en su mouse y teclado mezclados).
El protocolo USB es extremadamente complicado, por lo que dividirlo de la manera que mencionas no será práctico. Sin embargo, puedes "olfatearlo". Si conecta las líneas D+ y D-, es posible ver el tráfico en el autobús. Siempre que el sniffer no intente manipular las líneas D+/D-, el bus USB seguirá funcionando. El rastreador necesitaría entonces identificar qué mensajes eran relevantes y decodificarlos. Construir un sniffer a partir de un arduino sería difícil pero probablemente no imposible. Es casi seguro que no es la mejor solución para su problema.
No, no puede dividir USB, pero ¿qué le impide conectar los pines de recepción UART de dos Arduinos juntos para que ambos reciban los mismos datos UART, o hacer que el primer Arduino envíe comandos que no entiende al otro Arduino?
¿Puedo usar USB de forma pasiva, solo como oyente, con el segundo controlador?
Técnicamente sí, puede construir un dispositivo que mire pasivamente el tráfico USB y pueda obtener información de él y tomar cualquier acción. De hecho, dispositivos como ese existen. Se denominan "Analizadores de protocolo USB".
La arquitectura típica de tales dispositivos consiste en un sniffer no invasivo en líneas D+/D- (divisor de voltaje de alta impedancia más amplificador de banda ancha con compensación de ganancia), que alimentan un PHY USB estándar (autónomo). La interfaz de salida en serie-paralelo del PHY (ULPI, UTMI o PIPE3) luego es observada/registrada por un FPGA de gran tamaño que tiene herramientas de decodificación y puede desencadenar eventos de protocolo USB. Ejemplos: Teledyne-LeCroy , Ellisys .
Para que pueda ver el tráfico USB y obtener datos. Para obtenerlos en tiempo real, deberá programar FPGA y ejecutarlo a una frecuencia de reloj suficiente para implementar la mayoría de los elementos del motor de interfaz serie USB (excepto la formación de respuestas ACK/NAK).
Una solución podría ser implementar esencialmente una topología en serie local encadenada de Arduinos. Uno de estos en el 'frente' de la cadena expondría su interfaz USB CDC. Luego, conectaría un par de pines configurados para SoftwareSerial a los pines Serial del siguiente Arduino (D0/D1) y así sucesivamente. Luego, podría repetir el tráfico en serie recibido hacia arriba y hacia abajo de la cadena según sea necesario, con cada miembro de la cadena decidiendo si debe responder según corresponda.
pjc50
jim mack
Jasén
vsz
jim mack