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.
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:
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.
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)
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).
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:
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.
(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).
jsotola
Ale..chenski
fredled
fredled
chris stratton
miguel karas
chris stratton
edoelas
Ale..chenski