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.
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:
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.
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)
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).
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:
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.
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.)
jsotola
Ale..chenski
Fredled
Fredled
Chris Stratton
Michael Karas
Chris Stratton
edolas
Ale..chenski