ZUSAMMENFASSUNG:
Hier ist, was funktioniert:
Raspberry Pi (I²C) <-> 1 m Kabel <-> Sensor (I²C)
Folgendes versuche ich zu tun (funktioniert nicht, daher Frage):
Raspberry Pi (I²C) <-> 30 m Kabel <-> Sensor (I²C)
Die zu lösende "Gleichung" lautet also:
Raspberry Pi (I²C, SPI und andere) <-> X <-> 30 m Kabel <-> Y <-> Sensor (I²C/SPI)
Löse nach X und Y auf
DETAIL:
Ich arbeite mit einer Reihe von Sensoren, die in einem Sternnetzwerk / einer Sterntopologie konfiguriert sind.
Als zentraler „Hub“ dient ein Raspberry Pi Zero, an dem alle Sensordaten gesammelt und verarbeitet werden. Alle Sensoren sind gleich und verwenden ein I²C-Protokoll (sie bieten auch eine SPI-Bus-Schnittstelle). Abgesehen davon habe ich derzeit einen I²C-Multiplexer an den Raspberry Pi Zero angeschlossen, um mehrere Geräte zu aktivieren, die mit derselben I²C-Hardwareadresse konfiguriert sind. Alle Sensoren sind über ein abgeschirmtes 26/4-Kabel mit dem Raspberry Pi Zero verbunden. Aktuell funktioniert alles wie vorgesehen.
Nachdem ich den Machbarkeitsnachweis erbracht habe, möchte ich nun die Reichweite des Sternnetzwerks/der Sterntopologie um 20–30 m auf jeder Sensor-Hub-Verbindung erweitern. Ich dachte, ich könnte einfach längere Kabel verwenden, aber anscheinend begrenzt das I²C-Protokoll die Länge der Kabelverlängerung. Ich habe verschiedene Tricks / Lösungen gelesen , wie man die Länge verlängern kann, z. B. die Frequenz verringern, Widerstände ändern usw.
Ich werde ehrlich sein; Ich bin kein Elektroingenieur, daher scheinen einige dieser Dinge etwas fortgeschrittener zu sein, und ich habe nicht wirklich das Wissen oder die Werkzeuge, um die Wirksamkeit dieser Art von Auseinandersetzungen zu beurteilen.
Wie auch immer, ich habe etwas gegraben und verschiedene Chips gefunden, die ich möglicherweise eher als "Plug-and-Play" -Lösung implementieren kann. Abgesehen davon stammt ein Großteil des Materials, das ich gelesen habe, von vor Jahren, und ich weiß nicht, ob diese Lösungen noch brauchbar sind. Hier sind die Chips, die ich gefunden habe
Beim Vergleich der beiden habe ich gelesen, dass der erste Punkt vielseitiger ist. Ich habe auch gelesen, dass der zweite Artikel älter ist und viel Strom benötigt , was Remote-Bereitstellungen (batteriebetrieben) weniger praktisch macht. Ich bin kürzlich auf eine andere Lösung gestoßen, bei der Sie einen I²C-zu-1-Draht-Konverter verwenden , da das 1-Draht-Protokoll nicht so empfindlich auf eine Zunahme der Drahtlänge reagiert
Dies scheint eine mögliche Lösung zu sein, aber ich habe nicht viel darüber gehört, dass es von anderen verwendet wird. Die einzige Informationsquelle, die ich bekam, war die Firmenwebseite und Videos. Wenn ich das Datenblatt richtig gelesen habe, benötigt die Lösung auch nicht viel Strom. Ich frage mich, ob andere kaufen, was sie verkaufen, und ob es funktioniert?
Wie auch immer, ich bin kein Elektroingenieur, also könnte ich wirklich einen Rat gebrauchen. Es scheint, als ob das I²C-Protokoll das ist, was viele Sensoren verwenden (zumindest der DIY-Embedded-Markt), also nehme ich an, dass ich nicht der Einzige bin, der mit dem Problem der Erweiterung der I²C-Kommunikation konfrontiert ist .
Hier sind meine Lösungsanforderungen:
BEARBEITEN: Ich habe am Wochenende etwas mehr gegraben und bin auf diesen Chipsatz (MCP25 *) gestoßen, der wie eine CAN-zu-SPI-Schnittstelle klingt. DAS WIRD NICHT FUNKTIONIEREN ... SIEHE @Maples Kommentare unten.Ich sage sicherlich nicht, dass dies der einzige Chipsatz ist, der diese Konvertierung anbietet, es ist nur der erste, auf den ich gestoßen bin. Die Sensoren, die ich verwende, haben eine SPI-Bus-Schnittstelle, also denke ich, dass ich vielleicht einen dieser Chips direkt an jeden Sensor anschließen kann? Ich habe in meiner Sterntopologie nur 5 Sensorknoten mit dem Raspberry Pi verbunden, daher glaube ich, dass ich mich innerhalb der Beschränkungen für die Anzahl der Knoten befinde, die der CAN-Bus unterstützen kann. Die Frage wäre dann, wie man den Rest des Busses konfiguriert. Würde ich einfach ein Ende eines Cat-5-Kabels an einen der CAN-to-SPI-Chips anschließen? Das Kabel würde dann 20-30 m zum Raspberry Pi verlaufen. Könnte ich dann einen weiteren Chip am Raspberry Pi hinzufügen, um die Konvertierung zu "invertieren" und mit dem Raspberry Pi zu kommunizieren? Gibt es eine Möglichkeit, alle fünf Knoten mit derselben Schnittstelle/einem Chip zu verbinden? ich nicht Ich glaube nicht, dass der Raspberry Pi eine native CAN-Bus-Unterstützung hat, aber offensichtlich SPI (ich denke, Sie können nur zwei Geräte anschließen?). Wenn diese Chips auf den Sensorknoten hinzugefügt werden könnten, was wäre erforderlich, um den Raspberry Pi anzuschließen?
EDIT_2: Nachdem ich weitere Erkenntnisse aus dem Feedback aller gesammelt hatte (danke), beschloss ich, weiter zu graben. Kein Wunder, dass ich auf eine weitere mögliche Lösung gestoßen bin! Ich habe die Kommentare zu einem der Links gelesen, auf die ich oben hingewiesen habe , und jemand hat einen PCA9615-Chip erwähnt . Eine schnelle Google-Suche auf diesem Chip führt zu "Differential-I²C". Aus Laiensicht klingt das nach einer Lösung, bei der ich meine Software nicht ändern müsste. Abgesehen davon kenne ich die Vor- und Nachteile nicht vollständig oder ob es meine drei aufgeführten Anforderungen erfüllt. Ich werde das Datenblatt weiter lesen, aber wenn jemand Feedback zu dieser Lösung hat, bin ich ganz Ohr!
Die Onewire-Lösung mit dem DS28E17 ist diejenige, die meistens out of the box funktioniert. Sie können sogar den Bitbanging-Host (z. B. auf GPIO4) verwenden und kommen fast ohne zusätzliche Hardware aus. Jeder DS28E17 auf dem Bus erscheint automatisch als I²C-Hostadapter, es sind keine Softwareänderungen erforderlich. Nachteile:
Vergessen Sie den DS2484 hinter einer DS28E17- Idee. Das gleicht einfach den Overhead aus, so dass das Senden einiger Bytes ungefähr eine Sekunde dauert. (DS28E17 hinter einem DS2484 oder DS2482-800 ist im Gegensatz dazu die beabsichtigte Verwendung und vermeidet Bitbanging.)
Der Grund dafür, dass der Chip noch nicht viel von anderen Leuten verwendet wird, ist, dass er erst 2016 herauskam und der Linux-Treiber erst seit Kernel 4.15 verfügbar ist.
(Und eine Warnung: Der DS28E17 ist ein reines 3,3-V-Gerät.)
Ich vermute, dass es andere Arten von I2C-Extendern gibt, aber ich kenne nur zwei - Puffer (wie PCA9605, P82B715) und Splitter (wie PCA9600, P82B96). Sie alle wurden entwickelt, um eine höhere Buskapazität der langen Leitungen zu isolieren, indem sie die Senkenfähigkeit der Ausgänge erhöhen. Es scheint, dass sich die Puffer jetzt alle dem EOL nähern.
Beachten Sie jedoch, dass eine Erhöhung der Senkfähigkeit im Grunde eine Erhöhung der Ströme bedeutet, was nicht gut mit Ihrer Anforderung eines geringen Stromverbrauchs verheißt.
Es gibt viele Anwendungshinweise, die ich zum Lesen empfehlen würde, wie bereits von @ali-chen AN11084 oder AN11075 , AN10658 vorgeschlagen . Interessant ist jedoch, dass selbst diejenigen von ihnen, die Twisted Pair in ihrer Topologie verwenden, immer noch auf Single-Ended-Signalisierung angewiesen sind. Ich bin mir ziemlich sicher, dass jeder Anwendungshinweis oder jedes Gerät, das Sie wählen würden, gut funktionieren sollte.
Was ich jedoch vorschlagen möchte, ist, sich zuerst dieses Gerät anzusehen . Sie beschreiben es als "PCA9600 Extender". Wie auch immer tief in der technischen Beschreibung vergraben, finden Sie eine clevere Verwendung des CAN-Transceiver-Chips PCA82C251 , um I2C-Signale (aufgeteilt auf Tx, Rx durch PCA9600) in Differenzsignale umzuwandeln.
Das Obige hat bereits ohne Abschirmung den Vorteil einer hohen Störfestigkeit. Und es kann Ihnen eine Hochgeschwindigkeitskommunikation über 100 m Entfernung ermöglichen. Aber hier ist ein weiterer Trick für Sie: Der CAN-Bus kann bei 3,3 V mit der gleichen Geschwindigkeit und Zuverlässigkeit wie bei 5 V arbeiten und gleichzeitig den Stromverbrauch um mehr als 50 % reduzieren. Ich denke, das rechtfertigt einen genaueren Blick auf Ihre Anwendung.
Dieser NXP-Hinweis skizziert Methoden, um das I2C-Bussystem auf eine Länge von über 300 m bei 60 kbit/s zu bringen, AN11084 . Die Lösungen umfassen verdrillte Leitungen, PCA9605-Repeater und verzögerungserzeugende Logik an jedem Slave. Viel Glück.
Ich plädiere auch dafür, sich das anzuschauen . https://en.m.wikipedia.org/wiki/Low-voltage_differential_signaling
Es ist immun gegen Gleichtaktrauschen, unabhängig von der Masseverbindung und läuft auch problemlos einige 10 s von Metern und bietet dennoch eine hohe Bitrate im Vergleich zum I2C-Standard.
Wenn Sie die Schaltpläne oder das Blockdiagramm der beabsichtigten Verbindung bereitstellen können, kann ein besseres Schema ausgearbeitet werden, um den Stromverbrauch weiter zu senken.
M LVDS (Multi-LVDS) kann der richtige Kandidat sein. Sie können einzelne Kanäle für I2C-Takt und Daten verwenden.
Die Datenleitung ist bidirektional, kann aber über Arbitrierung gehandhabt werden.
Nick Alexejew
Ale..chenski
Tony Stewart EE75
Das ist RightJack
Ahorn
Das ist RightJack
Ahorn
Ahorn
Ahorn