2 votos

Concentrador USB dentro del teclado modular para la 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 los símbolos y adjuntar a éste otro que tenga los números. Otro ejemplo podría ser un teclado dividido en dos piezas: izquierda y derecha. La pieza izquierda estará conectada al ordenador y la pieza derecha a la pieza izquierda. Sé que la mayoría de la gente hace teclados divididos usando el bus I2C pero yo preferiría usar el USB para una mejor flexibilidad. El primer reto que tengo que resolver es cómo pasar la señal de la derecha a la izquierda. He pensado utilizar un controlador USB HUB por lo que cada pieza tendrá un micro Arduino cuya salida se conectará a una entrada del controlador USB HUB y luego la salida del controlador HUB será la salida del teclado. El resto de los puertos se utilizarán para conectar otras piezas de teclado u otros periféricos.

schematic

simular este circuito - Esquema creado con CircuitLab

Por supuesto, todos los módulos de teclado se construirán de la misma manera para que pueda conectar 3 de ellos en serie y sólo el último al ordenador. Me gustaría tener una entrada y una salida en cada lado del teclado para no liar tanto los cables:

schematic

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 sólo un USB en cada lado que se pueda utilizar como entrada o salida. Así que mi pregunta es: ¿hay alguna manera de hacer que un puerto USB sea de entrada o de salida dependiendo de si está dando energía o recibiéndola? Estaba pensando en utilizar el controlador FE2.1 USB HUB y algún tipo de interruptor USB pero no estoy seguro de que esto sea posible. Cualquier sugerencia será agradecida.

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

EDITAR 1

He elegido el USB C porque es muy delgado (el teclado necesita ser portátil), no le importa en qué dirección intentes conectar el cable y, por lo que sé, se supone que es más duradero que el puerto micro USB.

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

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

EDITAR 2

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

Yo recomendaría buscar un kit de desarrollo para un chip hub usb tipo-c o un chipset que sea capaz de cambiar automáticamente los puertos de subida o de bajada, entonces puedes dejar todos los detalles sangrientos de usb-c a ellos y seguir con la construcción de tu periférico usb.

Y si no soy capaz de encontrar un controlador usb como ese o es demasiado caro este :

sólo hay que proporcionar conectores en todos los lados y hacer que cambien de tipo de host/dispositivo dependiendo de dónde venga la energía. (utilizar chips de conmutación USB)

Sólo quiero que el conector sea USB C, me da igual el protocolo que corra por debajo. Está pensado solo para conectar teclados así que cualquier cosa debería estar bien.

1voto

james Puntos 464

Hay una solución sencilla para su problema: no utilice conectores de tipo C.

Como tu teclado va a ser, en el mejor de los casos, un dispositivo usb de alta velocidad, puedes utilizar conectores Tipo-A y Tipo-B (o, mejor, micro-B).

Los puertos de subida (tipo hub) tendrán conectores de tipo A, y los de bajada (tipo dispositivo) tendrán conectores de tipo B.

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

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

Como es probable que tus dispositivos sólo tengan un puerto de subida, tampoco puedes hacer que el usuario haga un bucle.

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

Si estás decidido a usar USB C, puedes usar cables cautivos para distinguir tus puertos de subida (cable cautivo) de los de bajada (enchufe).

Si eso no te convence tendrás que determinar si el puerto es de subida o de bajada y enrutarlo adecuadamente, también tendrás que hacer al menos una mínima negociación de DP. Los únicos dispositivos que he visto que son capaces de hacer esto son las estaciones de acoplamiento USB-c.

Yo recomendaría buscar un kit de desarrollo para un chip hub usb tipo-c o un chipset que sea capaz de cambiar automáticamente los puertos de subida o de bajada, entonces puedes dejar todos los detalles sangrientos de usb-c a ellos y seguir con la construcción de tu periférico usb.

Si no te importa no ser totalmente compatible con USB-C, lo mínimo que podrías conseguir es un hub USB 2.0, algún tipo de multiplexor USB 2:1 (un conmutador analógico, o un circuito integrado dedicado, existen muchos para manejar el hecho de que el USB-C puede ser volteado) utilizado como un multiplexor entre el puerto de subida de tu USB 2.0, y uno de sus puertos de bajada, y el microcontrolador que monitorea las líneas CC1 y CC2 de todos los puertos USB-C y establece tus multiplexores apropiadamente.

Es un problema bastante difícil, pero factible.

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

He mirado en cypress, via, y en semiconductor, ninguno de ellos tiene una oferta de hub usb que haga tanto el upstream como el downstream USB (muchos hacen el papel dual para la energía) en un solo puerto, así que creo que te deja con la solución de switch usb 2.0. Que sería algo así:

schematic

simular este circuito - Esquema creado con CircuitLab

Ten en cuenta que faltan muchas cosas en este esquema, pero con un uP que tenga dirección conmutable, pull up, pull down en sus GPIO (sí, los pull ups no serán correctos para la especificación USB-c, puedes hacerlo mejor con algunos interruptores fet y las resistencias de valor correcto) serás capaz de determinar qué puertos son de subida y cuáles de bajada, y señalar apropiadamente.

Ten en cuenta cuando implementes esto que añades un poco de aleatoriedad a tu algoritmo de sondeo para que no acabes con los puertos cazando mientras intentan averiguar si son el puerto de subida. Tendrás que hacer algo para que todos los puertos se identifiquen como puertos ascendentes cuando no haya energía, ya que un puerto USB-C descendente 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 carril que se sujeta a cero hasta que el sistema tiene energía)

Tu controlador de teclado y cualquier otra cosa que quieras que aparezca en el bus se colgaría de uno de los otros puertos (no mostrados) de bajada del hub.

-- editar más detalles --

Nota - esto es simplificado - hay mecanismos más sofisticados utilizados para la comunicación en los pines CC1/CC2 y para organizar la entrega de energía:

Al principio, un DFP usb-c (puerto orientado hacia abajo, por ejemplo, en el portátil) no suministra VBUS. En su lugar, pone los pines CC1 y CC2 en alto con Rp (36k a 3,3V, o 56k a 5,0V).

El UFP (puerto orientado hacia arriba al que se conecta) tira de CC1 y CC2 a bajo con Rd (5,1k). El cable tiene un hilo para CC1/CC2, y puede insertarse de una de las cuatro formas para conectar CC1->CC1, CC2->CC2, o CC1->CC2, o CC2->CC1 ).

Cuando el puerto DFP ve uno de los CC1 o CC2 tirado a bajo por Rd aplica energía.

El objetivo de este diseño es que si conectas los puertos UFP juntos no intenten alimentarse mutuamente.

Diseña tu placa de manera que, sin alimentación, tire de CC1 de cada conector USB a bajo con 5,1k, y deje las entradas a los mosfets flotando.

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

La energía fluirá a través del diodo, y alimentará tu circuito, pero no saldrá por ningún puerto ya que tu mosfet está desactivado. Tu arduino arrancará y mirará todos los pines de la CC para averiguar cuál es el puerto de subida que se ha conectado. Una vez hecho esto, cambiará el multiplexor para conectar el D+/D- de ese puerto al puerto de subida del hub USB.

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

Puede que quieras un circuito como el siguiente para interconectar cada conjunto de pines CC con tu uP.

schematic

simular este circuito

(de nuevo se omiten muchas cosas en ese esquema, si tu uP puede soportar 0.1mA sin entrar en latchup de SCR puedes omitir D3)

Con su uP sin alimentación, el puerto orientado hacia abajo (en su ordenador) aplica 5V a través de 56k a CC1 y CC2. El cable sólo conecta uno de los CC1 o CC2.

C1 se carga y enciende M1 (tienes que asegurarte de que M1 está completamente encendido con sólo 0,8V en la puerta). Esto tira hacia abajo CC1 con 5,6k. El DFP aplica 5V a Vbus y tu uP se enciende.

Tu uP habilita pull ups débiles en GPIOS A-C para cada puerto.

Para cada línea CC (2 por puerto) mira el GPIO B. Cuando encuentra un puerto con un GPIO B < 1V, y el otro GPIO B ~ 5V, lo conoce del puerto de subida, y voltea el multiplexor para conectar D+/D- al puerto de subida del hub.

A continuación, para todos los demás puertos líneas CC establece GPIO A ser una salida impulsada alta (para empezar a buscar dispositivos), y GPIO C para ser una salida impulsada baja (para dejar de indicar que es un puerto de aguas abajo). Luego escanea el GPIO B y mira para ver si exactamente uno de los GPIO B es < 1V para ese puerto, cuando es cierto, enciende el mosfet Vbus para proporcionar energía.

Si en el puerto original de subida, el GPIO B se pone en alto, el dispositivo debería desactivar todos los mosfets y, poner todos los GPIOs en alta impedancia y empezar a buscar un nuevo puerto de subida (o más probablemente perder la energía)

(La complejidad de este circuito es para permitirle hacer lo correcto incluso cuando su uP está apagado y sus diodos de protección están tirando de todas sus entradas hacia abajo).

1voto

Jamie3213 Puntos 48

Hay abundantes ejemplos de teclados USB con hubs en ellos. No es necesaria la complejidad que describes.

Si usted tiene un teclado USB (su dispositivo con sólo la mitad de las teclas en él), entonces funciona con el controlador estándar . simplemente nunca se llega a golpear las teclas que no existen en él. Si conecta en el puerto USB de su teclado otro dispositivo de teclado con la otra mitad de las teclas, entonces eso también funcionará dándole las otras teclas. Al controlador del teclado no le importa que existan varios teclados, y los valores de las teclas son tratados todos como el mismo flujo por la lógica 'OR' del controlador.

Vous NO necesitan ser conscientes de la entrada frente a la salida, son simplemente dispositivos en el árbol USB que cargan el servicio/driver requerido.

Puedes probarlo por ti mismo consiguiendo un teclado con un concentrador USB (por ejemplo este Logitech teclado tiene passthrough). Sólo necesitas enchufes USB tipo A en tus dispositivos. Conecte otro teclado en el hub del primero y tendrá lo que quiere. El árbol se puede extender a muchos niveles de profundidad (la especificación USB cita 7 capas de profundidad incluyendo el Hub raíz).

1voto

Chad Johnson Puntos 248

Simplemente proporcionar conectores en todos los lados y hacer que cambien el tipo de host/dispositivo dependiendo de donde venga la energía.

(utilizar chips de conmutación USB)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X