max. Leitungslänge I2C in der Praxis?

Hallo,

wenn ich eine Modelleisenbahnplatte baue, von sagen wir mal pauschal 2mx1m, ganz grob.
Und ich an verschiedenen Stellen Attinys verbaue und per I2C an den Haupt µC anschließe,
kann das schon zu Problemen führen?
Ich könnte den Haupt µC in die Mitte setzen, dann wäre zu allen Seiten die Leitungslänge maximal 1 Meter.
I2C wurde ja nur für paar cm konzipiert. Könnte man aber vielleicht ausreizen.

Ja, wird wahrscheinlich zu Problemen führen.

Dei max Leitungslänge hängt von der Geschwindigkeit des Busses und der Kapazität des Kabels und Anzahl der Devices ab.
Grüße Uwe

Da du vermutlich nur Schaltfunktionen ausüben möchtest, kannst du die I2C-Taktfrequenz heruntersetzen und dann die Pullups auf ca. 1 k Ohm festlegen, dann sollte das problemlos funktionieren.

Ich habe hier in Versuchstaufbauten schon mit 1 M. Kabel für LCD-Ansteuerung gearbeitet. Hat auch funktioniert. Ist dann allerdings mit 4,7 k Pullup sehr empfindlich gegen Störungen.

Ich denke auch die Störungen die Motorenregelungen erzeugen sind bei Modellbahnen nicht unerheblich. Wenn du nicht mehr als 31 “Slave” Arduinos hast solltest du auch über RS485 nachdenken. Dies bekommt man auch auf einem Attiny84 über Software Serial und mit der Lib von Nick Gammon stabil zum laufen. für Ports am Attiny kann man dann noch Schieberegister packen (74HC595) oder I2C Porterweiterungen (PCF85xx)
Gruß
DerDani

Hallo,

die Attinys bekämen nur jeder 2 Hall-Sensoren verpaßt und machen die Richtungsauswertung bzw. Positionscheck. Da kommen schon paar zusammen. Ich frage dann nur noch den Status ab bei Bedarf. Durch den I2C Bus spare ich viele Pins am Haupt µC ein und könnte mir die Portexpander sparen. Die Motor- bzw. Spannungsregelung für die Loks macht weiterhin der Haupt-µC.

Wenn ich allerdings wegen der I2C Länge Portexpander/Treiber nehmen müßte, kann ich mir das auch schenken und gleich Portexpander direkt für alle Sensoren ranbammeln.

Aber mit guten Kabeln und reduzierten Takt wäre I2C möglich, entnehme ich dem jetzt. Klar, ich müßte dann nochmal testen.

Bei I2C hat eine Stern-Topologie den Nachteil, daß jeder Endpunkt mit einem Pullup terminiert werden muß. Diese Widerstände belasten dann den Sender, was auch die Signalqualität (Flankensteilheit) beeinträchtigen kann. Eigentlich sollte I2C durchgeschleift werden, mit einer Terminierung nur an den Enden des Kabels. Der Master darf dabei gerne in der Mitte des Kabels hängen.

Insofern ist die Idee mit RS-485 o.ä. nicht schlecht, man sollte dann aber bidirektionale Leitungstreiber benutzen, oder auf ein anderes Verfahren mit getrennten Hin- und Rückleitungen umsteigen.

Als Kabel möglichst was mit twisted-pair verwenden, z.B. Cat5, und mit dem definieren Wellenwiderstand terminieren. Dabei wird jede Signalleitung mit einer Masseleitung verdrillt, was Einstreuungen und Abstrahlungen reduziert. Bei differentieller Übertragung (RS-485...) werden die beiden zusammengehörenden (komplementären) Signale auf ein Leitungspaar gelegt.

Insofern ist die Idee mit RS-485 o.ä. nicht schlecht, man sollte dann aber bidirektionale Leitungstreiber benutzen, oder auf ein anderes Verfahren mit getrennten Hin- und Rückleitungen umsteigen.

Soweit ich weiß sind die meisten RS485-Treiber bidirektional du schaltest an den Treibern um zwischen Receive Enable und Transmit Enable, man muss sich natürlich schon ein paar Gedanken machen damit nicht mehrere Senden.
Lässt sich aber abfangen da man den Slaves Adressen gibt z.B.:
-also Master sendet daten an 1 danach kommt ne Rückmeldung von 1.
Dann mit der 2 Adresse und so weiter. Nix wildes.
Auch wenn es nicht so gewollt ist bei so einer kleinen Platte kann man das RS485 auch Sternförmig aufbauen und die "Abschlusswiderstände aus versehen vergessen" in meiner Erfahrung habe ich bisher keine Probleme gehabt so lange die Sterne nich wesentlich länger als 2m sind.
Funktioniert so ist aber nicht richtig, nur so als Anmerkung.
Gruß
DerDani

Das mit dem Umschalten der Transceiver funktioniert nicht so einfach. Master und Slave kommunizieren über SCL und SDA gleichzeitig, z.B. hält der Slave nach jedem Byte SCL low, bis er das Byte verarbeitet hat - das gibt dann ACK. Kann er das nicht, weil der Transceiver am Master noch auf Senden steht, gibt das NACK und die Übertragung wird abgebrochen. Sprich man müßte die ganze Hardware nachbauen, die an einem I2C Subsystem dranhängt, um die Umschaltung bzw. das Mischen der Signale aus beiden Richtungen hinzukriegen, und das wird deutlich aufwendiger als einfache I2C Repeater bzw. Level-Shifter.

DrDiettrich:
z.B. Cat5, und mit dem definieren Wellenwiderstand terminieren.

Der definierte Wellenwiderstand ist beim Cat5 in der Gegend von 50 Ohm - das wird nicht gehen.

Die Pull up Widerstände auf 1k beidseitig sollte schon einiges bringen.

Lt. Wikipedia sind es 100 Ohm Wellenwiderstand, bei beidseitiger Terminierung also tatsächlich 50 Ohm, entsprechend 100mA bei 5V, und das wäre definitiv auch für Arduinos zu viel Saft :frowning:

Kennt jemand handelsübliche twisted-pair Kabel mit höherer Impedanz, zur Verringerung der Fehlanpassung?

Ich denke eine volle Wellenwiderstandsanpassung ist bei 400kHz bzw. 100kHz überhaupt nicht notwendig - Beim Cat5 reden wir über 100Mhz und das funktioniert immer noch wenn nicht richtig abgeschlossen ist.

Das mit dem Umschalten der Transceiver funktioniert nicht so einfach. Master und Slave kommunizieren über SCL und SDA gleichzeitig, z.B. hält der Slave nach jedem Byte SCL low, bis er das Byte verarbeitet hat - das gibt dann ACK. Kann er das nicht, weil der Transceiver am Master noch auf Senden steht, gibt das NACK und die Übertragung wird abgebrochen. Sprich man müßte die ganze Hardware nachbauen, die an einem I2C Subsystem dranhängt, um die Umschaltung bzw. das Mischen der Signale aus beiden Richtungen hinzukriegen, und das wird deutlich aufwendiger als einfache I2C Repeater bzw. Level-Shifter.

Das ist I2C
Das hier ist RS485:

Soweit ich weiß sind die meisten RS485-Treiber bidirektional du schaltest an den Treibern um zwischen Receive Enable und Transmit Enable, man muss sich natürlich schon ein paar Gedanken machen damit nicht mehrere Senden.
Lässt sich aber abfangen da man den Slaves Adressen gibt z.B.:
-also Master sendet daten an 1 danach kommt ne Rückmeldung von 1.
Dann mit der 2 Adresse und so weiter. Nix wildes.
Auch wenn es nicht so gewollt ist bei so einer kleinen Platte kann man das RS485 auch Sternförmig aufbauen und die "Abschlusswiderstände aus versehen vergessen" in meiner Erfahrung habe ich bisher keine Probleme gehabt so lange die Sterne nich wesentlich länger als 2m sind.
Funktioniert so. ist aber nicht richtig, nur so als Anmerkung.

Dies kann man nicht vergleichen bei RS485 gibt es Differenzsignale A=!B.
Bei I2C kann man das wirklich nicht so einfach umschalten.
Ist ein bisschen an einander vorbei geredet/gelesen/verstanden. :grinning:
Macht aber nix :grinning:
Gruß
DerDani

Hallo,

ich komme noch nicht ganz los vom I2C. Ich könnte auch alle in Reihe hängen. Irgendwo anfangen und dann alle durchschleifen. Wäre auch kein Thema. Nur die Leitung wäre dann noch länger.
Wegen dem RS485 muß ich mal schauen. Bis jetzt nur immer davon gehört.

volvodani:
Ich denke auch die Störungen die Motorenregelungen erzeugen sind bei Modellbahnen nicht unerheblich. Wenn du nicht mehr als 31 "Slave" Arduinos hast solltest du auch über RS485 nachdenken. Dies bekommt man auch auf einem Attiny84 über Software Serial und mit der Lib von Nick Gammon stabil zum laufen. für Ports am Attiny kann man dann noch Schieberegister packen (74HC595) oder I2C Porterweiterungen (PCF85xx)
Gruß
DerDani

Wenn SOIC für dich kein Problem ist, würde ich nicht auf die Attiny84 setzen. Besser Attiny441 oder Attiny841. Haben den Vorteil, dass diese beide 2 Serielle Schnittstellen (Hardware !) haben. Kannst dann 1 Schnittstelle für den RS485 Bus nutzen. Die andere als SPI Expander oder aber als zusätzliche Debug-UART-Schnittstelle. Platz für die Hallsensoren ist dann auch noch vorhanden.
Alternativ kannst du aber auch eine UART-Schnittstelle für den RS485 Bus nutzen und die andere Serielle Schnittstelle für I2C. Dann hättest du beide Varianten zur Verfügung stehen.

Notfalls mit I2C-PortExtender arbeiten und damit die längere Strecke bedienen.

Hallo,

SOIC ist keine Thema, hab schon kleiner gelötet.
Also man klemmt einen RS485 Treiber an die RS232 Schnittstellen der Attinys und dann gehts los?
Das klingt einfach. :slight_smile:
Der Tipp mit den anderen Attiny klingt gut. Hätte sonst die 85er genommen.

Hallo,
also die Länge dürfte keine so große Rolle spielen. Das sollte mit einem Buffer zu regeln sein.
Nehmen wir einmal an, Dein Master und der letzte Slave haben einen Abstand von 2m und es funktioniert.
Nun willst Du verlängern auf 4m, das funktioniert mehr.
Dann sendest Du die Daten vom letzten Slave (4m) zu dem Slave (2m) und der dann zum Master.
Bei einer x-Leitungslänge gehen Dir doch nur die Pegel flöten, soll heißen- es kommt nichts mehr an.

Nimm doch einmal 2 Arduino´s und verbinde sie mit einem 3x0,75Ø mal 5m.
Das probierst Du, wenn´s läuft dann legst Du bei 2,50m mal eine laufende Bohrmaschine neben die Leitungen.
Ich würde das mal probieren.
Gruß und Spaß
Andreas
P.S. So wird es gemacht

Hallo,
so- praktischen SelbstVersuch durchgeführt, weil ich gerade selber mit I2C fummel.

Aduino Maga 2560<- 5,49m-0,5ø-Kabel->Arduino Uno R3 verbunden über I2C.

Keine Probleme beim hin- und her- senden der Daten. Bohrmaschine mußte selbst holen.
Gruß und Spaß
Andreas

Ich habe auch schon einen one wire DS18B20 auf 10m ungeschirmten Telefonkabel ausprobiert - hat geklappt es hat nur geringen Unterschied gegeben zwischen 3-Leiter Anschluss mit Pull up und den parasitären Zweileiteranschluss.

Hallo,

von Slave zu Slave usw. wollte ich nun wirklich nicht anfangen. Das muß wenn das zackig direkt gehen. Keine Zeit vertrödeln. Ich werde es auf jeden Fall mal testen mit einfachen Kabel. Das mit RS485 gefällt mir langsam immer besser, wenn auch teurer.

Vielen Dank erstmal für die vielen Hinweise und Ratschläge.