USB-Hub in der modularen Tastatur für die Kommunikation

Ich arbeite an einem persönlichen Projekt, das an einer Tastatur besteht, die auch als Hub dient, um weitere Tastaturen anzuschließen. Zum Beispiel könnte ich die Haupttastatur mit den Buchstaben und Symbolen haben und an diese eine weitere mit den Zahlen anhängen. Ein weiteres Beispiel könnte eine Tastatur sein, die in zwei Teile geteilt ist: links und rechts. Das linke Stück wird mit dem Computer verbunden und das rechte Stück mit dem linken Stück. Ich weiß, dass die meisten Leute Tastaturen mit dem I2C-Bus aufteilen, aber ich würde es vorziehen, USB für mehr Flexibilität zu verwenden. Die erste Herausforderung, die ich lösen muss, ist, wie ich das Signal von rechts nach links weiterleite. Ich habe daran gedacht, einen USB-HUB-Controller zu verwenden, damit jedes Stück ein Arduino-Mikro hat, dessen Ausgang mit einem Eingang des USB-HUB-Controllers verbunden wird, und dann wird der Ausgang des HUB-Controllers der Ausgang der Tastatur sein. Der Rest der Ports wird verwendet, um andere Tastaturen oder andere Peripheriegeräte anzuschließen.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Natürlich werden alle Tastaturmodule gleich aufgebaut sein, also kann ich 3 davon in Reihe schalten und nur das letzte an den Rechner. Ich hätte gerne einen Eingang und einen Ausgang auf jeder Seite der Tastatur, um weniger Kabelsalat zu haben:

schematisch

Simulieren Sie diese Schaltung

Das Problem bei dieser Lösung ist, dass ich viele USB-Typ-C-Anschlüsse bräuchte und jemand, der diese Tastatur nicht gewohnt ist, beispielsweise Ausgang an Ausgang anschließen könnte. Die ideale Lösung wäre, nur einen USB auf jeder Seite zu haben, der als Ein- oder Ausgang verwendet werden kann. Meine Frage lautet also: Gibt es eine Möglichkeit, einen USB-Anschluss IN oder OUT zu machen, je nachdem, ob er Strom liefert oder empfängt? Ich dachte daran, den FE2.1 USB HUB-Controller und eine Art USB-Switch zu verwenden, bin mir aber nicht sicher, ob dies möglich ist. Jeder Vorschlag wird geschätzt.

PS: Meine Erfahrung in der Elektronik ist ziemlich gering, also entschuldigen Sie all die dummen Dinge, die ich gesagt habe. Wenn etwas nicht stimmt oder schwer zu verstehen ist, lassen Sie es mich einfach wissen und ich werde es bearbeiten.

BEARBEITEN 1

Ich habe mich für USB C entschieden, weil es sehr dünn ist (die Tastatur muss tragbar sein), es ist egal, in welche Richtung Sie versuchen, das Kabel anzuschließen, und es soll meines Wissens langlebiger sein als das Micro-USB Hafen.

Die Tastatur wird von mir gemacht, es ist keine angepasste Tastatur, also wird das Arduino verwendet, um die Tastenmatrix zu handhaben. Alle Tastaturmodule werden von mir auf die gleiche Weise hergestellt, sodass alle einen Arduino und einen USB-HUB haben.

Es ist ein persönliches Projekt und ich denke, es ist eleganter, nur einen USB pro Seite zu verwenden (ich werde etwas Geld und viel Zeit in dieses Projekt investieren, also möchte ich, dass es so gut ist, wie ich kann). Die Verwendung von zwei verschiedenen Arten von USB-Anschlüssen auf jeder Seite ist eine Lösung, aber wenn ich kann, möchte ich nur einen auf jeder Seite haben.

BEARBEITEN 2

Ich denke, die beste Lösung wäre diese :

Ich würde empfehlen, nach einem Entwicklungskit für einen USB-Typ-C-Hub-Chip oder -Chipsatz zu suchen, der in der Lage ist, Ports automatisch von Upstream oder Downstream umzuschalten, dann können Sie ihnen alle blutigen Details von USB-C überlassen und mit dem Bau Ihres USB fortfahren peripher.

Und wenn ich einen solchen USB-Controller nicht finden kann oder dieser zu teuer ist :

Stellen Sie einfach Anschlüsse auf allen Seiten bereit und lassen Sie sie den Typ Host / Gerät wechseln, je nachdem, woher die Stromversorgung kommt. (USB-Switch-Chips verwenden)

Ich möchte nur, dass der Anschluss USB C ist, es ist mir egal, welches Protokoll darunter läuft. Es ist nur zum Anschließen von Tastaturen gedacht, also sollte alles in Ordnung sein.

Verwenden Sie eine USB-Typ-A-Buchse als Eingang und eine andere Typ-Buchse als Ausgang ... auf diese Weise können Sie nicht zwei Eingänge zusammenstecken oder zwei Ausgänge zusammenstecken ......... USB Typ C scheint zu zerbrechlich zu sein auf einem Gerät, das viel bewegt wird (ich könnte mich in Bezug auf die Zerbrechlichkeit des Steckers irren)
Es könnte konzeptionell sehr nützlich sein, wenn Sie anfangen, die offizielle USB-Terminologie zu verwenden, bei der es keine Ein-/Ausgänge, sondern „Upstream“- und „Downstream“-Ports gibt. Dies wird helfen, viele Missverständnisse auszuräumen. Denken Sie auch daran, dass die Verwendung der Hub-Hierarchie im USB-Framework auf fünf Hubs in einem linearen Zweig beschränkt ist, sodass Ihre Idee möglicherweise nur begrenzt erweiterbar ist.
Ich verstehe nicht, warum, wenn die Tastaturmodule einen USB-Anschluss und das Identifikationsprotokoll haben, um mit dem PC zu sprechen, warum Sie ein Arduino brauchen und warum Sie sie nicht einfach an einen normalen Hub anschließen können?
Wenn nun nur das Hauptmodul einen USB-Chip hat (der Einfachheit halber und zu geringeren Kosten), dann macht es keinen Sinn, USB-Buchsen und Kabel zu verwenden. Verwenden Sie die gemeinsame I²C-Schnittstelle, die mit anderen Buchsentypen ein- und ausgesteckt werden kann. Dadurch wird die Anzahl der angeschlossenen Geräte auf 256 erweitert (wenn ich mich richtig erinnere).
Die einfachste Lösung wäre, das Upstream-Kabel unverlierbar zu machen, wie es die meisten Tastaturen tun. Für die Downstream-Ports möchten Sie wahrscheinlich USB-Power-Switch-Chips (die nicht Teil des HUB-IC sind) mit einer gewissen Aktivierungslogik, die vom USB-C-Modus-Widerstand gesteuert wird. Es sollte nicht so schwer sein, es vor Fehlverbindungen zu schützen. Der Versuch, es so zu machen, dass beide Seiten für den Upstream-Port verwendet werden können, kann unpraktisch schwierig sein.
Wenn ich die Anzahl der Kommentare von @ChrisStratton erhöhen könnte, würde ich das 100-fach tun.
Wenn Sie sich nicht um die Einhaltung der USB-Spezifikationen kümmern, können Sie vielleicht einen STM32F405 oder F407 mit seinen dualen USB-OTG-Schnittstellen verwenden und die Software die Widerstände untersuchen lassen, um zu entscheiden, welcher Port als Geräteschnittstelle für Upstream-Berichte verwendet werden soll, und die einen sehr begrenzten Host implementieren sollte, der nur eine andere Tastatur hosten kann . Statt Software, die einen Hub emuliert, können Sie die Ereignisse Ihres Clients einfach so weitergeben, als wären es Ihre eigenen. Sie können vielleicht Pony-Power über eine Diode erhalten und dann einen FET-Schalter für echtes Passthrough aktivieren, wenn Sie der Meinung sind, dass die Bedingungen dafür sicher sind. Viel Spaß beim Programmieren :-)
Ich denke, ich habe eine mögliche Lösung gefunden, bin mir aber nicht sicher, ob dies überhaupt funktionieren würde: Könnte ich eine Diode am Vcc-Kabel des USB verwenden, um sicherzustellen, dass nur dann Strom in eine Richtung fließt, wenn er in eine Richtung geht aktiviert den Auswahlstift am IC-Schalter, so dass, wenn der Strom in eine Richtung geht, er mit einem Downstream-Port verbunden wird und wenn er in die andere geht, mit dem Upstream-Port verbunden wird?
"Ich habe eine mögliche Lösung gefunden" - nein, es ist keine Lösung. Sie können beliebige Mittel verwenden, um zu erkennen, welcher Port stromaufwärts verbunden wird, und die Stromversorgung in eine beliebige Richtung manipulieren, aber Sie können die Datenrolle dieses Ports (und aller anderen Ports) nicht einfach umkehren. Kein USB-Hub wurde so konzipiert, dass alle Ports spontan neu konfiguriert werden können. Selbst in fortschrittlicheren Netzwerklösungen wie Ethernet haben die Switches einen "speziellen" Port, "Upstream".

Antworten (3)

Stellen Sie einfach Anschlüsse auf allen Seiten bereit und lassen Sie sie den Typ Host / Gerät wechseln, je nachdem, woher die Stromversorgung kommt.

(USB-Switch-Chips verwenden)

Wenn ich keinen USB-HUB-Controller finden kann, der selbst verwaltet, welcher Port als Upstream oder Downstream verwendet wird, ist dies wahrscheinlich die beste Lösung. Danke!
Sie müssen das nicht mit analogen Schaltungen erkennen
Ich habe lange nach einem Schalter gesucht, der für meine Bedürfnisse geeignet ist, aber ich habe nichts gefunden. Kennen Sie eine Schaltung, die nützlich sein könnte?
@edoelas, suchen Sie nach "MCHP FlexConnect" -Hub-Controller-ICs
Oooh, guter Ort, aber es sieht so aus, als könnten sie nur an einem Port rollenwechseln, und das OP möchte USB-C, was die Komplikation hat, dass es einen Tanz machen muss, bevor der Strom anliegt.
USB C ist ein Anschluss, es muss USB 3.2 verwendet werden - insbesondere für eine Tastatur. 5V werden von Anfang an da sein.
@james, das OP will zu viel ohne Verständnis. Er möchte einen universellen Switch, bei dem jeder Port zu einem Upstream-Port werden kann (wenn er an einen USB-Host angeschlossen ist) und alle anderen Ports automatisch zu Downstream-Ports werden. Alle identisch aussehenden Typ-C-Anschlüsse funktionieren also ordnungsgemäß, unabhängig davon, wo ein Benutzer seinen PC einsteckt. Das ist zu viel verlangt. Es ist technisch machbar, aber so etwas gibt es nicht.

Es gibt zahlreiche Beispiele für USB-Tastaturen mit Hubs. Sie brauchen nicht die Komplexität, die Sie beschreiben.

Wenn Sie eine USB-Tastatur haben (Ihr Gerät mit nur der Hälfte der Tasten darauf), dann funktioniert es mit dem Standardtreiber … Sie können einfach nie die Tasten drücken, die darauf nicht vorhanden sind. Wenn Sie ein anderes Tastaturgerät mit der anderen Hälfte der Tasten an den USB-Anschluss Ihrer Tastatur anschließen, funktioniert dies auch, wenn Sie die anderen Tasten erhalten. Für den Tastaturtreiber spielt es keine Rolle, dass mehrere Tastaturen vorhanden sind, und die Tastenwerte werden von der 'ODER'-Logik des Treibers alle als derselbe Strom behandelt.

Sie müssen sich NICHT bewusst sein, ob es sich um einen Eingang oder einen Ausgang handelt, es handelt sich einfach um Geräte im USB-Baum, die den erforderlichen Dienst/Treiber laden.

Sie können dies selbst ausprobieren, indem Sie sich eine Tastatur mit einem USB-Hub besorgen (zum Beispiel hat diese Logitech- Tastatur Passthrough). Sie benötigen nur USB-Typ-A-Stecker an Ihren Geräten. Stecken Sie zuerst eine andere Tastatur in den Hub und Sie haben, was Sie wollen. Der Baum kann auf viele Ebenen erweitert werden (die USB-Spezifikation zitiert 7 Ebenen tief, einschließlich des Root-Hubs).

Kommentare sind nicht für längere Diskussionen gedacht; diese Konversation wurde in den Chat verschoben . Alle erzielten Schlussfolgerungen sollten wieder in die Antwort aufgenommen werden.

Es gibt eine einfache Lösung für Ihr Problem: Verwenden Sie keine Typ-C-Anschlüsse.

Da Ihre Tastatur bestenfalls ein Hochgeschwindigkeits-USB-Gerät sein wird, können Sie Typ-A- und Typ-B- (oder besser Micro-B-) Anschlüsse verwenden.

Ihre vorgeschalteten (Hub-ähnlichen) Ports haben Typ-A-Anschlüsse, und Ihre nachgeschalteten (geräteähnlichen) Ports haben Typ-B-Anschlüsse.

Da es nach den USB-Standards weder A-zu-A- noch B-zu-B-Kabel geben sollte (und die vorhandenen selten/spezialisiert sind), können Sie sich darauf verlassen, dass die einzige Art und Weise, wie die Module wahrscheinlich angeschlossen werden, die richtige Art ist.

Wenn Sie darüber nachdenken, hat ein (nicht Typ C) USB-Hub genau das gleiche Problem, das er auf genau die gleiche Weise löst.

Da Ihre Geräte wahrscheinlich nur einen Upstream-Port haben, können Sie den Benutzer auch keine Schleife machen lassen.

-- bearbeiten, da Sie sagen, dass Sie USB C verwenden möchten --

Wenn Sie entschlossen sind, USB C zu verwenden, können Sie unverlierbare Leitungen verwenden, um Ihre Upstream-Ports (unverlierbares Kabel) von Ihren Downstream-Ports (Buchse) zu unterscheiden.

Wenn Ihnen das nicht zusagt, müssen Sie feststellen, ob es sich bei dem Port um einen Upstream-Port oder einen Downstream-Port handelt, und ihn entsprechend weiterleiten. Außerdem müssen Sie mindestens eine minimale Menge an PD-Aushandlungen durchführen. Die einzigen Geräte, die ich gesehen habe, die dazu in der Lage sind, sind USB-C-Dockingstationen.

Ich würde empfehlen, nach einem Entwicklungskit für einen USB-Typ-C-Hub-Chip oder -Chipsatz zu suchen, der in der Lage ist, Ports automatisch von Upstream oder Downstream umzuschalten, dann können Sie ihnen alle blutigen Details von USB-C überlassen und mit dem Bau Ihres USB fortfahren peripher.

Wenn es Ihnen nichts ausmacht, nicht vollständig USB-C-kompatibel zu sein, ist das Minimum, mit dem Sie davonkommen könnten, ein USB 2.0-Hub, eine Art USB 2: 1-Multiplexer (ein analoger Schalter oder ein dedizierter IC, es gibt viele, um damit umzugehen Tatsächlich kann USB-C umgedreht werden), der als Multiplexer zwischen dem Upstream-Port Ihres USB 2.0 und einem seiner Downstream-Ports und einem Mikrocontroller verwendet wird, der die CC1- und CC2-Leitungen aller USB-C-Ports überwacht und Ihren einstellt Multiplexer geeignet.

Es ist ein ziemlich schwieriges Problem, aber machbar.

-- bearbeiten, nachdem keine geeigneten Entwicklungskits gefunden wurden --

Ich habe mir Cypress, Via und Semiconductor angesehen, keiner von ihnen hat ein USB-Hub-Angebot, das sowohl Upstream- als auch Downstream-USB (viele doppelte Rolle für die Stromversorgung) an einem einzigen Port bietet, also denke ich, dass Sie mit dem USB bleiben 2.0 Switch-Lösung. Was in etwa so aussehen würde:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Beachten Sie, dass in diesem Schaltplan viel fehlt, aber mit einem uP, das umschaltbare Richtung, Pull-Up- und Pull-Down-Funktionen auf seinem GPIO hat (ja, die Pull-Ups werden für die USB-C-Spezifikation nicht korrekt sein, können Sie mit einigen besser abschneiden Fet-Schalter und Widerstände mit dem richtigen Wert) können Sie bestimmen, welche Ports stromaufwärts und welche stromabwärts liegen, und entsprechend signalisieren.

Beachten Sie, wenn Sie dies implementieren, dass Sie Ihrem Sondierungsalgorithmus ein wenig Zufälligkeit hinzufügen, damit Sie nicht mit der Suche nach Ports enden, während sie versuchen, herauszufinden, ob es sich um den Upstream-Port handelt. Sie müssen etwas tun, damit alle Ports als Upstream-Ports identifiziert werden, wenn kein Strom vorhanden ist, da ein USB-C-Downstream-Port nicht eingeschaltet wird, es sei denn, er erkennt einen Upstream-Port. (Der kostengünstigste Weg, dies zu tun, wäre mit ein paar Dioden von CC1 und CC2 zu einer Schiene, die auf Null geklemmt wird, bis das System Strom hat.)

Ihr Tastatur-Controller und alle anderen Dinge, die Sie auf dem Bus anzeigen möchten, hängen an einem der (nicht gezeigten) anderen Downstream-Ports des Hubs.

-- weitere Details bearbeiten --

Beachten Sie - dies ist vereinfacht - es gibt ausgefeiltere Mechanismen, die für die Kommunikation auf den CC1/CC2-Pins und zur Anordnung der Stromversorgung verwendet werden:

Zu Beginn des Tages liefert ein USB-C-DFP (nachgeschalteter Anschluss, z. B. in Ihrem Laptop) keinen VBUS. Stattdessen zieht es die Pins CC1 und CC2 mit Rp (36k bis 3,3V oder 56k bis 5,0V) hoch.

Der UFP (stromaufwärts gerichteter Port, mit dem er verbunden ist) zieht CC1 und CC2 mit Rd (5,1k) auf Low. Das Kabel hat einen Draht für CC1/CC2 und kann auf eine von vier Arten eingesteckt werden, um CC1->CC1, CC2->CC2 oder CC1->CC2 oder CC2->CC1 zu verbinden).

Wenn der DFP-Port sieht, dass einer von CC1 oder CC2 von Rd auf Low gezogen wird, legt er Strom an.

Der Sinn dieses Designs besteht darin, dass beim Verbinden von UFP-Ports nicht beide versuchen, sich gegenseitig mit Strom zu versorgen.

Sie entwerfen Ihr Board so, dass es ohne Stromversorgung CC1 jedes USB-Anschlusses mit 5,1 k niedrig zieht und die Eingänge zu den Mosfets schwebend lässt.

Wenn ein Kabel von einem Downstream-Port (wie Ihrem Computer) angeschlossen wird, erkennt der DFP Ihren Port und signalisiert, dass es sich um einen Upstream-Port handelt, und legt die Stromversorgung an.

Der Strom fließt durch die Diode und versorgt Ihren Stromkreis mit Strom, fließt jedoch nicht durch Anschlüsse, da Ihr Mosfet deaktiviert ist. Ihr Arduino wird booten und sich alle CC-Pins ansehen, um herauszufinden, welcher Port der Upstream-Port ist, der angeschlossen wurde. Sobald dies erledigt ist, wird der Multiplexer umgeschaltet, um den D + / D- für diesen Port mit dem Upstream-Port des USB-Hubs zu verbinden.

Als nächstes zieht es alle CC-Pins an den verbleibenden Ports hoch und sucht nach genau einem von CC1 oder CC2, der auf Low gezogen wird. Wenn es sieht, dass es den Mosfet an diesem Port aktivieren und mit der Stromversorgung beginnen kann.

Möglicherweise möchten Sie eine Schaltung wie die folgende, um die einzelnen CC-Pins mit Ihrem uP zu verbinden.

schematisch

Simulieren Sie diese Schaltung

(in diesem Schema sind wieder viele weggelassen, wenn Ihr uP mit 0,1 mA fertig wird, ohne in den SCR-Latchup zu gehen, können Sie D3 weglassen.)

Wenn Ihr uP nicht mit Strom versorgt wird, legt der nachgeschaltete Anschluss (in Ihrem Computer) 5 V bis 56 k an CC1 und CC2 an. Das Kabel verbindet nur entweder CC1 oder CC2.

C1 wird aufgeladen und schaltet M1 ein (Sie müssen sicherstellen, dass M1 mit nur 0,8 V am Gate vollständig eingeschaltet ist). Dies zieht CC1 mit 5,6k herunter. Das DFP legt 5 V an Vbus an und Ihr uP schaltet sich ein.

Ihr uP ermöglicht schwache Pull-Ups auf GPIOS AC für jeden Port.

Für jede CC-Leitung (2 pro Port) schaut es auf GPIO B. Wenn es einen Port mit einem GPIO B < 1 V und dem anderen GPIO B ~ 5 V findet, kennt es es vom Upstream-Port und schaltet den Multiplexer um Verbinden Sie D+/D- mit dem Upstream-Port des Hubs.

Dann setzt es für alle anderen Ports CC-Leitungen GPIO A auf einen hochgesteuerten Ausgang (um mit der Suche nach Geräten zu beginnen) und GPIO C auf einen niedriggesteuerten Ausgang (um anzuzeigen, dass es sich um einen Downstream-Port handelt). Es scannt dann GPIO B und prüft, ob genau einer der GPIO Bs für diesen Port < 1 V ist. Wenn dies zutrifft, schaltet es den Vbus-Mosfet ein, um Strom bereitzustellen.

Wenn am ursprünglichen Upstream-Port GPIO B hoch geht, sollte das Gerät alle Mosfets deaktivieren und alle GPIOs auf hohe Impedanz einstellen und nach einem neuen Upstream-Port suchen (oder wahrscheinlicher Strom verlieren).

(Die Komplexität dieser Schaltung besteht darin, dass sie das Richtige tun kann, selbst wenn Ihr uP ausgeschaltet ist und seine Schutzdioden alle seine Eingänge auf Low ziehen.)

Ich denke, ein USB-HUB-Chip, der automatisch von Upstream auf Downstream umschalten kann, ist meine beste Option, aber ich kenne keinen solchen integrierten. Danke!
Sie sind sicherlich vorhanden, da mindestens eine HP-Dockingstation, die ich habe, über 3 USB-C-Anschlüsse verfügt, von denen jeder Upstream sein kann und der Rest auf Downstream umschaltet. Ich werde nachsehen, welchen Chipsatz sie verwendet.
Danke James, das ist die Lösung, die ich für mein Projekt verwenden werde, diese Informationen sind wirklich nützlich. Ich habe nur einen Zweifel: Was ist ein uP? Im Internet konnte ich nichts finden.
uP ist ein Mikroprozessor, Sie müssen ihn mit Code programmieren, um ihn mit den CC-Pins Ihrer Typ-C-Anschlüsse zu verbinden, und dann die verschiedenen Muxes und Netzschalter entsprechend einstellen.
Könnte ich also einen anderen Arduino verwenden oder, wenn ich genug Pins habe, den gleichen, der zur Steuerung der Tastenmatrix verwendet wird, um dies zu erreichen? Ich verstehe immer noch nicht, warum ich eine Diode und einen Mosfet verwenden muss, um VBUS mit der Stromversorgung zu verbinden, und warum ich nicht einfach eine Diode an den Pins cc1 und cc2 verwenden kann und wenn der Strom durch die Diode fließen kann, wird der Schalter aktiviert . Wenn das zu viele Fragen sind, werde ich versuchen, die Antworten auf reddit.com/r/AskElectronics zu bekommen , also machen Sie sich keine Sorgen, wenn Sie sie nicht beantworten können. Danke James.