I2C zuverlässig über Cat5-Kabel senden

Ich überlege, ein Hausautomationssystem um meinen Raspberry Pi herum zu implementieren, aber ich fand den Preis und den Platzbedarf für das Einfügen eines Pi überall dort, wo eine gewisse Steuerung erforderlich ist, zu viel, aber die für dieses Design erforderlichen Cat5e-Kabel werden bereits während der Renovierung installiert. Ich habe einige PCF8574, PCF8591 und SSRs herumliegen, ist es also möglich, sie mit Cat5e-Kabeln zu betreiben?

Alle meine Cat5e-Kabel sind bereits mit TIA/EIA 568B-Pinbelegung verdrahtet. Sie sind Teil meiner strukturellen Verkabelung und nicht abgeschirmt, daher ist eine höhere Netzspannung erforderlich. Ich denke daran, Strom- und I2C-Leitungen mit dieser Pinbelegung über das Kabel zu senden:

Pin 1 (Pair 1): SCL+
Pin 2 (Pair 1): SCL-
Pin 3 (Pair 2): SDA+
Pin 4 (Pair 3): +12V
Pin 5 (Pair 3): +12V
Pin 6 (Pair 2): SDA-
Pin 7 (Pair 4): GND
Pin 8 (Pair 4): GND

Die Anordnung der Stromversorgungsstifte ist dieselbe wie bei der 100BASE-TX-PoE-Verkabelung, sodass die Nennleistung ebenfalls dieselbe ist, und die Verwendung von bidirektionaler Differenzsignalisierung findet sich in 1000BASE-T, das Cat5e erfordert.

Ursprüngliche I2C-SCL- und SDA-Leitungen werden in zwei bidirektionale Differentialpaare auf TTL-Pegeln abgeleitet (der Open-Drain wird nicht auf dem Kabel gehalten, sondern in dem von mir entworfenen Leitungsabschluss-/Pegelverschiebungsgerät wiederhergestellt)

Irgendwelche Vorschläge dazu? Welchen Chip sollte ich auch verwenden, um I2C-Leitungen in die Differenzsignalisierung umzuwandeln? Bitte schlagen Sie mir Chips mit DIP-Durchgangslochoption vor. Ich weiß nicht, wie man mit SMT-Sachen umgeht.

BEARBEITEN

Ich habe diesen Chip gefunden, SN65LBC180, ist er eine gute Wahl? Wie verdrahte ich es in eine bidirektionale Einheit? Wie kann man den Pegel verschieben (es ist ein BiCMOS-Teil, das einen TTL-Pegel erfordert, aber Pi fährt mit 3,3-V-CMOS-Pegeln) und ihn Open-Drain-kompatibel machen?

BEARBEITEN 2

Kommentatoren schlugen RS-485 vor, was mir akzeptabel erschien, aber dennoch müssen die beiden Differentialpaare bidirektional sein und nur zwei bidirektionale Differentialpaare. Ich nutze vorhandene Ethernet-Kabel um.

BEARBEITEN 3

Da es jemand angesprochen hat, kann ich CAN nicht verwenden. Ich kann CAN auf keinen Fall auf RPi einbauen, ohne etwas zu opfern (SPI ist von einem Touchscreen belegt, also kein SPI-zu-CAN-Konverter).

Mir ist die Einschränkung von I2C PHY bewusst, daher versuche ich im Wesentlichen, 1000BASE-T PHY daran anzupassen - bidirektionale Differenzsignalisierung für SCL- und SDA-Signale, aber darüber hinaus läuft das I2C-Protokoll.

BEARBEITEN 4

Ein neuer Chip kam zu mir: NXP P82B96, der I2C in 4 unidirektionale Leitungen aufteilt, die wiederum verwendet werden können, um durch Optoisolation (nur Pi-Seite) in SN65LBC180 einzuspeisen, um eine 8-polige langstreckentaugliche Signalisierung zu bilden. Jetzt muss ich nur noch herausfinden, wie ich Strom durch das Kabel bekomme oder wie ich feststellen kann, ob der Bus sendet, und die Paare bidirektional machen.

BEARBEITEN 5

Aus den Vorschlägen für Antworten denke ich, dass ich die Strom-Pinbelegung ein wenig ändern muss:

Pin 1 (Pair 1): SCL+
Pin 2 (Pair 1): SCL-
Pin 3 (Pair 2): SDA+
Pin 4 (Pair 3): +5V
Pin 5 (Pair 3): GND
Pin 6 (Pair 2): SDA-
Pin 7 (Pair 4): GND
Pin 8 (Pair 4): +12V

Die I2C-Differenzsignalspannung ist TTL. Die +5 V über Paar 3 kommen vom Pi, ungepuffert, aber abgesichert. Die +12 V über Paar 4 sind möglicherweise nicht vorhanden und werden nur zum Ansteuern einiger Hochleistungsgeräte verwendet. Bei Bedarf kann das Gerät seine eigene Stromversorgung verwenden und beide Schienen unverbunden hängen lassen oder seine eigene höhere Spannung liefern, aber die 5-V-Schiene verwenden.

VERGISS DAS

Die Pinbelegung ist immer noch mein ursprüngliches Design, das 802.1af-kompatibel ist.

Warum nicht RS-485? Es ist industrieller, zuverlässiger Standard.
Pi hat kein RS485 und ich möchte, dass die Schnittstellenschaltung so einfach wie möglich ist. Außerdem brauche ich PCF8574, der nach meinen Experimenten mein SSR zuverlässig mit 5 V Versorgungsspannung ansteuern kann.
Während RS-485 selbst bidirektional ist, ist es auf der Single-Ended-Seite nicht bidirektional.
@IgnacioVazquez-Abrams Ich verwende vorhandene Ethernet-Verkabelung neu ... Ich kann RS485-Schnittstellenchips verwenden, aber RS485 kann immer noch nur über die Pins 1/2 und 3/6 gesendet werden, und die Pins 4/5 und 7/8 sind immer noch eine 12-V-Stromschiene und Erdungsstifte.
Aber das macht es nicht für Ihre Zwecke geeignet.
Ein Grund dafür, dass SCL und SDA Open-Collector sind, ist, dass sie beide bidirektional sind – sie können entweder vom Master oder vom Slave auf Low getrieben werden. Wie gehen Sie damit in Ihrem Interface-Design um? Während I2C ein synchrones Protokoll ist und durch Verlangsamung und Verwendung geeigneter Filter über lange Kabel laufen kann , gibt es viel bessere Möglichkeiten für die Kabelkommunikation, wie CANbus, RS-485 oder sogar asynchrones RS-422.
Wie lang ist Ihr CAT-5-Kabel? Ich habe etwas Ähnliches mit 20 m (~ 60 Fuß) I2C-Verbindung vom Keller zur Temperaturüberwachung. Es funktioniert gut mit billigen ungeschirmten Telefonkabeln. Keine Pegelverschiebung, nur zwei 5-V-Mikrocontroller, die über i2c verbunden sind.
@Kamil Irgendwo in etwa 10 bis 30 Metern, etwas feindliche außerirdische Nebensprechumgebung. Die Kabel können jedoch zuverlässig 1000BASE-T ausführen. (und deshalb versuche ich, eine Signalisierung zu verwenden, die 1000BASE-T und 100BASE-T PoE am ähnlichsten ist)
Sie sollten I2C mit niedriger Frequenz ausprobieren und das anschließen und es einfach versuchen. Wenn Sie Reichweite haben, können Sie sehen, was auf beiden Seiten auf den SDA/SCL-Leitungen vor sich geht.
Wenn Sie beabsichtigen, Ethernet-Kabel zu verwenden, haben Sie darüber nachgedacht, nur Ethernet für die Kommunikation zu verwenden? Wenn ein Teil der Anforderung Strom und Kommunikation in einem Kabel ist, können Sie PoE verwenden.
@DaveTweed Deshalb verwende ich bidirektionale Differenzsignalisierung. Ich ziehe den Bus am entfernten Ende hoch (beendet den Open-Drain-Abschnitt) und verwende die Open-Drain-Schnittstelle auf der Controller-Seite.
@mjh2007 Ich hatte geplant, überall nur Ethernet zu verwenden, aber es stellte sich als zu teuer für mich heraus. So kam ich auf die Idee, eine ähnliche Signalisierung zu verwenden, aber ein anderes Protokoll zu verwenden - verwenden Sie die bidirektionale differenzielle Signalisierung im 1000BASE-T-Stil auf zwei Paaren und die Stromversorgung im 100BASE-T-PoE-Stil auf den anderen beiden.
@Kamil Ich habe kein Oszilloskop und ich möchte nicht, dass das Alien-Übersprechen der strukturellen Verkabelung meine I2C-Geräte durcheinander bringt. Deshalb brauche ich differenzielle Signalisierung.
Anstelle von RPIs könnten Sie die Kosten niedrig halten, indem Sie einen Mikrocontroller mit eingebautem Ethernet oder ein Spi-Ethernet-Modul verwenden und die Kabel normales Ethernet mit Poe verwenden.
@Grant Sie sind hier nicht ganz verfügbar und ziemlich teuer. Ich habe auch eine Größenbeschränkung. Ich muss das Ganze in meinen vorhandenen Schaltkasten für die strukturelle Verkabelung einbauen.
Irgendetwas falsch mit der Verwendung von CAN?
@PeterK RPi habe diese nicht und ich muss die Größe minimal halten.
Wenn Sie so fest entschlossen sind, das zu tun, was Sie ursprünglich versprochen hatten, warum sind Sie dann überhaupt hergekommen und haben danach gefragt?
@MattYoung Ich brauche einen Vorschlag zum Entwerfen des Schnittstellenmoduls, einschließlich der Pi-Seite und der Geräteseite. Die Geräteseite ist kein Bus - ein Schnittstellenmodul zu einem Gerät, und die Pi-Seite befindet sich auf einem Bus.
Brauchen Sie überhaupt ein Kommunikationsprotokoll? Was wird auf der "Geräteseite" sein? Könnten Sie die Ethernet-Kabel verwenden, um einfach Relais zu steuern, und das ganze i2c-Zeug am Ende des rpi haben?
@Grant Ich bin mir nicht sicher, wie viel Strom die Drähte halten können.
@maxthonchan Cat5-Ethernet-Kabel können 360 mA bei 50 V sicher verarbeiten ( en.wikipedia.org/wiki/Power_over_Ethernet#Power_capacity_limits ). Sie können problemlos Halbleiterrelais erhalten, die bei 3-32 V auf der Eingangsseite <10 mA ziehen, also innerhalb der sicheren Spezifikationen.

Antworten (8)

Es ist eine schlechte Idee, es mit IIC zu versuchen. IIC ist eigentlich für die Kommunikation zwischen Chips auf einer einzigen Platine gedacht. Da der maximal erforderliche Strom zum Tiefziehen einer Leitung begrenzt ist, sind die Leitungen relativ hochohmig (einige kΩ). Dies bedeutet, dass sie leicht Rauschen aufnehmen können, was ein ernstes Problem darstellt, wenn ungeschirmte Kabel in den Wänden verlegt werden, möglicherweise direkt neben Wechselstromkabeln.

Ich würde CAN dafür verwenden. CAN verwendet ein einzelnes verdrilltes Paar, das an jedem Punkt mit nur 60 Ω zusammengezogen wird, und das Signal ist differentiell. Das bedeutet, dass der größte Teil des unvermeidlichen Gleichtaktrauschens, das aufgrund der kapazitiven Kopplung aufgenommen wird, von den Empfängern ausgelöscht werden kann. CAN mit 500 kbit/s kann die Größe eines gewöhnlichen Hauses abdecken.

Heutzutage sind viele Mikrocontroller mit integriertem CAN erhältlich. Normalerweise benötigen Sie einen separaten physischen Transceiver-Chip (wie den üblichen MCP2551), aber die untersten Schichten des Protokolls sind in Silizium im CAN-Peripheriegerät implementiert. Die Firmware interagiert mit dem CAN-Bus auf der Ebene des Sendens und Empfangens vollständiger Pakete. Die Kollisionserkennung und Wiederholung, Prüfsummengenerierung, Details der Buspaketsignalisierung, empfangene Prüfsummenvalidierung und Taktdriftanpassung werden für Sie erledigt.

Fallen Sie nicht auf RS-485 herein. Das ist ein Relikt aus einer vergangenen Zeit. Es verwendet auch ein einzelnes Differenzsignal wie CAN und hat daher auch eine gute Störfestigkeit. Die Leute fallen jedoch normalerweise auf RS-485 herein, weil es "einfacher" aussieht. Dies liegt nur daran, dass sie nicht das gesamte System betrachten. Erstens ist es elektrisch nicht wirklich weniger komplex. Sie benötigen immer noch eine Art Transceiver, um das Differenzsignal zu steuern und zu empfangen. Ob Sie einen RS-485-Transceiver an den UART des Mikrocontrollers oder einen MCP2551 an das CAN-Peripheriegerät angeschlossen haben, ist in Bezug auf Kosten und Hardwarekomplexität ziemlich irrelevant. Der große Unterschied besteht darin, dass Sie bei RS-485 auf der Rohbyteebene (über den UART) bleiben. Das bedeutet, um ein sinnvolles und robustes System zu implementieren, müssen Sie Ihr eigenes Protokoll für die Kollisionserkennung erfinden. Entscheiden Sie, wie Wiederholungen, Paketierung, Prüfsummengenerierung und -prüfung, Flusskontrolle usw. gehandhabt werden. Sie können eine einzige Master-Architektur verwenden, aber die richtigen Details zu finden, ist viel schwieriger als die Leute denken, die sie nicht alle sorgfältig analysiert haben. Mit CAN senden und empfangen Sie einfach Pakete, und die Hardware kümmert sich um die Details.

Ich habe kein CAN in RPi eingebaut, ich habe keine CAN-Schnittstelle, ich kann sie mir nicht leisten und ich kann sie nicht in bestehende Gehäuse einbauen. Also KEIN KANN. Ich konvertiere IIC hin und her zur differentiellen Signalisierung, um genau diese Gefahr des Übersprechens und des Widerstands zu vermeiden. Die Konvertierung und das IIC-Gerät teilen sich eine einzige Platine.
@Max: Ein Mikrocontroller mit CAN ist billiger, kleiner und benötigt weniger Strom als ein RPi. Wenn es sich bei diesen Knoten hauptsächlich um Sensoren und ähnliches handelt, ist ein RPi sowieso übertrieben.
uCs verfügen nicht über ausreichende Rechenleistung, um die andere Seite des Systems auszuführen. Obwohl ich einen Touchscreen auf dem System habe, der nur zum Überschreiben im Notfall dient, werden alle Befehle über das Heimnetzwerk über HTTP (mit einer ziemlich schicken AJAX-gesteuerten Benutzeroberfläche) an den Pi gesendet, und Pi kümmert sich um die gesamte Authentifizierung und andere Dinge.
@MaxthonChan Sie können billige Controller-ICs erhalten, die CAN in SPI und / oder I2C konvertieren, um eine Schnittstelle mit Ihrem RasPI herzustellen. Beispiel von Microchip .
Wenn das Ihr Vorschlag ist, sagen Sie mir bitte, wie kann ich mein SSR fahren? Derzeit habe ich ein Empfangsboard mit dem Diff-Schnittstellenchip, einem 7805 und einem PCF8574, und es treibt bis zu 8 SSRs an. (und normalerweise habe ich zwei oder drei)
@PeterK Bitte schlagen Sie einige I2C-Beispiele vor, wenn Sie versuchen, mich dazu zu bringen, die Drähte für die Übertragung von CAN-Signalen umzufunktionieren. Ich habe keine freien SPI-Bus-Steckplätze zur Verfügung.
Am Ende habe ich CAN PHY verwendet, aber nicht das Protokoll selbst. Das Protokoll ist jedoch immer noch I2C.
@OlinLathrop Würden Sie denken, dass CAN für einen Aufzug für etwa 16 Stockwerke geeignet ist? Das CAN würde hauptsächlich zum Protokollieren von Anrufen aus dem Auto oder jeder Landung verwendet. Ich möchte den Thread nicht ablenken, sondern nur nach einer "Bauchgefühl" -Antwort suchen.
@EmbSysDev Das ist nicht mein Anwendungsfall - ich habe eine klare Definition von Master- und Slave-Geräten: Der Pi ist der Busmaster, der Anweisungen über das Internet empfängt, authentifiziert und an den Bus weiterleitet. Der modifizierte Schalter (oder Lichtdimmer) ist ein Slave, der die eigentliche Arbeit ausführt (Schalten eines SSR usw.), wenn er eine an ihn gerichtete Anweisung erhält. Ich denke nicht, dass CAN hier angemessen ist, aber I2C ist es. I2C hat seine eigenen Probleme (lange Drähte mit hartem Alien-Übersprechen) und das versuche ich zu überwinden.
@Maxt: Wenn Sie das tun möchten (ein Hauptcontroller mit mehreren kleinen Geräten), sehe ich das Problem mit CAN wirklich nicht. Sie verbinden das RPi einmal mit dem CAN-Bus, dann ist jeder Slave recht einfach und klein. Sie können entweder das RPi mit einem CAN-Mikro sprechen lassen oder den Bus direkt mit etwas wie einem MCP2515 (CAN-Controller mit SPI-Schnittstelle) steuern. Wenn das RPi kein SPI hat, können Sie es immer noch mit 4 E / A-Leitungen schlagen. Ich denke, Sie werden flockige Probleme mit dem IIC-Bus haben, wie Sie vorschlagen.
@OlinLathrop habe bereits die Dokumentation und Forenbeiträge zum Bit-Banging-CAN auch mit einem PHY-Chip gelesen - unmöglich, wenn das System aufgrund von Timing-Jitter Multitasking betreibt - was auf meinem Pi erforderlich ist, da es auch authentifiziert (Kryptografiearbeit, CPU-intensiv) und Weiterleitungshinweise. SPI und UART sind belegt, daher ist nur I2C mit Hardwareunterstützung verfügbar, um Jitter zu vermeiden.
@OlinLathrop Außerdem habe ich eine Größenbeschränkung: 5 cm x 5 cm x 3 cm max. Andernfalls passt es nicht in vorhandene Vorrichtungen. Ich kann ein Board mit vier oder fünf Chips herstellen, die in diese Einschränkung passen und mit dem I2C-Protokoll (wahrscheinlich CAN PHY) arbeiten.
@OlinLathrop Sie sollten meine eigene Antwort lesen, die so ziemlich mein endgültiges Design ist. Verwenden Sie CAN PHY, um das I2C-Protokoll zu senden. NXP hat einen Chip, der den I2C-Bus in zwei Paare von UART-Leitungen aufteilt, die wiederum als zwei differentielle Paare über CAN PHY übertragen werden können. Dieses Design existiert sogar in NXP ANs.
@OlinLathrop Die Schnittstelle besteht aus nur drei Chips (sieben, wenn Optokoppler erforderlich sind, nur auf der Pi-Seite, die keine Größenbeschränkung haben), sodass dies ein extrem kleines Slave-seitiges Gerät mit 4 Chips ergibt.

I2C ist nicht der richtige Weg. CAN-Transceiver kosten jeweils einen Dollar, und Sie können sie als Uart-Transceiver verwenden und Ihr eigenes Protokoll schreiben, sodass Sie kein Can-kompatibles Mikro benötigen oder nicht den vollen Can-Stack verwenden möchten.

Ich fühle mich immer etwas unwohl, wenn ich sehe, dass Cat5-Leiter für mehr Strom parallel laufen. Es stört mich, denn wenn ein Leiter bricht, führt der andere den vollen Systemstrom. Die Cat5-Stromwerte sind sehr konservativ, daher ist die Wahrscheinlichkeit eines Brandes ziemlich gering, aber ich mag die Möglichkeit einfach nicht.

Der sichere Weg, dies zu tun, besteht darin, eine Mehrfachsicherung an beiden Stromschienen anzubringen und die Erdung an der Versorgung zu verbinden und jedes Gerät mit einem und nur einem Strom-/Erdungssatz zu verbinden. Auf diese Weise verlieren die Geräte, die diese Leitung verwenden, Strom, wenn ein Draht ausfällt, anstatt dass eine Leitung gezwungen wird, die Leistung von zwei zu übertragen.

Viele Leute legen aus EMI-Gründen gerne Strom und Masse in beide verdrillten Paare, anstatt ein Strompaar und ein Erdungspaar zu haben. Wenn Sie zwei Strom/Masse-Paare haben, liegt die Stromleitung näher am Boden, und die Felder heben sich auf, wodurch alle gesendeten oder empfangenen Funkwellen von den Stromleitungen reduziert werden. Unnötig, aber schön, wenn viel elektrisches Rauschen herumsurrt.

12 V sind meiner Meinung nach zu niedrig für die Stromverteilung, wenn 24 V noch einigermaßen sicher und viel effizienter sind.

Meine Lösung basiert irgendwie darauf. Ich verwende den NXP-Splitterchip, um den I2C-Bus in ein Paar Tx/Rxs (sowohl SDA als auch SCL) aufzuteilen und sie als UART mit CAN-Schnittstellenchips zu multiplexen. Dies gibt mir zwei Twisted Pairs mit I2C SDA- und SCL-Leitungen, die mit den Cat5e TIA/EIA568B-Pins 1/2 und 3/6 verdrahtet sind.
Das sollte auch funktionieren, das einzige Problem ist, dass Sie Ihren NXP-Chip, zwei Can-Transceiver und Ihren eigentlichen i2c-E / A-Chip benötigen. Das sind fünf Chips pro Board, und zuletzt habe ich überprüft, dass der NXP-Chip teurer war als bei atmega328, aber das könnte sich geändert haben. Es wird funktionieren und die Programmierung wird einfach sein, weil es i2c ist, aber die Verwendung von UART über CAN ist für etwas mehr Arbeit billiger.
Die Pi-seitige Schnittstellenplatine hat 7 Chips - NXP I2C Buffer/Splitter, zwei CAN PHY und vier Optoisolatoren. Auf der Geräteseite befindet sich ein 4-Chip-Modul – NXP I2C Buffer/Splitter, zwei CAN PHY und der PCF8574/8591.
Ich habe einen 4-Kanal-Optokoppler gefunden, der die Pi-seitige Schaltung auf ein 4-Chip-Modul reduziert.
Ich habe die Power-Pins überarbeitet und bleibe bei meinem ursprünglichen Design, wobei ich ein Power-Pair und ein Ground-Pair verwende. Das ist kompatibel zu 802.3af, obwohl ich Signalpins auf SCL und SDA umdefiniert habe.

Wenn die Automatisierung einfach Dinge im Haus ein- und ausschaltet, würde ich dies vereinfachen durch:

  • Halten Sie alle "Gehirne" an einem Ort. Verwenden Sie bei Bedarf I2C-E / A-Expander, aber behalten Sie sie alle beim Himbeer-Pi. Sie benötigen auch geeignete Hardware, um sicherzustellen, dass Sie nicht versuchen, zu viel Strom von den GPIO-Pins des Pi zu erhalten.
  • Verwenden Sie die Ethernet-Kabel, um einfach Relais anzusteuern. Sie können Ihre eigene Platine bauen oder schalttafelmontierbare 120/240-V-Halbleiterrelais erhalten, die in einem Schaltkasten montiert werden. Die Drähte in Cat5-Ethernet-Kabeln können jeweils bis zu 50 V bei 320 mA verarbeiten, was mehr als genug ist, um ein Relais anzusteuern. Tatsächlich könnten Sie 7 Relais von einem einzigen Kabel (plus einem Draht für Masse) ansteuern. Oder lassen Sie einen Draht für einen ungeschalteten 12-V-Ausgang, damit Sie auch einen manuellen Schalter installieren können. Wenn es sich um wirklich lange Läufe handelt, müssen Sie möglicherweise einen Spannungsabfall berücksichtigen, aber Sie können Relais erhalten, die bei 3-32 V schalten. 12V sollten auch bei Spannungsabfall mehr als ausreichen.
  • Sie sollten auch die örtlichen Bauvorschriften konsultieren, um Ratschläge zum Mischen von Hoch- und Niederspannungskabeln in derselben Box zu erhalten.
  • Einfache Schalter können auch über die Ethernet-Kabel erfolgen, wiederum bis zu 7 pro Kabel, und einfach mit den Eingängen des Pi verdrahtet werden. Bei sehr langen Kabeln kann ein Spannungsabfall ein Problem darstellen.
  • Sie können auch Optoisolatoren verwenden, um den Pi vor Beschädigungen zu schützen.
  • Verwenden Sie für die wenigen Geräte, die mehr als ein Relais benötigen (z. B. ein Bedienfeld), die Ethernet-Kabel als eigentliches Ethernet. Es sollte kein großer Aufwand sein, wenn es nicht viele dieser Geräte gibt. Sie könnten entweder ein anderer Pi oder ein Mikrocontroller mit Ethernet sein.
Ich bin mir nicht ganz sicher, wie sich die Bedürfnisse meiner Endbenutzer entwickeln werden. Sie ist launisch und ändert ihre Meinung sehr schnell. Ich muss in der Lage sein, schnell genug zu reagieren. Aus diesem Grund wird eine Art Basisprotokoll (hier I2C) über das Kabel verwendet.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

EUREKA! Herausgefunden! (ungetestet, werde es am wochenende testen)

Die Schnittstellenchips sind NXP P82B96 I2C-Puffer/Splitter und 2 TI SN65HVD251P CAN-Bus-Schnittstellenchips. Im Wesentlichen betreibe ich I2C auf CAN PHY.

P82B96 versteht das I2C-Protokoll und übernimmt die Busarbitrierung für mich und gibt mir separate Tx- und Rx-Pins, die miteinander verbunden werden können. Ich füge diese in den CAN-Transceiver SN65HVD251P ein und er gibt mir das bidirektionale Differenzpaar, das ich über Drähte senden kann.

Power-Pins kommen direkt, ungepuffert von der 5V-Schiene meines Pi. (Ich werde für eine Weile keine 12-V-Signalspannung und -leistung verwenden)

Tut mir leid aber nein. Damit können Sie zwei I2C-Einheiten in einiger Entfernung voneinander verbinden. Sie können nicht mehr als 2 verbinden.
@WhatRoughBeast Ich habe das in der NXP-Dokumentation nachgeschlagen und es heißt, dass dies eine praktikable Lösung ist (und es irgendwie in ihr AN gelangt ist), aber für mich ist ein Punkt-zu-Punkt in Ordnung, da mein Design selbst danach verlangt Paar Konvertierungseinheiten pro Cat5e-Segment.
CAN ist wie i2c wired-or und bidirektional. Ich sehe keinen Grund, dass dies nicht mit beliebig vielen Geräten am Bus funktionieren sollte. Ich habe die App nicht gesehen, die er erwähnt. Es scheint einen Bus zu beschreiben, keinen Punkt zu Punkt.
@WhatRoughBeast - CAN ist Multidrop, ich habe mir nicht allzu genau angesehen, was das OP tut, aber es sollte theoretisch möglich sein.

Ungeachtet der Vorzüge von IIC auf Chipebene wird Ihre vorgeschlagene Implementierung sehr schwierig sein. Das Problem ist die Busarbitrierung. Obwohl mehrere Einheiten parallel geschaltet werden können, z. B. über RS485, stellt sich die große Frage:

Woher weiß eine Einheit, ob sie die Kontrolle über den Bus übernehmen kann, um Daten zu senden?

In IIC ist die bidirektionale Übertragung mit Open-Drain-Signalleitungen einfach - aber bei Tristate-Bussen muss sichergestellt werden, dass jeweils nur eine Einheit versucht, den Bus zu steuern. Das wird schwierig. Sie können dies tun, insbesondere wenn Sie einen einzelnen Master einrichten und verlangen, dass alle Slaves strenge zeitliche Einschränkungen beim Senden von Daten haben und dass sie nur Daten senden, wenn sie vom Master angefordert werden Schnittstellenkarten für den Master und die Slaves.

Was physische Treiber/Empfänger betrifft, reicht RS485 aus, und es sind viele Schnittstellenchips verfügbar. Nur Google.

Ich weiß nicht, ob Sie an einer vorgefertigten Lösung interessiert sind, anstatt Ihre eigene Schaltung zu bauen, aber ich dachte, ich möchte darauf hinweisen, dass Pololu diese von SJTbits hergestellten I²C-Langstrecken-Differential-Extender- Boards verkauft, die ziemlich genau zu funktionieren scheinen was suchst du. (Vollständige Offenlegung: Ich arbeite für Pololu.)

Auch wenn Sie es nicht direkt verwenden möchten, kann Ihnen ein Blick auf die verwendete Schaltung vielleicht einige Ideen geben. Sie können das Schema im Datenblatt sehen; Es verwendet einen NXP PCA9600D-Puffer, einen TI AM26LS31CDR-Differentialleitungstreiber und einen TI AM26LS32ACDR-Differentialleitungsempfänger.

Das funktioniert bei mir nicht. Ich muss sowohl Bussignal als auch Strom durch die Drähte senden.

Ich weiß, das ist ein bisschen alt und eine Lösung scheint irgendwo zwischen den Antworten gefunden worden zu sein, aber ich hatte diesen Vorschlag anzubieten. Es gibt Geräte wie den PCA9614/5/6 von NXP, die ich gerade als Lösung für einen robusteren Langstrecken-I2C-Bus (PCA9614 2-Kanal-Mehrpunkt-Fast-Mode Plus-Differential-I2C-Bus-Puffer) betrachte . Im Wesentlichen stimmt es, dass es etwas anderes als echtes I2C wird, aber an den Enden des Busses ist es für die Geräte unsichtbar. Diese spezielle Familie übersetzt die Signale in 2 bidirektionale Differenzpaare, und es gibt auch ähnliche Geräte, die bereits in den Kommentaren erwähnt wurden, die in 4 unidirektionale Differenzpaare übersetzen. Durch die Übersetzung auf nur 2 Paare können Sie CAT-Kabel verwenden und haben immer noch 2 Paare für Strom/Masse.

Daumen hoch! Ich versuche gerade, so ziemlich das gleiche Problem zu lösen. Ich versuche auch, I2C über Cat5 für die Heimautomatisierung mit meiner benutzerdefinierten Pinbelegung zu verwenden. Der Grund sind die Kosten, ich möchte, dass es sehr kostengünstig ist und I2C-Komponenten immer noch mindestens 5-mal billiger sind als sogar attiny13 uC (AFAIU uC ist für CAN und RS485 erforderlich).

1) Momentan bin ich gerade dabei, den ersten Teil eines Systems zu testen und jetzt habe ich Erfolg mit 15m langem Kabel mit 5V und direkter SCL&SDA-Verbindung! Ich verwende PCF8574 und 2 Relais, um meine Raumbeleuchtung auszulösen. Pinbelegung ist

1
2 INT
3 +5V
4 SCL
5 SDA
6 GND
7
8

2) Ich verstehe, dass es sich nicht ein paar weitere Relais oder zusätzliche 10 Meter leisten wird ... Ein Spannungsabfall ist erheblich (von 5,5 auf 4,7). Für das Spannungsabfallproblem werde ich stattdessen 12 V auf eine Leitung legen und 5-V-Spannungsregler auf den Platinen hinzufügen, um unabhängig vom gesamten Leitungsabfall überall eine feine Spannung aufrechtzuerhalten. Ich werde in den zukünftigen Linien sowieso zusätzliche Netzteile einbauen.

3) Das Signal selbst kann mit P82B96 oder billigem P82B715 verbessert werden, ohne auf differentielle Leitungen aufzuteilen. Ein NXP selbst verwendet Cat5 in einigen Präsentationen, aber ich kann ihre Pinbelegung nicht finden. Ein wichtiger Teil hier ist, dass sie eindeutig Signalleitungen in verschiedenen Paaren verwenden ... zB ein Paar ist GND + SDA, das andere ist VCC + SCL.

4) Ein weiterer interessanter Punkt - diese Puffer können einfach eine Amplitude auf bis zu 12 V erhöhen, um den Rauschwiderstand zu erhöhen. Also werde ich wahrscheinlich versuchen, 12 V auch an Signalleitungen anzulegen, und das sollte es ermöglichen, Klimmzüge direkt von 12 V-Kabeln anzulegen ... Aber das wird mich zwingen, so etwas wie P82B96 auf jedes Gerät zu setzen.

Wie Sie vielleicht bemerkt haben, verwende ich auch eine separate Interrupt-Leitung ... Der Master befindet sich derzeit auf dem Arduino-Board, das mit dem PC verbunden ist. Die primäre Master-Software befindet sich sowieso auf einem 24x7-PC, sodass Arduino nur das Signal übersetzt und Interrupts verarbeitet. Ich kann eine spezifische Konfiguration für die Onboard-Interrupt-Behandlung senden, z. B. um das bequeme Umschalten des Schalters über den Interrupt zu handhaben ... Dadurch kann ich alle Verzögerungen beim manuellen Umschalten des Lichts vergessen. Interrupt-Handling ist ein weiterer Vorteil von i2c.

Meine Idee ist also, dass I2C einfach genug ist, um in der Verkabelung von <= 100 m Stadtwohnungen anwendbar zu sein. Anstatt zum Differenzsignal zu wechseln, hoffe ich, dass ich stattdessen die zusätzliche Frequenz reduzieren kann.

Ich mag Ihre Idee, sowohl 5 V als auch 12 V zu verwenden, da dies den Bedarf an Reglern und die Kosten senkt ... die ganze Idee des Mehrdrahtbusses, um die Kosten für Endpunkte zu senken, ich werde dies auch für eine neue Pinbelegung in Betracht ziehen :)

Dies ist eher ein ausführlicher Kommentar zu der Frage als eine Antwort, da Ihre Situation nicht mit der des OP identisch ist: andere Master-Hardware, anderes Signalisierungsschema. Aber es ist so eng verwandt, dass ich es so stehen lassen werde.