Concentrador USB dentro del teclado modular para comunicación

Estoy trabajando en un proyecto personal que consiste en un teclado que también sirve como hub para conectar más teclados. Por ejemplo, podría tener el teclado principal con las letras y símbolos y adjuntar a este otro que tenga los números. Otro ejemplo podría ser un teclado que se divide en dos partes: izquierda y derecha. La pieza izquierda se conectará a la computadora y la pieza derecha a la pieza izquierda. Sé que la mayoría de las personas dividen los teclados usando el bus I2C, pero preferiría usar USB para una mayor flexibilidad. El primer reto que tengo que resolver es cómo pasar la señal de derecha a izquierda. He pensado en usar un controlador HUB USB para que cada pieza tenga un micro Arduino cuya salida se conectará a una entrada del controlador HUB USB y luego la salida del controlador HUB será la salida del teclado. El resto de puertos se utilizarán para conectar otras piezas de teclado u otros periféricos.

esquemático

simular este circuito : esquema creado con CircuitLab

Por supuesto, todos los módulos de teclado se construirán de la misma manera, por lo que puedo conectar 3 de ellos en serie y solo el último a la computadora. Me gustaría tener una entrada y una salida en cada lado del teclado para ensuciarme menos con los cables:

esquemático

simular este circuito

El problema de esta solución es que necesitaría muchos puertos USB tipo C y alguien que no esté acostumbrado a este teclado podría conectar salida a salida por ejemplo. La solución ideal sería tener solo un USB en cada lado que pueda usarse como entrada o salida. Entonces mi pregunta es: ¿Hay alguna manera de hacer un puerto USB IN o OUT dependiendo de si está dando energía o recibiéndola? Estaba pensando en usar el controlador HUB USB FE2.1 y algún tipo de interruptor USB, pero no estoy seguro de si esto es posible. Cualquier sugerencia será apreciada.

PD: Mi experiencia en electrónica es bastante baja, así que lo siento por todas las cosas estúpidas que he dicho. Si algo está mal o es difícil de entender, házmelo saber y lo editaré.

EDITAR 1

Elegí el USB C porque es muy delgado (el teclado debe ser portátil), no importa en qué dirección intentes conectar el cable y, que yo sepa, se supone que es más duradero que el micro USB. puerto.

El teclado lo haré yo, no es un teclado adaptado, por lo que se usará el Arduino para manejar la matriz de botones. Todos los módulos del teclado los haré de la misma manera, por lo que todos tendrán un Arduino y un HUB USB.

Es un proyecto personal y creo que es más elegante usar solo un USB por lado (gastaré algo de dinero y mucho tiempo en este proyecto, así que quiero que sea tan bueno como sea posible). Usar dos tipos diferentes de puertos USB en cada lado es una solución pero, si puedo, me gustaría tener solo uno en cada lado.

EDITAR 2

Creo que la mejor solución sería esta :

Recomendaría buscar un kit de desarrollo para un chip o conjunto de chips concentrador usb tipo c que pueda cambiar automáticamente los puertos de carga o descarga, luego puede dejarles todos los detalles sangrientos de usb-c y continuar con la construcción de su usb periférico.

Y si no puedo encontrar un controlador usb como ese o es demasiado caro, este :

solo proporcione conectores en todos los lados y haga que cambien el tipo de host/dispositivo dependiendo de dónde provenga la energía. (use chips de interruptor USB)

Solo quiero que el conector sea USB C, no me importa qué protocolo se esté ejecutando debajo de él. Está pensado solo para conectar teclados, por lo que todo debería estar bien.

use el conector USB tipo A para una entrada y cualquier otro tipo de conector para la salida ... de esa manera no puede conectar dos entradas juntas o conectar dos salidas juntas ......... El USB tipo C parece demasiado frágil para usar en un dispositivo que se mueve mucho (podría estar equivocado sobre la fragilidad del conector)
Puede ser muy útil conceptualmente si comienza a usar la terminología USB oficial, donde no hay entrada/salida, sino puertos "ascendentes" y "descendentes". Esto ayudará a aclarar muchos conceptos erróneos. Además, tenga en cuenta que el uso de la jerarquía de concentradores en el marco USB está limitado a cinco concentradores en una rama lineal, por lo que su idea podría tener una capacidad de expansión limitada.
No entiendo por qué, si los módulos del teclado tienen una conexión USB y el protocolo de identificación para hablar con la PC, ¿por qué necesita un arduino y por qué no puede simplemente enchufarlos en un concentrador normal?
Ahora, si solo el módulo principal tiene un chip USB (por simplicidad y menor costo), entonces no tiene sentido usar conectores y cables USB. Utilice la interfaz I²C común que se puede conectar y desconectar con otro tipo de conectores. Esto ampliará la cantidad de dispositivos conectados a 256 (si no recuerdo mal).
La solución más simple sería hacer cautivo el cable ascendente, como lo hacen la mayoría de los teclados. Para los puertos descendentes, probablemente desee chips de interruptor de alimentación USB (que no forman parte del HUB IC) con alguna lógica de habilitación impulsada por la resistencia de modo USB-C. Intentar que sea seguro contra una mala conexión no debería ser tan difícil; tratar de hacerlo de modo que cualquiera de los lados pueda usarse para el puerto aguas arriba puede ser poco práctico y difícil.
Si pudiera aumentar la cuenta del comentario de @ChrisStratton, lo haría 100 veces más.
Si no le preocupa el cumplimiento de las especificaciones USB, tal vez podría usar un STM32F405 o F407 con sus interfaces USB OTG duales, y hacer que el software observe las resistencias para decidir qué puerto debe activarse como una interfaz de dispositivo para la generación de informes ascendentes, y que debería implementar un host muy limitado capaz de alojar solo otro teclado. En lugar de que el software emule un concentrador, puede pasar los eventos de su cliente como si fueran suyos. Tal vez pueda obtener potencia pony a través de un diodo y luego habilitar un interruptor FET para un verdadero paso cuando decida que las condiciones son seguras para hacerlo. Feliz codificación :-)
Creo que he encontrado una posible solución, pero no estoy seguro de si esto funcionaría: ¿Podría usar un diodo en el cable Vcc del USB para asegurarme de que justo cuando la energía va en una dirección? activa el pin de selección en el interruptor IC, de modo que cuando la alimentación va en una dirección, se conectará a un puerto de bajada y cuando vaya al otro, se conectará al puerto de subida?
"He encontrado una posible solución" - no, no es una solución. Puede usar cualquier medio para detectar qué puerto se conecta aguas arriba y manipular la energía en cualquier dirección, pero no puede cambiar fácilmente la función de datos de ese puerto (y todos los demás puertos). Ningún concentrador USB se diseñó de esa manera, para tener todos los puertos reconfigurados arbitrariamente sobre la marcha. Incluso en soluciones de red más avanzadas como Ethernet, los conmutadores tienen un puerto "especial", "ascendente".

Respuestas (3)

solo proporcione conectores en todos los lados y haga que cambien el tipo de host/dispositivo dependiendo de dónde provenga la energía.

(use chips de interruptor USB)

Si no puedo encontrar un controlador HUB USB que maneje por sí mismo qué puerto se usa como ascendente o descendente, probablemente esta sea la mejor solución. ¡Gracias!
no necesitarás detectar eso con circuitos analógicos
Llevo tiempo buscando un switch adecuado a mis necesidades pero no he podido encontrar nada. ¿Conoces algún circuito que pueda ser útil?
@edoelas, busque circuitos integrados de controlador de concentrador "MCHP FlexConnect"
Oooh, buen lugar, pero parece que solo pueden cambiar de función en un puerto, y el OP quiere USB-C, que tiene la complicación de necesitar hacer un baile antes de que se encienda.
usb C es un conector, hay un requisito para usar USB 3.2, especialmente para un teclado. 5V estará allí desde el principio.
@james, el OP quiere demasiado sin entenderlo. Quiere un conmutador universal, en el que cualquier puerto pueda convertirse en un puerto ascendente (si está conectado a un host USB) y todos los demás puertos se conviertan automáticamente en puertos descendentes. Por lo tanto, todos los puertos Tipo-C de aspecto idéntico funcionan correctamente independientemente de dónde conecte el usuario su PC. Esto es pedir demasiado. Es técnicamente factible, pero tal cosa no existe.

Hay abundantes ejemplos de teclados USB con concentradores en ellos. No necesitas la complejidad que estás describiendo.

Si tiene un teclado USB (su dispositivo con solo la mitad de las teclas), entonces funciona con el controlador estándar... simplemente nunca puede presionar las teclas que no existen en él. Si conecta al puerto USB de su teclado otro dispositivo de teclado con la otra mitad de las teclas, eso también funcionará y le proporcionará las otras teclas. Al controlador de teclado no le importa que existan varios teclados, y la lógica 'O' del controlador trata todos los valores clave como el mismo flujo.

NO es necesario que tenga en cuenta la entrada y la salida, son simplemente dispositivos en el árbol USB que cargan el servicio/controlador requerido.

Puede probar esto usted mismo obteniendo un teclado con un concentrador USB (por ejemplo, este teclado Logitech tiene transferencia). Solo necesita enchufes USB tipo A en sus dispositivos. Conecte otro teclado al hub del primero y tendrá lo que desea. El árbol se puede extender a muchos niveles de profundidad (la especificación USB cita 7 capas de profundidad, incluido el concentrador raíz).

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat . Cualquier conclusión alcanzada debe volver a editarse en la respuesta.

Hay una solución simple a su problema: no use conectores tipo C.

Dado que su teclado será, en el mejor de los casos, un dispositivo USB de alta velocidad, puede usar conectores Tipo-A y Tipo-B (o, mejor, micro-B).

Sus puertos ascendentes (similares a un concentrador) tendrán conectores tipo A, y sus puertos descendentes (similares a dispositivos) tendrán conectores tipo B.

Dado que ni los cables A a A, ni B a B deben existir de acuerdo con los estándares USB (y los que existen son raros/especializados), puede estar tranquilo sabiendo que la única forma en que probablemente se conectarían los módulos es la forma correcta.

Si lo piensas bien, un concentrador USB (que no sea de tipo C) tiene exactamente el mismo problema, que resuelve exactamente de la misma manera.

Dado que es probable que sus dispositivos solo tengan un puerto ascendente, tampoco puede hacer que el usuario haga un bucle.

-- editar, ya que dices que quieres usar USB C --

Si está decidido a usar USB C, puede usar cables cautivos para distinguir los puertos ascendentes (cable cautivo) de los puertos descendentes (enchufe).

Si eso no le atrae, deberá determinar si el puerto es un puerto ascendente o descendente y enrutarlo de manera adecuada, también deberá realizar al menos una cantidad mínima de negociación de PD. Los únicos dispositivos que he visto que pueden hacer esto son las estaciones de acoplamiento USB-c.

Recomendaría buscar un kit de desarrollo para un chip o conjunto de chips concentrador usb tipo c que pueda cambiar automáticamente los puertos de carga o descarga, luego puede dejarles todos los detalles sangrientos de usb-c y continuar con la construcción de su usb periférico.

Si no le importa no ser totalmente compatible con USB-C, lo mínimo que puede conseguir es un concentrador USB 2.0, algún tipo de multiplexor USB 2:1 (un interruptor analógico o un IC dedicado, existen muchos para manejar el de hecho, usb-c se puede girar) utilizado como multiplexor entre el puerto ascendente de su usb 2.0 y uno de sus puertos descendentes, y el microcontrolador que monitorea las líneas CC1 y CC2 de todos los puertos usb-c y configura su multiplexores apropiadamente.

Es un problema bastante difícil, pero factible.

-- editar después de no poder encontrar ningún kit de desarrollo adecuado --

Eché un vistazo a Cypress, Via y Semiconductor, ninguno de ellos tiene una oferta de concentrador USB que funcione tanto en sentido ascendente como descendente USB (muchas funciones dobles para la alimentación) en un solo puerto, así que creo que eso te deja con el USB Solución de cambio 2.0. Que se vería algo como esto:

esquemático

simular este circuito : esquema creado con CircuitLab

Tenga en cuenta que faltan muchas cosas en este esquema, pero con un up que tiene capacidades de dirección conmutable, pull up, pull down en su GPIO (sí, los pull ups no serán correctos para la especificación USB-c, puede hacerlo mejor con algunos interruptores fet y las resistencias de valor correcto) podrá determinar qué puertos están aguas arriba y cuáles aguas abajo, y señalizar adecuadamente.

Tenga en cuenta que cuando implementa esto, agrega un poco de aleatoriedad a su algoritmo de sondeo para que no termine buscando puertos mientras intentan averiguar si son el puerto ascendente. Deberá hacer algo para que todos los puertos se identifiquen como puertos ascendentes cuando no haya energía, ya que un puerto descendente USB-C no se encenderá a menos que detecte un puerto ascendente. (La forma más económica de hacerlo sería con un par de diodos de CC1 y CC2 a un riel que se sujeta a cero hasta que el sistema tenga energía)

Su controlador de teclado y cualquier otra cosa que desee que aparezca en el bus se colgaría de uno de los otros puertos descendentes (que no se muestran) en el concentrador.

-- editar más detalles --

Nota: esto está simplificado: se utilizan mecanismos más sofisticados para la comunicación en los pines CC1/CC2 y para organizar el suministro de energía:

Al comienzo del día, un DFP usb-c (puerto orientado hacia abajo, por ejemplo en su computadora portátil) no suministra VBUS. En su lugar, eleva los pines CC1 y CC2 con Rp (36k a 3.3V, o 56k a 5.0V).

El UFP (puerto orientado hacia arriba al que se conecta) baja CC1 y CC2 con Rd (5.1k). El cable tiene un cable para CC1/CC2 y se puede insertar de una de cuatro maneras para conectar CC1->CC1, CC2->CC2 o CC1->CC2 o CC2->CC1).

Cuando el puerto DFP ve uno de CC1 o CC2 bajado por Rd, aplica energía.

El objetivo de este diseño es que si conecta los puertos UFP juntos, ambos no intenten suministrarse energía entre sí.

Usted diseña su placa para que, sin alimentación, baje el CC1 de cada conector USB con 5.1k y deje las entradas a los mosfets flotando.

Cuando se conecta un cable de un puerto orientado hacia abajo (como su computadora), el DFP detectará su puerto indicando que es un puerto orientado hacia arriba y aplicará la alimentación.

La energía fluirá a través del diodo y alimentará su circuito, pero no fluirá a través de ningún puerto ya que su mosfet está desactivado. Su arduino se iniciará y observará todos los pines CC para determinar qué puerto es el puerto ascendente que se ha conectado. Una vez hecho esto, cambiará el multiplexor para conectar el D+/D- de ese puerto al puerto ascendente del concentrador USB.

A continuación, extraerá todos los pines CC en los puertos restantes y buscará exactamente uno de CC1 o CC2 que se esté bajando. Cuando vea que puede habilitar el mosfet en ese puerto y comenzar a suministrar energía.

Es posible que desee circuitos como los siguientes para conectar cada conjunto de pines CC a su up.

esquemático

simular este circuito

(Nuevamente, muchos se omiten en ese esquema, si su UP puede hacer frente a 0.1 mA sin entrar en el enganche SCR, puede omitir D3)

Con su up sin alimentación, el puerto orientado hacia abajo (en su computadora) aplica 5V a 56k a CC1 y CC2. El cable solo conecta uno de CC1 o CC2.

C1 se carga y enciende M1 (debe asegurarse de que M1 esté completamente encendido con solo 0.8V en la puerta). Esto derriba CC1 con 5.6k. El DFP aplica 5 V a Vbus y su up se enciende.

Su up permite pull ups débiles en GPIOS AC para cada puerto.

Para cada línea CC (2 por puerto), mira GPIO B. Cuando encuentra un puerto con un GPIO B < 1 V y el otro GPIO B ~ 5 V, lo reconoce desde el puerto ascendente y cambia el multiplexor a conecte D+/D- al puerto ascendente del concentrador.

Luego, para todas las demás líneas CC de los puertos, configura GPIO A como una salida alta (para comenzar a buscar dispositivos) y GPIO C como una salida baja (para dejar de indicar que es un puerto descendente). Luego escanea GPIO B y busca si exactamente uno de GPIO B es < 1V para ese puerto, cuando eso es cierto, enciende el mosfet Vbus para proporcionar energía.

Si en el puerto ascendente original, GPIO B se eleva, el dispositivo debe deshabilitar todos los mosfets y configurar todos los GPIO en alta impedancia y comenzar a buscar un nuevo puerto ascendente (o es más probable que pierda energía)

(La complejidad de este circuito es permitirle hacer lo correcto incluso cuando su UP está apagado y sus diodos de protección están bajando todas sus entradas).

Creo que mi mejor opción es un chip USB HUB que pueda cambiar de upstream a downstream automáticamente, pero no conozco ningún integrado como este. ¡Gracias!
Ciertamente existen, ya que al menos una estación de acoplamiento HP que tengo tiene 3 puertos USB-C, cualquiera de los cuales puede ser ascendente y el resto de los cuales cambia a descendente, echaré un vistazo para ver qué chipset usa.
Gracias james, esta es la solución que usaré para mi proyecto, esta información es realmente útil. Solo tengo una duda: ¿Qué es una uP? No pude encontrar nada en internet.
uP es un microprocesador, deberá programarlo con un código para interactuar con los pines CC de sus conectores tipo c y luego configurar los diversos Muxes y los interruptores de alimentación según corresponda.
Entonces, ¿podría usar otro Arduino o, si tengo suficientes pines, el mismo que se usa para controlar la matriz de botones para lograr eso? Todavía no entiendo por qué necesito usar un diodo y un mosfet para conectar VBUS a la alimentación y por qué no puedo usar un diodo en los pines cc1 y cc2 y cuando la corriente puede pasar a través del diodo, el interruptor se activa. . Si estas son demasiadas preguntas, intentaré obtener las respuestas en reddit.com/r/AskElectronics , así que no se preocupe si no puede responderlas. gracias james